关于python3 中yield的笔记(__next__ 以及 send)
重点理解以下几点:
1. 在生成带有yield的 (下面的函数h()) generator后 第一个迭代必须是__next__()。
2. __next__() 和 send(None)的效果是相同的
3. 带有yield 的生成器中,yield有两个作用—存储和给next和send触发yield之间的代码动作(具体看代码吧);next和 send的作用其实就是一个动作指令,这个指令的具体工作内容就是从当前的yield执行到下一个yield,当找不到下一个yield时候就出发StopIteration。(以m = yield 5 .... n = yield 100为例,send 和 next操作就是触发中间省略号...部分的代码内容,而执行value2 = c.send('aaa')时,value2的值是下个yield即yield 100存储的这个‘100’,而send('aaa')这个操作呢把'aaa'赋给了 m = yield 5 中的m。说的有点乱,上个图吧。)
def h():
print('start')
m = yield 5
print(m)
n = yield 100
print(m)
print(n)
m = yield 200
print(m)
print(n)
c = h()
value1 = c.__next__() # c.__next__() 相当于 c.send(None)
print("这是表达式 yield 5 对应存储的值:" + str(value1) + "\n")
value2 = c.send('aaa')
print("这是表达式 yield 100 对应存储的值:" + str(value2) + "\n")
value3 = c.send(999999)
print("这是表达式 yield 200 对应存储的值:" + str(value3) + "\n")
c.send('最后一个yield值修改但是找不到结束的"yield标签')
运行结果