Python数据分析

引言

就数据产品经理岗位而言,核心有用的是能掌握pandas的数据分析,数据科学相关,所以学习主要是这两大块:

  1. python的基础知识

  2. python中pandas模块知识

本章是python基础知识

主要就是按如下结构

  • 基础知识

    • 01-数据类型和变量

    • 02-输入和输出

    • 03-条件判断

    • 04-循环控制

    • 05-列表和元组

    • 06-字典和集合

    • 07-函数与模块

    • 08-文件处理

01-数据类型和变量

"""D1:变量与数据类型核心知识变量命名规则(禁止关键字,如class)数据类型:int/float/str/bool类型转换:int("123") → 123练习任务计算圆的面积(输入半径,输出面积,保留2位小数)实现字符串拼接:"2023-09-01" → "2023年09月01日""""from decimal import Decimal, getcontextgetcontext().prec = 28#关于整数 intm=23n= -1s= 0print(m*3+n*3+s*3)#关于浮点数 floatfo=5.541te=45.568jie=fo+teprint(jie)#输出结果是51.108999999999995,浮点数在计算机种存储时存在精度限制,这意味着某些浮点数无法精确表示,所以就会出现这个结果的计算问题#要解决的话,需要使用到decimal来解决,数字需要加上引号,来做到转stra=Decimal('5.541')b=Decimal('45.568')t=a+bprint(t)#如果用变量的话,那就得转strtt=Decimal(str(fo))ss=Decimal(str(te))print(tt+ss)#关于字符串  str#单引号‘ 和双引号 “ , 括起来内的任意文本,字符串# \这个是转义符,只是对它后面的一个字符串转成本身str1 = 'I am ok!'str2 = ' "I\\\'m ok!"    -'str3 ='tru\n,ok change'str4 =r'tru\\n,ok change'# r'' 这个可以默认字符串不转义print(str1)print(str2)print(str3)print(str4)print('''index1index2index3''')#加了r ,让\n 转义不生效print(r'''index1,\nworld''')#不加rprint('''index1,\nworld2''')#关于布尔值 bool#只有True和False 两种, 可以用and  or  not  运算,print(3>2)print(2<1)# and 与运算,只有所有都是True, and 后才是Trueprint(3>2 and 3>1)# or 或运算,只要其中一个是True  ,结果就是Trueprint(3<2 or 3<1)# not 非运算print(not False)age =3if age>=19:    print('ais')else:    print('ont')####***变量   = 是赋值语句a= 123print(a)a='ADD4'print(a)a='ABC'  #创建一个变量a 创建一个字符串'ABC' 将a指向字符串’ABC‘b=a   #创建一个变量b,并把b 指向 a指向的字符串’ABC‘a='ccc'   #创建字符串’ccc‘ ,并把a的指向改为’ccc‘print(b)#常量print(10/3)   #结果是浮点数,精确除print(10/2.0)   #结果是浮点数,精确除print(10.0//3)print(10//3)   #结果是整数,地板除,整数的除法结果还是整数print(12.0//3.0)  #结果是浮点数,地板除,浮点数的除法结果还是浮点数#**********************总结"""总结:数据类型1.几种数据类型,int,float,str ,bool2.str的转义 \ 符号,  不转义r''  3.浮点数的加减的精度问题,用Decimal来解决,需要先转str 在放入Decimal使用4.bool的三种运算,经常用来做if 判断的用 True  和False 变量1.变量的赋值 =2.变量的指向 """

02-输入和输出

