yield from只是个桥梁,用以接收: 生成器 、元组、 列表、range()函数产生的序列等可迭代对象,在下例中其接收yield返回的结果并传递到上一级调用者,同时它还几首yield所在生成器return的结果,但该结果不会传递到上一级调用者,具体可参考下面的例子,对运行几遍将有深刻的理解:
def yieldTest():
i = 1
while i < 4:
n = yield i
print(f'n recive send value, n:{n}')
if i == 3:
return 100 #这里退出并抛出StopIteration异常
i += 1
def yeildFromTest():
val = yield from htest()#yield from用来衔接yield,value并不接收send的结果,而是用来接收return结果(100)
print(val)
return val+1 #函数可以没有return,事实证明这一步即使加了return 其结果也不会被主函数的r接收;执行完这一步直接抛出yeildFromTest生成器的StopIteration
t = itest()
r=t.send(None)
print(f'r0:{r}')
j = 0
while j < 3:
j += 1
try:
print(f'now send j:{j}')
r=t.send(j)#接收yieldTest中yield返回结果,不接收yeildFromTest中return的结果;当yeildFromTest抛出异常后直接跳过r.send下面的语句直接跳到except语句执行
print(f'r:{r}')
except StopIteration as e:
print(f'r:{r}') #最后一次itest抛出异常return的101并不会被r接收,因此这里打印的r还是上一次接收到的htest中yield返回的值3
print('异常了')
下面是另一个例子:
def generator2():
yield 'a'
yield 'b'
yield 'c'
yield from range(0,10) #yield from iterable本质上等于 for item in iterable: yield item的缩写版
yield from [11,22,33,44]
yield from (12,23,34)
yield from range(3)
for i in generator2():
print(i,end=' , ')