装饰器
1.速查笔记
#-- 函数装饰器:是它后边的函数的运行时的声明 由@符号以及后边紧跟的"元函数"(metafunction)组成 @staticmethod def smeth(x): print(x) # 等同于: def smeth(x): print(x) smeth = staticmethod(smeth)
定义:在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)
经典示例:
# -*- coding:utf-8 -*- import time def timer(func): #把被装饰的函数ceshi的内存地址传给了func def deco(*args,**kwargs): start_time = time.time() func(*args,**kwargs) stop_time = time.time() print('测试函数运行时间',(stop_time-start_time)) return deco #返回deco的内存地址 @timer def ceshi(a): time.sleep(3) print('测试%s'%a) ceshi('装饰器')
2. 原则:①不能修改被装饰函数的源代码;②不能修改被装饰函数的调用方式
3.实现装饰器的技能储备
① 函数本身即是变量
② 高阶函数,把一个函数名当做实参穿给另一个函数
③ 嵌套函数
参考:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000
生成器
1.速查笔记
#-- 生成器函数:yield VS return def gensquare(N): for i in range(N): yield i** 2 # 状态挂起 可以恢复到此时的状态 for i in gensquare(5): # 使用方法 print(i, end = ' ') # [0, 1, 4, 9, 16] x = gensquare(2) # x是一个生成对象 next(x) # 等同于x.__next__() 返回0 next(x) # 等同于x.__next__() 返回1 next(x) # 等同于x.__next__() 抛出异常StopIteration #-- 生成器表达式:小括号进行列表解析 G = (x ** 2 for x in range(3)) # 使用小括号可以创建所需结果的生成器generator object next(G), next(G), next(G) # 和上述中的生成器函数的返回值一致 #(1)生成器(生成器函数/生成器表达式)是单个迭代对象 G = (x ** 2 for x in range(4)) I1 = iter(G) # 这里实际上iter(G) = G next(I1) # 输出0 next(G) # 输出1 next(I1) # 输出4 #(2)生成器不保留迭代后的结果 gen = (i for i in range(4)) in gen # 返回True in gen # 返回True in gen # 返回False,其实检测2的时候,1已经就不在生成器中了,即1已经被迭代过了,同理2、3也不在了
2. 生成器表达式
局限性:只能适合简单的算法
示例:
test = (x**2 for x in range(1,10)) print(next(test)) print(test.__next__())
3. 生成器函数 yield
斐波那契函数的打印示例:
def fib(max): a,b,n = 1,1,0 while n<max: yield b a,b = b,a+b n+=1 return b test = fib(10) print(test.__next__()) print(next(test)) for i in test: print(i)