"""1. 直接使用 print() 函数最基础的方式,适用于简单调试和输出变量值。示例:name = "Alice"age = 25print(name)          # 输出:Aliceprint(name, age)     # 输出:Alice 25(默认空格分隔)print(f"{name}")     # 输出:Alice(与 f-string 结合)2. 字符串格式化(1) % 格式化(旧式)print("Name: %s, Age: %d" % (name, age))  # 输出:Name: Alice, Age: 25占位符:%s(字符串)、%d(整数)、%f(浮点数)。(2) str.format() 方法print("Name: {}, Age: {}".format(name, age))  # 输出:Name: Alice, Age: 25print("Age: {1}, Name: {0}".format(name, age))  # 按索引位置(3) f-string(Python 3.6+ 推荐)print(f"Name: {name}, Age: {age}")      # 输出:Name: Alice, Age: 25print(f"Next year age: {age + 1}")      # 支持表达式print(f"Name: {name.upper()}")          # 支持方法调用3. 交互式环境直接输出在 Python Shell / Jupyter Notebook 中,直接输入变量名可显示值:'Alice'  # 自动输出变量值4. 使用 repr() 和 str() 函数str():返回用户可读的字符串表示。repr():返回解释器可读的精确表示(常用于调试)。s = "Hello\nWorld"print(str(s))   # 输出:Hello                #       Worldprint(repr(s))  # 输出:'Hello\nWorld'5. 多变量解包输出快速输出元组、列表中的多个变量:values = ("Alice", 25, "Engineer")print(*values)  # 输出:Alice 25 Engineer6. 重定向到文件将变量内容写入文件而非控制台:with open("output.txt", "w") as f:    print(name, age, file=f)  # 内容写入文件7. 使用日志模块(logging)适合记录程序运行时的变量状态(如调试信息):import logginglogging.basicConfig(level=logging.INFO)logging.info(f"User: {name}, Age: {age}")  # 输出到日志对比总结方法	优点	缺点	适用场景print()	简单直接	无法灵活控制格式	快速调试f-string	语法简洁,支持表达式	仅限 Python 3.6+	复杂字符串拼接str.format()	兼容性好,支持位置索引	语法略繁琐	兼容旧版本代码logging	可分级记录日志	配置复杂	生产环境日志记录文件重定向	持久化保存输出	需要文件操作权限	数据保存/报告生成高级技巧控制浮点数精度:pi = 3.1415926print(f"Pi: {pi:.2f}")  # 输出:Pi: 3.14格式化对齐:print(f"{'Name':<10}{'Age':>5}")  # 输出:Name          Ageprint(f"{name:<10}{age:>5}")      # 输出:Alice          25输出不换行:print("Loading", end="...")  # 输出:Loading...根据需求选择合适的方式,日常开发中 f-string 和 print() 组合使用最为高效!"""# 计算BMI指数height = 1.83  # 米weight = 78.5  # 千克bmi = weight / (height ** 2)print(f"BMI指数为:{bmi:.2f}")print('OK')print('te')#这个是练习任务,为了熟悉怎么上传到github。#关于输出print('hello world')#关于输出,设置变量接到输入的内容,并用做后续可以打印,或者直接使用#name = input()names="luck"#变量输出的几种方式,#最基础的print()函数使用print('hello,',names)#这name前有空格,是因为print函数的默认分隔符,这个完整的语句是print('hello', name, sep=' ')#若想不带分隔符,可以直接用+,sep=''print('hello,'+names)print('hello,',names,sep='')print(names,height)print(names, height)##关键区别:代码中的逗号后的空格是代码格式,而 print() 输出的空格是参数分隔符(由 sep 参数控制)。#代码中的空格仅影响代码可读性,与运行时无关。#输出的空格由 sep 参数决定,默认是 ' 'print(f"{names}")#字符串格式化# %格式化,相对旧式s='go'd=33f=330.08003print("name:%s, height:%s, ff:%s "%(s,d,f))print("name:%s, height:%d, ff:%f "%(d,d,f))#在 Python 的字符串格式化中,使用 %f 输出浮点数时,默认会保留 6 位小数,因此像 334.4 会被格式化为 334.400000#通过 %.Nf 指定保留 N 位小数:print("1ff:%.1f"%f)print("2ff:%.2f"%f)#通过%g 自动省略末尾零,可能用科学计数法print("gff:%g"%f)print("name:%s, height:%s, ff:%s "%(s,d,f))#(2) str.format() 方法nige='caiji'gaom='ee'print("Name: {},tst:{}".format(nige,gaom))print("Age: {1}, Name: {0}".format(names, d))print("nae:{}".format(d))#(3) f-string(Python 3.6+ 推荐)print(f"Name: {names}, Age: {d}")      # 输出:Name: Alice, Age: 25print(f"Next year age: {d + 1}")      # 支持表达式print(f"Name: {names.upper()}")          # 支持方法调用pi=3.14159265358979323846print(f"PI:{pi}")#如何把pi打印正确呢?print(f"{'name':<10}{'d':>5}")print(f"{names:<10}{d:>5}")print(f"name:{d+34}")"""---总结1.今天的学习内容关于输入输出的,**输入**输入的好说,平时也用的少,不会说单独交互式的用input的内容,大多会用其他数据导入excel 或者csv的数据形式把大批数据导入进来**输出**输出的几种格式学习并练习了下,也发现一些细节点1.旧式用的,也是现在我比较熟悉用的 %s 这种方式的,现在也知道还有其他类型的对应,比如%d整数型 ,%f浮点型,还有%g 可以自动去除0,可能会造成科学计数法的这个方式需要改掉了,可能会有几个数据类型显示的问题在里面,显示的空格问题,若不明确,或者用错了,会造成报错,2.第二种format的这种方式,可以调整顺序使用的,用的也不是很多,在拼接多个变量的时候,语句会变的很长,3.第三种是现在退件的语法简洁,支持表达式,适用复杂字符串拼接的,但是版本上面有限定,需要python3.6以上"""

