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. [PHP]常量的一些特性

    1. define()函数如果定义了两个名称一模一样的常量,那么它将不会抛出错误,并且只有第一次的定义是生效的,再次定义并不会覆盖先前的值: define('ABC', 0); define('ABC ...

  2. 47)django-以put和delete方式提交数据

    一:说明 同一个页面以ajax实现增删改查,对应方法post,delete,put,get, 其中delete和put方式提交的数据在request.body中需要序列化处理. 二:示例 #模板提交数 ...

  3. input错误提示,点击提交,提示有未填项,屏幕滑到input未填项的位置

    function errorInfo(parm) { //获取文本框值 var $val = parm.val(); if ($val==""||undefined||null){ ...

  4. Confluence 6 配置 XSRF 保护

    Confluence 需要一个 XSRF 令牌才能创建一个评论,这个被用来保护用户不在评论区恶意发布内容.所有 Confluence 自定义的主题都被启用了这个功能,但是如果你使用自定义主题的话,可能 ...

  5. Confluence 6 浏览默认的 Decorators

    在任何时候,你都可以使用 "Site Layouts" 页面中的 "View Default" 来浏览默认的 decorator 文件.模板浏览器允许你查看使用 ...

  6. Confluence 6 自定义主面板

    主面板(dashboard)是你 Confluence 站点的默认载入页面.这个页面能够给用户能够找到其他页面的所有必须的工具,重新进入未完成的工作或者快速导航到喜欢的空间和页面 站点的欢迎信息将会在 ...

  7. Java的动手动脑(四)

    日期:2018.10.18 星期四 博客期:019 Part1:回答为啥会报错 答案:当然会报错啦!因为平常的编程过程中,系统会对我们写的类自动生成一个默认无参形式的构造方法,类似于C++中的体制!这 ...

  8. css样式之补充。。。

    css常用的一些属性: 1.去掉下划线 :text-decoration:none ;2.加上下划线: text-decoration: underline; 3.调整文本和图片的位置(也就是设置元素 ...

  9. vue指令

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>指令 ...

  10. easyUI-datagrid带有工具栏和分页器的数据网格

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>数据 ...