迭代器协议:
1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)
2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)
3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。
生成器
- 语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值
- 自动实现迭代器协议:对于生成器,Python会自动实现迭代器协议,以便应用到迭代背景中(如for循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next方法,并且,在没有值可以返回的时候,生成器自动产生StopIteration异常
- 状态挂起:生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行
工作理论:
用__iter__转成可迭代对象
在用__next__便利
yield 和 return 一样但会保留状态
send()执行下一次的 yield ,可穿参数给 yield
三元表达式:
name='alex' name='linhaifeng' res='SB' if name == 'alex' else 'shuai' print(res)
吃包子
1 import time 2 def wen(): 3 while True: 4 print("准备吃包子") 5 baozi=yield 1 6 print("正在吃包子%s"%baozi) 7 time.sleep(2) 8 def shi(): 9 c1=wen() 10 c2=wen() 11 c1.__next__() 12 c2.__next__() 13 for i in range(10): 14 time.sleep(2) 15 c1.send(i) 16 c2.send(i) 17 shi()