03-条件判断​​​​​​​

"""D2:条件判断核心知识if-elif-else结构逻辑运算符:and/or/not三元表达式:x = a if condition else b练习任务编写天气提示程序:温度>30℃提示“注意防晒”,<10℃提示“多穿衣服”用三元表达式判断数字奇偶性代码示例python复制# 成绩评级程序score = 85if score >= 90:    grade = "A"elif score >= 80:    grade = "B"else:    grade = "C"print(f"成绩等级:{grade}")"""#if 的判断是从上往下的,,如果某个判断了为True,就会把对应的语句执行后,忽略剩下的elif 和else了,#m=int(input('pls input your age:'))m=3if m >= 18:    print('you are a adult')elif m<6:    print('you are a kid')else:    print('oh,you are a teenager')h=1.75w=80.5bmi=w/(h*h)print(bmi)if bmi<18.5:    print('过轻了哦')elif 18.5 <= bmi < 25:    print('正常')elif 25 <= bmi <28:    print('过重')elif 28<= bmi <32:    print('肥胖')else:    print('严重肥胖')#三元表达式:x = a if condition else btest= 32on =1to = 1 if test<on else 999print(to)score =80match score:    case x if x<=60:        print('不及格')    case x if 60<x<=80:        print('及格')    case x if x>80:        print('优秀')    case _:        print('太棒')"""**条件判断使用的很频繁,语法if elif else ,注意缩进"""

04-循环控制​​​​​​​

"""D3:循环控制核心知识for循环:遍历列表/字符串/rangewhile循环:带退出条件循环控制:break/continue练习任务打印九九乘法表(嵌套循环)计算1-100的偶数和资源图解循环:Real Python Loops代码模板:python复制# 斐波那契数列(前10项)a, b = 0, 1for _ in range(10):    print(a, end=' ')    a, b = b, a + b    """#循环打印字符串lisdt=['niko','andi','lucy']for name in lisdt:    print(name)sum=0for x in [1,2,3,4,5]:    sum+=xprint(sum)#print(list(range(101)))sums=0for x in range(101):    sums+=xprint(sums)#while 循环start =0sum=0while  start<=100:    sum+=start    start+=1print(sum)#break 提前退出循环n=1while n <=100:    if n>10:        break    print(n)    n+=1#continuen=0while n<10:    n+=1    if n % 2 == 0:        continue    print(n)#求100内的偶数和n=0sum=0while n<100:    n+=1    if n % 2 == 0:        sum+=nprint(sum)#99乘法表,格式对齐咯m=1while m<=9:    n=1    content=''    while n<=m:        if n ==1 or m in [2,3] or (n==2 and m ==4):            content += f"{n}*{m}={n * m}  "        else:            content+=f"{n}*{m}={n*m:>2} "        n+=1    print(content)    m+=1

05-列表和元组​​​​​​

