前面已经说过yield的作用:

1、类似于return每次返回一个值

2、代码块(函数)暂停在yield的位置,下次调用时继续执行yield之后和之前的代码块

3、通过next(f)获取到yield的返回值

send的作用其实和yield类似:

1、类似于return每次返回一个值

2、代码块(函数)暂停在yield的位置,下次调用时继续执行yield之后和之前的代码块

3、send(x)可以理解为next(x),也就是把send的结果当做yield的返回值给next来获取

有点拗口,下面直接看例子:

for i in range(8):
    try:
        print(next(a))
    except StopIteration as e:
        print(e)
        break

执行结果:

... 1
1
None
... 2
2
None
done

再看个例子:

for i in range(8):
    try:
        if i == 1:
            a.send(8)  # send(x)等同于吧yield之后和之前的代码执行一遍,并返回x的值给next(a)
            print(next(a))  # 这里会继续调用next,继续执行yield之后的代码直到yield
        else:
            print(next(a))
    except StopIteration as e:
        print(e)
        break

执行结果:

... 1
1
8
... 2
None
done
02-12 08:59