啦啦啦啦
装饰器的主要功能和装饰器的固定结构
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def timer(func): def inner(*arg,**kwargs): "调用函数前执行的代码" re=func(*arg,**kwargs) "调用函数后执行的代码" return re return inner @timer "被装饰器装饰的函数"
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
被装饰器装饰的函数,不能查看该函数的一些信息,所以使用wraps模块,加在最内层函数正上方 from functools import wraps def deco(func): @wraps(func) #加在最内层函数正上方 def wrapper(*args,**kwargs): return func(*args,**kwargs) return wrapper @deco ''被装饰函数''
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#频繁的调用装饰器或不调用装饰器,可以用带参数装饰器解决 def outer(flag): def timer(func): def inner(*args,**kwargs): if flag: print('''执行函数之前要做的''') re = func(*args,**kwargs) if flag: print('''执行函数之后要做的''') return re return inner return timer @outer(False) def func(): print(111) func()
可迭代对象与迭代器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
可迭代对象遵循可迭代协议,内部实现了__iter__方法。
迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法。
可迭代对象通过执行iter方法得到迭代器
生成器Generator
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行 2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表 本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现) 特点:惰性运算,开发者自定义
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
生成器=生成器函数() 激活生成器只能用next
next: 生成器.next() 执行到下一个yield之前的代码,不赋值给yield任何值,激活生成器必须用next
send: 生成器.send(参数) 从上一个yield开始,并赋值给上一个yield参数,执行到下一个yield之前的代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1.把列表解析的[]换成()得到的就是生成器表达式 2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存 #列表解析式 li=[i for i in range(100000000)]#内存占用大,机器容易卡死 返回一个列表 #生成器表达式 li=(i for i in range(100000000))#几乎不占内存 返回一个生成器对象
激活生成器的方法:for循环 list()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#列表推导式 #找到嵌套列表中名字含有两个‘e’的所有名字 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] print([name for lst in names for name in lst if name.count('e') >= 2]) # 注意遍历顺序,这是实现的关键 #字典推导式 #合并大小写对应的value值,将k统一成小写 mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3} mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase.keys()} print(mcase_frequency) #集合推导式 #计算列表中每个值的平方,自带去重功能 squared = {x**2 for x in [1, -1, 2]} print(squared)