"""D2:列表和元组核心知识列表是一种内置的数据类型, list,是一有序的集合,可以随时添加删除其中的元素"""#列出名字home=['pyhton','tina','lubin']print(home)#len() 获取list元素的个数print(len(home))#用索引来访问列表的种的元素,索引是从0开始的print(home[0])print(home[1])print(home[-1])#append()是列表的方法,只能添加单个元素,只能添加到末尾home.append('macal')home.append(['A01','A02'])  #可添加任意数据类型元素,添加一个子列表#添加多个元素,extend() 可 要有[] 包住添加的元素; 或 +=home.extend(['tiadi','gek','end'])home+=['taidi','nigo']#要插入到指定位置 用insert()home.insert(0,'first')print(home)#删除元素用pop(),默认删除最后一个,可加入索引,表示删除哪个索引位置的元素home.pop()home.pop(5)print(home)#元组 tuple,有序的列表,初始化后就不能修改ahome=('laoda','laoer','laosan')t=()m=(1,)print(ahome)"""**总结关于内置的数据类型 列表和数据列表 list关于新增,插入,多个插入,移除,取数,等元组,初始化后就不能再变更元素"""

06-字典和集合​​​​​​​

"""D4:数据结构核心知识数据结构	特性	常用操作列表	有序,可修改	append()/pop()/切片元组	有序,不可修改	索引访问字典	键值对,快速查找	keys()/items()练习任务统计一段英文文本中各字母出现次数(忽略大小写)实现购物车功能:支持添加/删除/清空商品代码示例python复制# 词频统计text = "Hello world hello python"words = text.lower().split()word_count = {}for word in words:    word_count[word] = word_count.get(word, 0) + 1print(word_count)  # 输出:{'hello':2, 'world':1, 'python':1}"""#day4的内,在day1中扩展的时候 有部分涉及到了#关于字典,也叫键值对 key-value存储,具有极快的查找速度d={'sidy':40,   'bob':44,   'tina':43}print(d['sidy'])for x in d:    print(d[x])if 'tony' in d:    print('yes')else:    print('no')#获取dict的某个key,若没有,默认为none,也可以指定返回信息print(d.get('bob','no this one'))#直接在后面追加字典的key valued['bso']=32d['lucy']=99print(d)#删除某个keyd.pop('bso')print(d)#set 和dict 类似,但不能存储value,只有key,不可重复s={1,2,3}print(s)# set 会自动过滤重复s1= {1,2,3,4,5,4,3,5,6,7}print(s1)#set 的添加用adds1.add(23)print(s1)#set 的删除使用revomes1.remove(3)print(s1)s2=set([1,2,34])print(s2)"""总结学习了dict 字典 和set字典的key value,不能重复,添加,删除用pop,,判断是否有get,定义返回值set 的 添加add  删除remove,"""#词频统计text = "Hello world hello python"words = text.lower().split()word_count = {}for word in words:    word_count[word] = word_count.get(word, 0) + 1print(word_count)text ='hello this is a beautiful world do you want do this your love the world is beautiful'text_list =text.lower().split()words={}for word in text_list:    words[word]= words.get(word,0)+1print(words)#实现购物车功能:支持添加/删除/清空商品pre_buy=[]#添加newsku1='牙刷'newsku2='毛巾'newsku3='牙膏'pre_buy.append(newsku1)pre_buy.append(newsku2)pre_buy.append(newsku3)print(pre_buy)print(pre_buy.index(newsku1))#删除pre_buy.pop(pre_buy.index('牙刷'))print(pre_buy)#清空pre_buy=[]print(pre_buy)

07-函数与模块​​​​​​​

