s21day14 python笔记
程序员文章站
2022-04-19 23:22:49
s21day14 python笔记 一、内容回顾及补充 1. 参数补充 对于函数的默认值是可变类型 2. 闭包补充 3. 作用域补充 递归 二、装饰器补充:带参数的装饰器 1. 应用场景:flask框架 / django缓存 / 写装饰器实现被装饰的函数要执行N次 2. 区别: 3. 练习题 三、模 ......
s21day14 python笔记
一、内容回顾及补充
-
参数补充
- 对于函数的默认值是可变类型
# 如果要想给value设置默认是空列表 # 不推荐(坑) def func(data,value=[]): pass # 推荐 def func(data,value=none): if not value: value = []
#面试题: def func(a,b=[]): b.append(a) return b l1 = func(1) l2 = func(2,[11,22]) l3 = func(3) # [1,3] [11,22,2] [1,3] print(l1,l2,l3)
-
闭包补充
#区分: # 不是闭包 def func1(name): def inner(): return 123 return inner # 是闭包:封装值 + 内层函数需要使用。 def func2(name): def inner(): print(name) return 123 return inner
-
作用域补充
-
递归
# 函数自己调用自己 def func(): print(1) func() func() # 递归的返回值 def func(a): if a == 5: return 100000 result = func(a+1) + 10 v = func(1) name = 'alex' def func(): def inner(): print(name) return inner v =func()
-
二、装饰器补充:带参数的装饰器
-
应用场景:flask框架 / django缓存 / 写装饰器实现被装饰的函数要执行n次
# 第一步:执行 ret = xxx(index) # 第二步:将返回值赋值给 index = ret @xxx def index(): pass # 第一步:执行 v1 = uuu(9) # 第二步:ret = v1(index) # 第三步:index = ret @uuu(9) def index(): pass
-
区别:
# 普通装饰器 def wrapper(func): def inner(*args,**kwargs): data = func(*args,**kwargs) # 执行原函数并获取返回值 return data return inner @wrapper def index(): pass # 带参数装饰器 def x(counter): def wrapper(func): def inner(*args,**kwargs): data = func(*args,**kwargs) # 执行原函数并获取返回值 return data return inner return wrapper @x(9) def index(): pass
-
练习题
# 习题一: # 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,把每次结果添加到列表中,最终返回列表。 def xxx(counter): def wrapper(func): def inner(*args,**kwargs): v = [] for i in range(counter): data = func(*args,**kwargs) # 执行原函数并获取返回值 v.append(data) return v return inner return wrapper @xxx(5) def index(): return 8 v = index() print(v) # 习题二: # 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,并返回最后一次执行的结果【面试题】 def xxx(counter): def wrapper(func): def inner(*args,**kwargs): for i in range(counter): data = func(*args,**kwargs) # 执行原函数并获取返回值 return data return inner return wrapper @xxx(5) def index(): return 8 v = index() print(v) # 习题三: # 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,并返回执行结果中最大的值。 def xxx(counter): def wrapper(func): def inner(*args,**kwargs): value = 0 for i in range(counter): data = func(*args,**kwargs) # 执行原函数并获取返回值 if data > value: value = data return value return inner return wrapper @xxx(5) def index(): return 8 v = index() print(v)
三、模块
- sys:python解释器相关数据
sys.getrefcount:获取一个值的应用计数
sys.getrecursionlimit:python默认支持的递归数量
- sys.stdout.write:输入输出
- 补充:
- \n:换行
- \t:制表符
- \r:回到当前行的起始位置
import time for i in range(1,101): msg = "%s%%\r" %i print(msg,end='') time.sleep(0.05)
- 示例:读取文件的进度条
- 补充:
import os # 1. 读取文件大小(字节) file_size = os.stat('20190409_192149.mp4').st_size # 2.一点一点的读取文件 read_size = 0 with open('20190409_192149.mp4',mode='rb') as f1,open('a.mp4',mode='wb') as f2: while read_size < file_size: chunk = f1.read(1024) # 每次最多去读取1024字节 f2.write(chunk) read_size += len(chunk) val = int(read_size / file_size * 100) print('%s%%\r' %val ,end='')
- sys.argv:获取用户执行脚本时,传入的参数
- 示例:让用户执行脚本传入要删除的文件路径,在内部帮助用将目录删
""" 让用户执行脚本传入要删除的文件路径,在内部帮助用将目录删除。 c:\python36\python36.exe d:/code/s21day14/7.模块传参.py d:/test c:\python36\python36.exe d:/code/s21day14/7.模块传参.py """ import sys # 获取用户执行脚本时,传入的参数。 # c:\python36\python36.exe d:/code/s21day14/7.模块传参.py d:/test # sys.argv = [d:/code/s21day14/7.模块传参.py, d:/test] path = sys.argv[1] # 删除目录 import shutil shutil.rmtree(path)
- os:和操作系统相关的数据【常用】
os.path.exists(path):如果path存在,返回true;如果path不存在,返回false
os.stat('文件路径').st_size:获取文件大小
os.path.abspath():获取一个文件的绝对路径
import os v1 = os.path.abspath(path) print(v1)
- os.path.dirname:获取路径的上级目录
import os v = r"d:\code\s21day14\20190409_192149.mp4" print(os.path.dirname(v))
-
补充:
-
转义
v1 = r"d:\code\s21day14\n1.mp4" (推荐) v2 = "d:\\code\\s21day14\\n1.mp4"
-
os.path.join:路径的拼接
import os path = "d:\code\s21day14" # user/index/inx/fasd/ v = 'n.txt' result = os.path.join(path,v) print(result)
- os.listdir:查看一个目录下所有的文件【第一层】
import os result = os.listdir(r'd:\code\s21day14') for path in result: print(path)
- os.walk:查看一个目录下所有的文件【所有层】
import os result = os.walk(r'd:\code\s21day14') for a,b,c in result: # a,正在查看的目录 b,此目录下的文件夹 c,此目录下的文件 for item in c: path = os.path.join(a,item) print(path)
- shutil:删除/解压
# 删除目录 import shutil shutil.rmtree(path)
下一篇: PHP读取文件并可支持远程文件的代码分享