装饰器、生成器、迭代器
1 def dec1(func): 2 def wrapper(*args, **kwargs): 3 print('添加功能1') 4 func() 5 print('添加功能1') 6 return wrapper 7 def dec2(func): 8 def wrapper(*args, **kwargs): 9 print('添加功能2') 10 func() 11 print('添加功能2') 12 return wrapper 13 14 @dec1 15 @dec2 16 def func(): 17 print('原本功能0') 18 19 func() 20 21 # 添加功能1 22 # 添加功能2 23 # 原本功能0 24 # 添加功能2 25 # 添加功能1
装饰器使用场景
1.参数、结果的检查。
2.缓存
3.计数
4.日志
5.统计
6.权限管理
7.重试
生成器
列表生成式
是python内置的非常简单并且强大的可以用来生成list的生成式生成列表。
1 # 列表生成式生成列表,在for循环后加上if判断 2 print [ i*i for i in range(1,11) if i !=0 ] 3 4 #[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# 使用双层循环(两个for循环),生成全排列 print ([i*j for i in range(1,5) for j in range(2,6)]) # [2, 3, 4, 5, 4, 6, 8, 10, 6, 9, 12, 15, 8, 12, 16, 20]
生成器
在python中,这种一边循环一边推导的机制成为生成器。
生成器提供了一种更为便利的产生迭代器的方式, 一般用户不需要自己实现iter和next方法,它默认返回一个可迭代对象;代码更为简洁,优雅;节省存储空间
通过列表生成式,可以直接创建一个列表,所有的数据都会存到内存中,受内存的限制,但列表的容量是有限制的。如果列表中有10000个数据,如果我们只需要访问前几个元素,后面的基本不会访问那么造成内存极大的浪费。如果我们列表中的元素可以按照某种算法推导出来,那么我们在循环遍历列表时,我们不断推导后面的元素,从而节省大量内存。
创建生成器
1、把列表生成式的 [] 改成 ()
2、函数实现生成器(yield语句)
函数是按顺序执行,遇到return 或者最后一行函数语句就返回。如果想要把一个函数改为生成器函数,只需将函数的return改为yield,即变成 generator函数。在每次调用next()的时候,会遇到yield语句返回,如果再次执行next(),那么它会从上次返回的yield语句处继续向下执行。
遍历方法:
1、使用g.next()方法依次读取元素(当所有元素都拿出来后,再执行next会得到StopIteration异常)
2、使用 for 循环(推荐)
迭代器
迭代(Iteration):在Python 中,我们可以通过 for 、while循环遍历 list 或 tuple 等数据类型,这种遍历我们称为迭代。
可迭代对象(Iterable):可以直接作用于 for 循环的对象我们称为可迭代对象,一般包括集合数据类型和生成器。
可以直接作用于for循环的数据类型:
1.集合数据类型,如 list、tuple、dict、set、string等
2.generator, 包含生成器 和带yield的 generator function
注意:可以使用isinstance()函数 判断一个对象是否是 Iterable对象
迭代器(Iterator):实现了迭代器协议的对象称为迭代器,生成器是可迭代对象,同时也是迭代器。
Iterable(可迭代对象) 和 Iterator(迭代器) 主要区别是: