python基础7-函数闭包/装饰器
- pythonic,python风格的代码,简洁优美
- 生成器产生时不会生成值,只有next时才会产生值,且只能遍历一次
-
def test(): for i in range(4): yield i t = test() t1=(i for i in t) t2=(i for i in t1)#生成器在产生时不做任何操作,只有执行时才会遍历,所以t2此刻没有值 print(list(t1)) print(list(t2))
- 把一个对象变成迭代器,l = [1,3],l.__iter__()或者直接itel(l)也行
-
装饰器
- 本质就是函数,功能是为其他函数添加附加功能
- 原则
- 不修改被修饰函数的源代码,一点也不能动
- 不修改被修饰函数的调用方式
- 程序上线后,不能修改函数源代码
- 装饰器 = 高阶函数+函数嵌套+闭包
- 接受的参数是函数名,返回值也是函数名,差一步实现装饰器,只有高阶函数不能实现装饰器
- 函数嵌套,在函数中定义另外一个函数
- 闭包就是作用域的概念
-
import time # 装饰器的架子 def timmer(func): # func=test def wrapper(): # print(func) start_time = time.time() func() # 就是在运行test() stop_time = time.time() print('运行时间是%s' % (stop_time - start_time)) return wrapper def test(): time.sleep(3) print('test函数运行完毕') test = timmer(test)#返回的是wrapper的地址 test()#执行的是wrapper()
- 语法糖,@timmer 就相当于 test=timmer(test)
-
import time# 装饰器的架子 def timmer(func): # func=test def wrapper(): start_time = time.time() res = func() # 就是在运行test() stop_time = time.time() print('运行时间是%s' % (stop_time - start_time)) return res return wrapper @timmer #相当于test = timmer(test) def test(): time.sleep(3) print('test函数运行完毕') return'这是test的返回值' res = test() print(res)
- 运行加上装饰器的test,实际是执行装饰器,test如果有返回值/参数,都应该加到装饰器对应位置,包括形参和实参
-
import time# 装饰器的架子 def timmer(func): # func=test def wrapper(*args,**kwargs):#*args接受所有参数,**kwargs接受关键字参数,位置参数必须在关键字参数左边 start_time = time.time() res = func(*args,**kwargs) # 就是在运行test() stop_time = time.time() print('运行时间是%s' % (stop_time - start_time)) return res return wrapper
- 解压序列a,b,c=(1,2,3),a获取1,b获取2,c获取3
-
#技巧
>>> m [10, 3, 2, 3, 5, 1, 2] >>> a,*_,c=m #_没有意义,写*d也行>>> a 10 >>> c 2 - python中变量互相换值,a=1,b=2,然后a,b = b,a即可
- for else语句,表示for非正常结束,则执行else语句
- 如何给装饰器加参数,再外加一层定义,装饰器最外层新增参数,则内层均可以获取。先研究无参的,再研究有参的