栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

yield和yield from使用

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

yield和yield from使用

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=' , ')
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/283528.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号