Python中yield
在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(Generator)。
一、迭代器(iterator)
在Python中,for循环可以用于Python中的任何类型,包括列表、元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器
迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发 StopIteration。任何这类的对象在Python中都可以用for循环或其他遍历工具迭代,迭代工具内部会在每次迭代时调用next方法,并且 捕捉StopIteration异常来确定何时离开。
使用迭代器一个显而易见的好处就是:每次只从对象中读取一条数据,不会造成内存的过大开销。
比如要逐行读取一个文件的内容,利用readlines()方法,我们可以这么写:
for line in open("test.txt").readlines():print line
这样虽然可以工作,但不是最好的方法。因为他实际上是把文件一次加载到内存中,然后逐行打印。当文件很大时,这个方法的内存开销就很大了。
利用file的迭代器,我们可以这样写:
for line in open("test.txt"): #use file iteratorsprint line
这是最简单也是运行速度最快的写法,他并没显式的读取文件,而是利用迭代器每次读取下一行。
二、生成器(Generator)
生成器函数在Python中与迭代器协议的概念联系在一起。简而言之,包含yield语句的函数会被特地编译成生成器。当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。函数也许会有个return语句,但它的作用是用来yield产生值的。
不像一般的函数会生成值后退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效
>>> def g(n):
... for i in range(n):
... yield i **2
...
>>> for i in g(5):
... print i,":",
...
0 : 1 : 4 : 9 : 16 :
要了解他的运行原理,我们来用next方法看看:
>>> t = g(5)
>>> t.next()
0
>>> t.next()
1
>>> t.next()
4
>>> t.next()
9
>>> t.next()
16
>>> t.next()
Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration
在运行完5次next之后,生成器抛出了一个StopIteration异常,迭代终止。
再来看一个yield的例子,用生成器生成一个Fibonacci数列:
def fab(max):a,b = 0,1while a < max:yield aa, b = b, a+b>>> for i in fab(20):
... print i,",",
...
0 , 1 , 1 , 2 , 3 , 5 , 8 , 13 ,
看到这里应该就能理解生成器那个很抽象的概念了吧~~
转载于:https://blog.51cto.com/tianxingzhe/1722897
Python中yield相关推荐
- Python中yield和yield from的用法
yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...
- [翻译]Python中yield的解释
问题: Python中yield关键字的作用是什么?它做了什么? 例如,我想理解以下代码 def node._get_child_candidates(self, distance, min_dist ...
- Python中yield简单用法
Python中yield简单用法 你或许知道带有yield的函数在Python中被称之为generator,那何为 generator? 我们暂时抛开generator,先从一个常见编程题目开始,循序 ...
- python 中 yield 的使用
python中yield在函数中的使用 正是因为函数含有这个yield,所以,该函数不再是普通的函数,而是生成器函数(generator function).下面通过小例子来说明一下这个内置函数的特性 ...
- python的yield是什么意思,python生成器是怎么使用的 python中yield是什么意思
python中return和yield怎么用的?两个有什么区别?你从未驯服过她,她只是在爱你的时候收起獠牙. yield yield是用于生成器.什么是生成器,你可以通俗的认为,在一个函数中,使用了y ...
- python中yield的用法(生成器的讲解)
2 理解说明yield与生成器 在Python中,使用yield的函数被称为生成器函数(generator function). 生成器有两种方法:next()和send(),都可以调用生成器 yie ...
- python yield理解_对Python中Yield的理解
看到下面这段程序的时候,有点不明白这个yield到底是个啥东西,看了网上很多的博客,大致理解了yield的含义,所以记录下来. 要说yield首先要说python中的生成器,那么什么是生成器? 假设有 ...
- python中yield使用
16.yield使用 列表推导与生成器表达式 当我们创建了一个列表的时候,就创建了一个可以迭代的对象: >>> squares=[n*n for n in range(3)] > ...
- python中yield的用法
在 Python 开发中,yield 关键字的使用其实较为频繁,例如大集合的生成,简化代码结构.协程与并发都会用到它. 生成器 如果在一个方法内,包含了 yield 关键字,那么这个函数就是一个「生成 ...
最新文章
- 5行Python实现验证码识别,太稳了
- 如何查看和停止Linux启动的服务
- PMBOK项目管理PMI主义\IPMA概述
- openssl 从cer文件中提取公钥
- Cisco DHCP and NAT config
- python 加载与解析xml
- IOS TableView的Cell高度自适应,UILabel自动换行适应
- hud 4455 Substrings 解题报告
- bzoj1207: [HNOI2004]打鼹鼠
- 前端学习(1679):前端系列实战课程之为蛇创建食物对象
- JavaScript设计模式返璞归真
- Java Web学习笔记03:JSP元素
- hibernateTemplate.find或hibernateTemplate.save()执行操作没有反应,但是有sql语句
- 大型网站架构, 缓存的几点
- c语言标识符附录,附录AC语言运算符表.PDF
- 用户 ID 生成唯一邀请码的几种方法
- Visio-Cisco-华为-IBM网络设备官方模板
- 0006 -求三个数的平均数
- rpgmakermv \c 常用颜色一览
- STM32初学者KILE5软件的使用
热门文章
- struts2+extjs文件上传完整实现(攻克了上传中的各种问题)
- DOMBOM(source、methods、contents、Application)
- ASP.NET Aries 3.0发布(附带通用API设计及基本教程介绍)
- 启动Tomcat 7一闪而过的问题
- HDU 1715 大菲波数 (大数问题)
- MyEclipse6.5与Perforce的集成
- mongoose操作mongodb
- Hadoop学习之路(九)HDFS深入理解
- 数据库之间数据转换最快方法
- Hive的安装和配置