python yield 与 yield from转
python yield 与 yield from转
https://blog.csdn.net/chenbin520/article/details/78111399?locationNum=7&fps=1
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转的更多相关文章
- 关于Python中的yield
关于Python中的yield 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,f ...
- (转) Python Generators(生成器)——yield关键字
http://blog.csdn.net/scelong/article/details/6969276 生成器是这样一个函数,它记住上一次返回时在函数体中的位置.对生成器函数的第二次(或第 n 次) ...
- Python生成器与yield
列表推导与生成器表达式 当我们创建了一个列表的时候,就创建了一个可以迭代的对象: >>> squares=[n*n for n in range(3)] >>> f ...
- 【Python学习】yield send我就说这么多
C#的yield已经忘得差不多了.又遇到python的yield.iterator def testYield(): print 'yield1' m = yield 1 print 'm =' , ...
- 从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 ...
- 深入理解Python中的yield和send
send方法和next方法唯一的区别是在执行send方法会首先把上一次挂起的yield语句的返回值通过参数设定,从而实现与生成器方法的交互. 但是需要注意,在一个生成器对象没有执行next方法之前,由 ...
- Python:笔记(7)——yield关键字
Python:笔记(7)——yield关键字 yield与生成器 所谓生成器是一个函数,它可以生成一个值的序列,以便在迭代中使用.函数使用yield关键字可以定义生成器对象. 一个例子 我们调用该函数 ...
- python协程--yield和yield from
字典为动词“to yield”给出了两个释义:产出和让步.对于 Python 生成器中的 yield 来说,这两个含义都成立.yield item 这行代码会产出一个值,提供给 next(...) 的 ...
- Python生成器(yield)
对于调用一个普通的Python函数,一般是从函数的第一行代码开始执行,结束于return语句.异常或者函数所有语句执行完毕.一旦函数将控制权交还给调用者,就意味着全部结束.函数中做的所有工作以及保存在 ...
随机推荐
- Linux 开(关) ICMP 回应(防止被ping)
临时生效的办法 关闭回应: [root@host ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all // 客户端测试 ➜ ~ ping 0 ...
- Thread.yield( )通俗理解
一. Thread.yield( )方法: 使当前线程从执行状态(运行状态)变为可执行态(就绪状态).cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不 ...
- CS萌新的汇编学习之路(其实是老师作业呵呵哒)Learning of Assembly Language
第一节课学习汇编语言,做笔记,做笔记 1.概念 首先是汇编语言这门课程的定义以及对于学习高级语言.深入理解计算机系统的作用 软硬件接口机器语言 汇编语言 高级语言 关系 机器语言和汇编语言可移植性差 ...
- transmission跳过文件校验功能实现
贴吧链接:https://tieba.baidu.com/p/4839039900 GitHub:https://github.com/superlukia/transmission-2.92_ski ...
- Linux内核笔记:内存管理
逻辑地址由16位segment selector和offset组成 根据segment selector到GDT或LDT中去查找segment descriptor 32位base,20位limit, ...
- c++——智能指针学习(shared_ptr和weak_ptr)
先看一个例子:Stark和Targaryen家族你中有我,我中有你.我们设计以下类企图避免内存泄漏,使得析构函数都能调用到: #include<iostream> #include< ...
- Networked Graphics: Building Networked Games and Virtual Environments (Anthony Steed / Manuel Fradinho Oliveira 著)
PART I GROUNDWORK CHAPTER 1 Introduction CHAPTER 2 One on One (101) CHAPTER 3 Overview of the Intern ...
- vue cli 3.x的history 和 hash模式切换的问题
使用vue cli 3.x 创建的项目,有一个选项:Use history mode for router? (Requires proper server setup for index fallb ...
- 如何下载github子目录文件
比如下载pai子目录下dockerfile文件,可以在浏览器键入 https://raw.githubusercontent.com/Microsoft/pai/master/src/dev-box/ ...
- c# 正则表达式取值、替换
//例如我想把如下格式记录中的NAME值修改为WANG string line = "ADDR=1234;NAME=ZHANG;PHONE=6789"; Regex reg = n ...