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