"""D5:函数与模块核心知识函数定义:def func(param):参数类型:位置参数/默认参数/可变参数模块导入:import math / from utils import calc练习任务编写计算器函数:支持加减乘除(处理除零错误)创建自定义模块my_math.py,包含平方和立方函数调试技巧使用print()或VS Code断点调试常见错误处理:python复制try:    10 / 0except ZeroDivisionError as e:    print(f"错误:{e}")"""from utils import cals,my_powers#函数的调用print(abs(-1))#数据类型转换的函数print(abs(int('123')))s=float('12.44')ma=str(1.23)print(ma)print(hex(9))#定义函数#使用def 语句,依次写函数名 括号,参数 冒号,然后在缩进体里面写,返回值用return 语句返回def my_abs(x):    if not isinstance(x,(int,float)):        raise TypeError('bad operand type')    if x>0:        return x    elif x<0:        return -x    else:        return 0print(my_abs(3.45))#参数类型:位置参数/默认参数/可变参数, 需要按位置顺传递进来def my_power(x):    return x*xprint(my_power(3))#默认函数,给参数默认值,调用时不传就用默认值, 传了就用传入值def my_power2(x,n=2):    s=1    while n>0:        n=n-1        s=s*x    return sprint(my_power2(5,5))print(my_power2(5,3))#可变参数,传入的参数是不确认的,个数是可变的def output(*list):    tent=''    for x in list:        tent = tent + f"{x} -"    return tentnames=['bob','tina','lubins','ahuadu']print(output(*names))print(output(2,3,4,5,5,6,4))print(output())#关键字参数, **kw, 把传入的关键组参数自动组装为dictdef per(name ,age,**other):    print(f"name:{name},age:{age},other:{other}")per('timo','30',sex='boy')"""总结:今天是对函数有个理解,从函数的调用,函数的定义, def 语法, 函数名,括号,参数等,冒号,缩进体,return 返回信息函数的参数有哪些,函数的参数有位置参数,默认参数,可变参数,关键字参数等"""#------#调用其他模块文件的函数print(cals(1,3,'+'))print(my_powers(2,3))print(cals(3,4,'*'))#调用其他模块的计算器函数if __name__ == "__main__":    tests = [        (5, 3, '+', 8),        (5.5, 2, '-', 3.5),        (4, 2.5, '*', 10.0),        (10, 4, '/', 2.5),        (7, 0, '/', "错误:除数不能为零"),        (5, "a", '+', "错误:输入必须为数字类型"),        (9, 3, '%', "错误:仅支持 + - * / 运算符")    ]    for num1, num2, op, expected in tests:        output = cals(num1, num2, op)        status = "✅" if output == expected else "❌"        print(f"{status} 输入:{num1} {op} {num2} | 输出:{output} | 预期:{expected}")"""总结,参考写了模块文件,及其对应的函数,并实施调用在模块文件中加入了测试用例,以保证模块中函数的健壮思考,这种思维能否用到工作的 python代码中去呢,监控或者飞书邮件,自测试"""

08-文件处理​​​​​​​

