yield和yield from使用

本文通过示例详细解析了Python中yield和yield from的使用,展示了它们如何在生成器中传递值和控制流程。yield from用于连接生成器,接收其他可迭代对象的值,而yield则用于在生成器中产生值。在运行示例代码的过程中,可以观察到yield from如何处理return的结果以及StopIteration异常的传播。
摘要由CSDN通过智能技术生成

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=' , ')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值