yield和send

前面已经说过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来获取

 

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

def c():
    n = 0
    while n < 2:
        n += 1
        print('...',n)
        s = yield n
        print(s)
    return 'done'

a = c()

 

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

 

posted @ 2019-10-14 09:22  唐大侠的小迷弟  阅读(259)  评论(0编辑  收藏  举报