在介绍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相关推荐

  1. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  2. [翻译]Python中yield的解释

    问题: Python中yield关键字的作用是什么?它做了什么? 例如,我想理解以下代码 def node._get_child_candidates(self, distance, min_dist ...

  3. Python中yield简单用法

    Python中yield简单用法 你或许知道带有yield的函数在Python中被称之为generator,那何为 generator? 我们暂时抛开generator,先从一个常见编程题目开始,循序 ...

  4. python 中 yield 的使用

    python中yield在函数中的使用 正是因为函数含有这个yield,所以,该函数不再是普通的函数,而是生成器函数(generator function).下面通过小例子来说明一下这个内置函数的特性 ...

  5. python的yield是什么意思,python生成器是怎么使用的 python中yield是什么意思

    python中return和yield怎么用的?两个有什么区别?你从未驯服过她,她只是在爱你的时候收起獠牙. yield yield是用于生成器.什么是生成器,你可以通俗的认为,在一个函数中,使用了y ...

  6. python中yield的用法(生成器的讲解)

    2 理解说明yield与生成器 在Python中,使用yield的函数被称为生成器函数(generator function). 生成器有两种方法:next()和send(),都可以调用生成器 yie ...

  7. python yield理解_对Python中Yield的理解

    看到下面这段程序的时候,有点不明白这个yield到底是个啥东西,看了网上很多的博客,大致理解了yield的含义,所以记录下来. 要说yield首先要说python中的生成器,那么什么是生成器? 假设有 ...

  8. python中yield使用

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

  9. python中yield的用法

    在 Python 开发中,yield 关键字的使用其实较为频繁,例如大集合的生成,简化代码结构.协程与并发都会用到它. 生成器 如果在一个方法内,包含了 yield 关键字,那么这个函数就是一个「生成 ...

最新文章

  1. 5行Python实现验证码识别,太稳了
  2. 如何查看和停止Linux启动的服务
  3. PMBOK项目管理PMI主义\IPMA概述
  4. openssl 从cer文件中提取公钥
  5. Cisco DHCP and NAT config
  6. python 加载与解析xml
  7. IOS TableView的Cell高度自适应,UILabel自动换行适应
  8. hud 4455 Substrings 解题报告
  9. bzoj1207: [HNOI2004]打鼹鼠
  10. 前端学习(1679):前端系列实战课程之为蛇创建食物对象
  11. JavaScript设计模式返璞归真
  12. Java Web学习笔记03:JSP元素
  13. hibernateTemplate.find或hibernateTemplate.save()执行操作没有反应,但是有sql语句
  14. 大型网站架构, 缓存的几点
  15. c语言标识符附录,附录AC语言运算符表.PDF
  16. 用户 ID 生成唯一邀请码的几种方法
  17. Visio-Cisco-华为-IBM网络设备官方模板
  18. 0006 -求三个数的平均数
  19. rpgmakermv \c 常用颜色一览
  20. STM32初学者KILE5软件的使用

热门文章

  1. struts2+extjs文件上传完整实现(攻克了上传中的各种问题)
  2. DOMBOM(source、methods、contents、Application)
  3. ASP.NET Aries 3.0发布(附带通用API设计及基本教程介绍)
  4. 启动Tomcat 7一闪而过的问题
  5. HDU 1715 大菲波数 (大数问题)
  6. MyEclipse6.5与Perforce的集成
  7. mongoose操作mongodb
  8. Hadoop学习之路(九)HDFS深入理解
  9. 数据库之间数据转换最快方法
  10. Hive的安装和配置