"""D6:文件操作核心知识文件模式:r(读)/w(写)/a(追加)CSV处理:csv.reader() / csv.DictReader()JSON序列化:json.dump() / json.load()练习任务将D4的购物车数据保存到JSON文件读取CSV文件并统计各列数据分布资源数据集:样例CSV文件代码模板:python复制# 自动备份日志文件import shutilshutil.copy('app.log', f'backup_{datetime.date.today()}.log')"""import  jsonimport pandas as pd#open()/read()/write() 这些是针对文本和二进制文件的#文件的覆盖写入with open('files/demo.txt',"w") as f :    f.write("no i replace all the content.\n")#文件的追加with open('files/demo.txt',"a") as f :    f.write("this is second line content.\n")# 仅仅是txt文件的读import oswith open('files/demo.txt', 'w') as f:    f.write("Sample content.\n")with open('files/demo.txt', "r") as f:    content = f.read()    print(content)data={    "name":'bob',    "age":'34',    "sex":"man"}print('11',type(data))with open("files/data.json","w")as f:    json.dump(data,f,indent=0)with open("files/data.json","r")as f:    loads=json.load(f)    print(loads)with open("files/dept.json","r")as f:    loads=json.load(f)    print(loads)json_str=json.dumps(data)print(json_str)print('22',type(json_str))python_obj = json.loads('{"name": "Bob", "age": 30}')print(python_obj["name"])  # 输出 Bobprint(python_obj)print("333",type(python_obj))df=pd.read_json("files/dept.json")print(df)code ='f'with open("files/dept.json", "r") as f:    existing_data = json.load(f)print(existing_data)json_list = [item for item in existing_data if item["code"] == code]#print(json_list.index())print(existing_data[2]['dept'])#关于CSV 的文件处理, 目前也是用的很频繁。#大多数都是导出csv文件,这个也和dataframe一起用比较多,import csvimport pandas as pd#单独使用csv模块进行csv的读写data=[    ['序号','问题','提出人'],['1','question1','bob'],['2','为啥会有两','钟馗'],]#with open('files/data.csv','w') as f:# newline='' 的作用是为了禁用换行符自动转换,避免 Windows 系统出现空行问题;# writerows(data) 批量写入with open('files/data.csv','w',newline='',encoding='utf-8') as f:    writer=csv.writer(f)    writer.writerows(data)#读取csv 文件with open('files/data.csv','r',newline='',encoding='utf-8') as f:    reader=csv.reader(f)    for row in reader:        print(row)#pandas的方法#创建dataframe的一种方法,确认列表头,确认行内容,在往dataframe插入# 表头是一个列表的形式,数据行也是一个列表的形式,但必须要是完全一致的才行,不然会被末尾填充nonecol= ['序号','问题','提出人']data1=[['3','问题3','提出人3'],['1','question1','bob'],['2','为啥会有两','kong'],['5','为两','lima22o'],]df=pd.DataFrame(data1,columns=col)print(df)# 若是一个完整的列表的列表,也就是二维列表的话,可以分开列头和数据行,然后填充进dataframe,data2=[['序号','问题','提出人'],['3','问题3','提出人3'],['1','question1','bob'],['2','为啥会有两','kong'],['5','为两','lima22o'],]cols = data2[0]datah=data2[1:]df2=pd.DataFrame(datah,columns=cols)print(df2)df2.to_csv('files/pd.csv',index=False)#还有比较常用的是用字典列表的形式,往dataframe 写入数据datas = [{"Name": "Charlie", "Age": 28, "City": "Paris"},{"Name": "Diana", "Age": 22, "City": "Tokyo"}]pdf=pd.DataFrame(datas)print(pdf)#索引不写入,保证编码是utf-8不产生乱码,写入的字段控制,仅写两个要的pdf.to_csv('files/pdf.csv',index=False,encoding='utf-8',columns=['Name','Age'])#用pands的 readcsv ,读取csv数据# header:指定标题行位置(默认 0,即第一行;None 表示无标题)。# names:自定义列名列表。.wd= pd.read_csv('files/pd.csv',names =['no','que','man'])print('1----\n',wd)wd1= pd.read_csv('files/pd.csv',header=0,names =['n','que','man'])print('2----\n',wd1)#usecols:选择特定列(按列名或索引)。wd2= pd.read_csv('files/pd.csv',header=0,usecols =['问题','提出人'])print('3----\n',wd2)#nrows:读取前 N 行(用于快速预览)。wd3= pd.read_csv('files/pd.csv',nrows=2)print('3----\n',wd3)"""##使用读取配置,这个也就是字典,import pandas as pd# 读取配置read_config = {    "filepath_or_buffer": "sales_data.csv",    "sep": ",",    "header": 0,    "usecols": ["OrderID", "OrderDate", "Amount"],    "parse_dates": ["OrderDate"],    "dtype": {"OrderID": "str", "Amount": "float32"},    "na_values": ["N/A", "Missing"],    "encoding": "utf-8",    "nrows": 1000  # 仅读取前 1000 行测试}df = pd.read_csv(**read_config)print(df.info())总结:进行csv的写入 和读取的学习1.基础的按csv模块的 读取和写入,感觉是没有pandas 的处理起来高效,2.基于pandas库的 csv 操作更符合现在日常工作使用,大多是用在写入csv上面,关键的点也就是dataframe的组建,这就另外说了单纯用pandas的写入csv 并没有很多要点3.关于pandas库的csv 读取,涉及到了大量方便读取的参数配置,会有很多需要进一步学习的地方"""from operator import indeximport pandas as pd#读取excel中的数据df= pd.read_excel("files/askdata.xlsx")df1= pd.read_excel("files/askdata.xlsx",sheet_name='请款及时率',header=0,usecols=["channel","total_payment_count"])#换个列头名字df.columns=["days","day2","channel",'qty','qty_vi','ratio']   # 整体全部换名字的df1=df1.rename(columns={    "channel":"qudao",    "total_payment_count":"count"})  # 可按部分换名字out_data1= df.head(10)out_data2=df1.head(19)with pd.ExcelWriter("files/output1.xlsx") as writer:    out_data1.to_excel(writer,index=False,sheet_name='out')    out_data2.to_excel(writer,index=False,sheet_name='out1')#获取到excel中多个sheet页的内容,存储在dict里面,key是对应的sheet名称,value是一个数组,all_sheets = pd.read_excel("files/output1.xlsx",sheet_name=None)print_data= all_sheets['out']print_data1= all_sheets['out1']print(print_data)print(print_data1)print(type(all_sheets))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呱牛 do IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值