yield

通过yield返回的是一个生成器,yield既可以产出值又可以生成值,yield可以用next()来启动生成器,同时可以用send向生成器传递值;在初次启动生成器时,需调用next()或send(None)来激活生成器,一个yield对应一个send或next(),当send或next()个数超过yield个数时,会抛出StopIteration

 def gen_yield():
value = yield 1
print(value)
value = yield 2
print(value)
value = yield 3
print(value)
return "end" gen = gen_yield() print(next(gen))
print(gen.send("a"))
print(gen.send("b"))
print(gen.send("c"))

next(gen)激活生成器yield 1,返回1,并将生成器挂起;gen.send("a")会将"a"传递给value = yield 1,此时value="a",打印出a,返回2,将生成器挂起;gen.send("b")将"b"传递给value = yield 2,此时value="b",打印"b"并返回3,将生成器挂起;gen.send("c")将"c"传递给value = yield 3,此时value="c",打印"c",由于后面没有生成器了,会抛出StopIteration异常。

1
a
2
b
3
c
Traceback (most recent call last):
print(gen.send("c"))
StopIteration: end

close()/throw() 关闭/暂停 生成器

 def gen_yield():
try:
yield "a"
except StopIteration:
pass
yield "b"
yield "c"
return "end" gen = gen_yield() print(next(gen))
gen.close()
print(111)
print(next(gen))

close()是关闭生成器,当生成器执行了close()方法后,即使做了异常处理,与yield相关的语句不会再执行。

throw()相当于中断、暂停生成器,通过throw()抛出异常后,当异常处理后生成器会执行下一个yield,下一个yield之后的上长期不再受throw()影响。

 def gen_yield():
try:
yield "a"
except Exception:
pass
yield "b"
yield "c"
return "end" gen = gen_yield() print(next(gen))
print(gen.throw(Exception))
print(111)
print(next(gen))

result:

a
b
111
c

yield from

yield from类似于yield,但yield from后面必须接一个可迭代的对象,返回该迭代对象的iter,yield则直接返回接受的对象

def gen_yield(iterable):
yield iterable def gen_yield_from(iterable):
yield from iterable for value in gen_yield([1, 2, 3]):
print("yield:{}".format(value))
for value in gen_yield_from([1, 2, 3]):
print("yield from:{}".format(value))
result:
yield:[1, 2, 3]
yield from:1
yield from:2
yield from:3

yield from会在调用方与子生成器之间建立双向通道,即yield from后可以接受一个生成器函数,调用方通过send可以直接传递数据给子生成器,同时yield from可以接受子生成器返回的数据

 def gen_yield():
"""
子生成器
:return:
"""
nums = []
i = 1
while i < 4:
n = yield i
print("receive {}".format(n))
i += 1
nums.append(n)
return nums def gen_yield_from():
val = yield from gen_yield()
return val gen_value_list = [100, 200, 300]
# 调用方
gen = gen_yield_from()
# send(None) 激活生成器
print("yield return {}".format(gen.send(None)))
j = 0
while j < 3:
try:
print("yield return {}".format(gen.send(gen_value_list[j])))
except StopIteration as e:
print(e)
j += 1
gen激活生成器后会通过send发送数据,数据会直接传递给子生成器gen_yield
执行结果
yield return 1
receive 100
yield return 2
receive 200
yield return 3
receive 300
[100, 200, 300]

yield与yield from的更多相关文章

  1. python yield 与 yield from转

    python yield 与 yield from转 https://blog.csdn.net/chenbin520/article/details/78111399?locationNum=7&a ...

  2. 从yield 到yield from再到python协程

    yield 关键字 def fib(): a, b = 0, 1 while 1: yield b a, b = b, a+b yield 是在:PEP 255 -- Simple Generator ...

  3. 60、简述 yield和yield from关键字。

    1.可迭代对象与迭代器的区别 可迭代对象:指的是具备可迭代的能力,即enumerable.  在Python中指的是可以通过for-in 语句去逐个访问元素的一些对象,比如元组tuple,列表list ...

  4. python yield、yield from与协程

    从生成器到协程 协程是指一个过程,这个过程与调用方协作,产出由调用方提供的值.生成器的调用方可以使用 .send(...)方法发送数据,发送的数据会成为yield表达式的值.因此,生成器可以作为协程使 ...

  5. python协程--yield和yield from

    字典为动词“to yield”给出了两个释义:产出和让步.对于 Python 生成器中的 yield 来说,这两个含义都成立.yield item 这行代码会产出一个值,提供给 next(...) 的 ...

  6. 简述 yield和yield from关键字

    1.可迭代对象与迭代器的区别 可迭代对象:指的是具备可迭代的能力,即enumerable.  在Python中指的是可以通过for-in 语句去逐个访问元素的一些对象,比如元组tuple,列表list ...

  7. python yield && scrapy yield

    title: python yield && scrapy yield date: 2020-03-17 16:00:00 categories: python tags: 语法 yi ...

  8. 从yield到yield from再到python协程

    yield 关键字 def fib(): a,b = 0,1 while 1: yield b a,b = b,a+b yield是在:PEP 255 -- Simple Generators 这个p ...

  9. python莫名其妙的yield, yield from, yield.send

    练了几行代码, 慢慢找感觉. TASK,多线程,异步,很多地方都用到的呢. #!/usr/bin/env python # -*- coding: utf-8 -*- import time from ...

随机推荐

  1. echo和重定向

    命令: echo 作用: echo有重复的意思,会在终端中显示参数指定的文字,通常会和重定向联合使用 使用: echo 文字内容 例子: 在终端中显示hello echo hello 命令: > ...

  2. Confluence 6 恢复一个空间

    你可以导出一个空间 – 包括页面,评论和附件到一个压缩的 XML 文件中,可选的你可以在 XML 文件中包括所有空间使用的附件.希望导入空间到其他的 Confluence 站点中,请按照下面的方法进行 ...

  3. openmp

    https://blog.csdn.net/fuwenyan/article/details/79500765a https://www.cnblogs.com/yangyangcv/archive/ ...

  4. (不断更新)关于显著性检测的调研-Salient Object Detection: A Survey

    <Salient Object Detection: A Survey>作者:Ali Borji.Ming-Ming Cheng.Huaizu Jiang and Jia Li 基本按照文 ...

  5. 单击列表行前边的checkbox被选中,再单击,取消选中

    需求描述:单击datatabl的一行数据,前边的checkbox被勾选上,再次点击,选中取消,第一次碰到这种需求,不过呢也很实用,简单记录一下 代码: //html代码<tr class=&qu ...

  6. CentOS7+mysql(yum)

    1.现在centos上默认是没有yum源的,yum安装的是 MariaDB.所以我们需要自己先配置yum源.配置yum源步骤如下: 下载yum源:wget 'https://dev.mysql.com ...

  7. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)

    有时候,当我们使用“mysql”.“mysqladmin”.“mysqldump”等命令管理数据库时,服务器抛出类似如下错误: ERROR (HY000): Can't connect to loca ...

  8. c++ 链表基础功能实现

    #include<stack> struct ListNode { int m_nValue; ListNode* m_pNext; }; ListNode* CreateListNode ...

  9. JQuery之左侧菜单

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 理解DeepBox算法

    理解DeepBox算法 基本情况 论文发表在ICCV2015,作者是Berkeley的博士生Weicheng Kuo: @inproceedings{KuoICCV15DeepBox, Author ...