天天看点

关于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。说的有点乱,上个图吧。)

关于python3 中yield的笔记(__next__ 以及 send)

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标签')

运行结果

关于python3 中yield的笔记(__next__ 以及 send)