python中的装饰器、生成器和迭代器
一、装饰器
作用:为原函数添加新功能
示例:
1 import time 2 #为function1添加计时功能 3 def show_tine(func): 4 def inner(): 5 start = time.time() 6 func() 7 end = time.time() 8 print('spend %s' % end-start) 9 return inner 10 11 @show_time #等同于function1 = show_time(function1) 12 def function1(): 13 print('operating----')
二、列表生成式(相当于直接做出n道菜,并摆出来;执行操作,并为所有结果都开辟内存空间)
功能:把所有计算出的结果,以列表的形式返回
示例:
[对x的操作式(可放函数) for x in 可迭代对象]
三、生成器(可以理解为会做n道菜的厨师,并且是特殊的迭代器)
1 功能:将多次的数据处理,分成一次次进行,或者将不同的代码块依次执行
2 生成示例:
1 #生成器类型1 2 (对x的操作式(可放函数) for x in 可迭代对象) 3 4 #生成器类型2 5 def generator_obj(): 6 代码块1 7 yield 返回值1 8 代码块2 9 yield 返回值2
3 调用取值
方法:
next(generator_obj)
generator_obj.__next__()
generator_obj.next()(in python2.x )
示例:
#取值方法1 ret1 = next(generator_obj) #执行代码快1,并取得返回值1 ret1 = next(generator_obj) #执行代码快2,并取得返回值2 #注意:一次只能执行一个代码块,并且只能按顺序执行 #取值方法2 #依次执行代码块,并打印返回值 for i in generator_obj(): print(i)
4 往生成器传值
方法:
generator_obj.send()
功能:为yield前面的变量赋值,然后执行后面的代码块
示例:
1 #生成器 2 def generator_obj(): 3 代码块1 4 name = yield 返回值1 5 代码块2 6 age = yield 返回值2 7 8 g = generator_obj() 9 next(g) #或者g.send(None) 10 g.send("xiaokai")
注意:每次执行完毕,生成器会停留在yield语句上,下次进入也会先进去yield语句。只用从yield语句进入,才可进行传值,所以第一次进入应为generator_obj.send(None)
四、迭代器
1.可迭代对象:内部有iter方法的对象
2.迭代器的作用:以时间换空间,以极少的内存换取无限多的需被处理的数据
3.迭代器的生成
1 #in python 3.x 2 iter(iterable_obj) 3 iterable_obj.__iter__() 4 5 #in python 2.x 6 iterable_obj.iter()
4.迭代器协议
4.1 内部需有next()方法
4.2 内部需有iter()方法
五、for循环的内部实现机制
1 while True: 2 try: 3 i=next(iter(iterable)) 4 except StopIteration as e: 5 print("Generator return value ", e.value") 6 break

浙公网安备 33010602011771号