python yield 与 yield from转

https://blog.csdn.net/chenbin520/article/details/78111399?locationNum=7&fps=1

2017年09月27日 12:02:08

阅读数:10674

1、yield使用 
1)函数中使用yield,可以使函数变成生成器。一个函数如果是生成一个数组,就必须把数据存储在内存中,如果使用生成器,则在调用的时候才生成数据,可以节省内存。 
2)生成器方法调用时,不会立即执行。需要调用next()或者使用for循环来执行。使用for循环不需要自己捕获StopIteration异常。使用next()方法,当生产器方法执行结束会抛出StopIteration异常(只要不是使用yield返回数据,都会抛出StopIteration异常)。 
示例:

def fib(max):
n,a,b = 0,0,1
while n < max:
yield b
a, b = b, a+b
n = n + 1
return 'done' n = fib(10)
for n1 in n:
print(n1)

3)yield不仅可以返回值,也可以接收值。下面面示例为生产消费模式。生产者生产一条记录,消费者消费一条记录。 
4)调用生成器send方法传递数据时,必须先调用next(c)或者c.send(None)方法,执行到yield语句,等待接收数据。否则会报错。 
以下代码为廖雪峰网站的示例https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432090171191d05dae6e129940518d1d6cf6eeaaa969000

def consumer():
r = ''
while True:
n = yield r
if not n:
return
print('[CONSUMER] Consuming %s...' % n)
r = '200 OK' def produce(c):
c.send(None) # 和next方法一样 获取下一个值,必须先使用None参数调用一次, 执行到yield
n = 0
while n < 5:
n = n + 1
print('[PRODUCER] Producing %s...' % n)
r = c.send(n) # 先发送值给yield语句,再执行到yield语句时返回
print('[PRODUCER] Consumer return:%s' % r)
c.close() c = consumer()
produce(c)

2、yield from的使用 
1)为了让生成器(带yield函数),能简易的在其他函数中直接调用,就产生了yield from。 
2)以下代码,htest为生成器,itest通过yield from 直接调用htest。这样itest也变成了一个生成器。创建itest实例不断的去获取数据,当生成器执行结束时,会抛出StopIteration异常。那这个异常是htest抛出的,还是itest抛出的。通过捕获异常,会发现其实是itest抛出异常,htest并不会抛出StopIteration异常。 
3)yield from 也可以返回值,通过变量接收。变量接收的值,即htest使用return返回的值。示例代码中,当i==3时,会直接使用return返回,这时val的值就是100;因为htest函数中不是使用yield返回值,所以itest会继续执行print(val)语句。itest代码执行完,然而并没有使用yield返回数据(htest中没有,itest中也没有),所以马上会抛出StopIteration异常)(如果在itest函数最后使用yield返回一个数据,就不会抛出异常)。

def htest():
i = 1
while i < 4:
n = yield i
if i == 3:
return 100
i += 1 def itest():
val = yield from htest()
print(val) t = itest()
t.send(None)
j = 0
while j < 3:
j += 1
try:
t.send(j)
except StopIteration as e:
print('异常了')

python yield 与 yield from转的更多相关文章

  1. 关于Python中的yield

    关于Python中的yield   在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,f ...

  2. (转) Python Generators(生成器)——yield关键字

    http://blog.csdn.net/scelong/article/details/6969276 生成器是这样一个函数,它记住上一次返回时在函数体中的位置.对生成器函数的第二次(或第 n 次) ...

  3. Python生成器与yield

    列表推导与生成器表达式 当我们创建了一个列表的时候,就创建了一个可以迭代的对象: >>> squares=[n*n for n in range(3)] >>> f ...

  4. 【Python学习】yield send我就说这么多

    C#的yield已经忘得差不多了.又遇到python的yield.iterator def testYield(): print 'yield1' m = yield 1 print 'm =' , ...

  5. 从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 ...

  6. 深入理解Python中的yield和send

    send方法和next方法唯一的区别是在执行send方法会首先把上一次挂起的yield语句的返回值通过参数设定,从而实现与生成器方法的交互. 但是需要注意,在一个生成器对象没有执行next方法之前,由 ...

  7. Python:笔记(7)——yield关键字

    Python:笔记(7)——yield关键字 yield与生成器 所谓生成器是一个函数,它可以生成一个值的序列,以便在迭代中使用.函数使用yield关键字可以定义生成器对象. 一个例子 我们调用该函数 ...

  8. python协程--yield和yield from

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

  9. Python生成器(yield)

    对于调用一个普通的Python函数,一般是从函数的第一行代码开始执行,结束于return语句.异常或者函数所有语句执行完毕.一旦函数将控制权交还给调用者,就意味着全部结束.函数中做的所有工作以及保存在 ...

随机推荐

  1. 15. Password auditing (密码审核 12个)

    Aircrack是一套用于802.11a / b / g WEP和WPA破解的工具. 一旦收集到足够的加密数据包,它就会实现最有效的破解算法来恢复无线密钥.. 该套件包括十多个分离工具,包括airod ...

  2. 关于 legend_noa

    真名:qlw 性别:男 常用ID:legend_noa(有时候也用fseject以表示我的弱, 曾经不懂事用goddess_Q),具体意思是我最喜欢的两个奥特曼:诺亚和雷杰多 p1 诺亚,p2 雷杰多 ...

  3. 汇编实验一 查看CPU和内存,用机器指令和汇编语言指令编程

    在装完DosBox环境之后,就可以用debug模式进行汇编指令的编程了. 实验内容:      首先用a指令进行数据的储存,然后用t命令进行调试. 可以发现ax,bx在不同的命令下发生了改变,cs的地 ...

  4. Java Native

    native 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由 ...

  5. 转载一篇阿里云Terraform 开发指南

    连接:https://www.jianshu.com/p/0aebea117cae 是一个比较详细的开发指南          

  6. keepalived.conf配置说明

    vim /etc/keepalived/keepalived.conf配置信息如下! Configuration File for keepalived global_defs { notificat ...

  7. linux 解压缩总结

    总结1.*.tar 用 tar –xvf 解压2.*.gz 用 gzip -d或者gunzip 解压3.*.tar.gz和*.tgz 用 tar –xzf 解压4.*.bz2 用 bzip2 -d或者 ...

  8. Spring boot配置logback

    在application-dev.yml增加配置 配置文件的路径为 rescoures/evn/dev/logback-spring.xml <?xml version="1.0&qu ...

  9. abstract class VS interface

    关于抽象类 abstract class: 1. 抽象方法必须在抽象类中 2. 抽象类和抽象方法要用abstract 关键字修饰 3. 不可以用new 来实例化一个abstract类,因为调用抽象方法 ...

  10. 【转】Mysql索引设计原则

    来源:https://segmentfault.com/a/1190000000473085 假设一高频查询如下SELECT * FROM user WHERE area='amoy' AND sex ...