使用了 yield 语句的函数称为生成器(generator)。与普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,因此生成器实际上是一种特殊的迭代器。调用一个生成器函数,返回的是一个迭代器对象。

使用 yield 语句相当于为函数封装好 __iter__() 和 __next__() 方法。在调用生成器运行的过程中,每次遇到 yield 语句时函数会暂停并保存函数执行的状态,返回 yield 语句中表达式的值,并在下一次执行 next( ) 方法时从当前位置继续运行。

yield 可以理解为“return”,返回其后表达式的值给调用者。不同的是 return 返回后,函数会释放,而生成器则不会。在直接调用 next 方法或用 for 语句进行下一次迭代时,生成器会从 yield 下一句开始执行,直至遇到下一个 yield。

以下代码使用带 yield 语句的生成器得到斐波那契数列:

import sys

def Fibonacci(n):

a, b, counter = 0, 1, 0

while True:

if(counter > n):

return

yield a

a, b = b, a + b

counter += 1

f = Fibonacci(15)

while True:

try:

print(next(f), end=" ")

except StopIteration:

sys.exit()

上述代码的运行结果如下所示:

>>> import sys

>>> def Fibonacci(n):

... a, b, counter = 0, 1, 0

... while True:

... if(counter > n):

... return

... yield a

... a, b = b, a + b

... counter += 1

>>> while True:

... try:

... print(next(f), end=" ")

... except StopIteration:

... sys.exit()

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610

不带 yield 语句的生成器可以用来定义生成器表达式,将列表转换为元组。使用生成器表达式取代列表推导式可以同时节省 CPU 和内存资源。例如:

L = [1, 2, 3, 4, 5]

T = tuple(i for i in L)

print(T)

上述代码的运行结果如下所示:

>>> L = [1, 2, 3, 4, 5]

>>> T = tuple(i for i in L)

>>> print(T)

(1, 2, 3, 4, 5)

一些 Python 内置函数可以识别这是生成器表达式,直接代入运算,例如:

print(sum(i for i in range(100)))

上述代码的运行结果如下所示:

>>> print(sum(i for i in range(100)))

4950

注意,根据左开右闭原则,上述代码中的 range(100) 得到的列表是从 0 到 99,不包括 100。

pythonyield详解_Python yield生成器详解相关推荐

  1. python协程详解_python协程详解

    原博文 2019-10-25 10:07 − # python协程详解 ![python协程详解](https://pic2.zhimg.com/50/v2-9f3e2152b616e89fbad86 ...

  2. python 元类 详解_Python 元类详解 __new__、__init__、__call__、__metacalss__

    了解元类之前,先了解几个魔术方法: __new__.__init__.__call__ __new__: 对象的创建,是一个静态方法,第一个参数是cls.(想想也是,不可能是self,对象还没创建,哪 ...

  3. python pexpect模块详解_python pexpect原理详解及使用说明

    pexpect是python中用于实现SSH,FTP,telnet等命令进行自动化交互,从而无需人工干预实现自动化运维的一个第三方扩展模块.理论的描述过于抽象,这里首先设想一下,如果让您设计一个实现自 ...

  4. pythonturtle库函数详解_Python turtle库详解

    Python turtle库详解 Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在 ...

  5. pythonnumpy详解_Python:Numpy详解

    NumPy Ndarray 对象 NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引. ndarray 对象是用于存放 ...

  6. python3装饰器详解_Python装饰器详解

    按照 Python 的编程原则,当一个函数被定义后,如要修改或扩展其功能应尽量避免直接修改函数定义的代码段,否则该函数在其他地方被调用时将无法正常运行.因此,当需要修改或扩展已被定义的函数的功能而不希 ...

  7. python中configparser详解_python ConfigParser模块详解

    功能介绍 在程序中使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是ConfigParser,这里简单 ...

  8. python类和对象详解_Python公开课 - 详解面向对象

    前言 在C语言中,单纯通过结构化的函数也可以实现很好的软件,顺序思路比较好理解:而C++则以面向对象的思维来进行代码组织,通过定义对象.成员变量.成员函数.以封装.继承和多态等方式来更灵活处理业务逻辑 ...

  9. python中time模块详解_Python time模块详解

    time 模块主要包含各种提供日期.时间功能的类和函数.该模块既提供了把日期.时间格式化为字符串的功能,也提供了从字符串恢复日期.时间的功能. 在 Python 的交互式解释器中先导入 time 模块 ...

最新文章

  1. 解散了地图接口讨论群
  2. Deep learning From Image to Sequence
  3. Android开源框架——图片加载库Glide
  4. C语言练习题——动态数组
  5. YoloV5代码详细解读
  6. 融云任杰:强互动,RTC下一个“爆点”场景|拟合
  7. python安装库pandas_安装python的第三方库 geopandas
  8. 刷爆了!BAT这场AI芯片之战,你更支持谁​?
  9. In-Stream Big Data Processing
  10. linux下python、django框架的配置
  11. 【知识图谱系列】知识图谱的神经符号逻辑推理
  12. 对象转为json形式
  13. 专业显卡深度学习_MacOS+AMD-eGPU打造深度学习环境 | 第2期
  14. 国外免费图片素材站收集
  15. js中的shift()函数
  16. 我,程序员,32岁失业后干啥都赔钱,过去月薪2万的岁月不再重来 你呢?
  17. android 控件宽度自适应_自适应各Android手机屏幕尺寸的解决方法
  18. C语言经典项目之二——扫雷
  19. 毕业设计-基于微信小程序的医生随访系统
  20. 无人机飞控平台ArduPilot源码入门教程 — 简介

热门文章

  1. Powershell管理系列(三十九)PowerShell查询和解锁AD账号
  2. Docker四种网络模式
  3. 元素隐藏的三种方式对比(针对移动端项目中的按钮,先隐藏且不能被点击 visibility:hidden)
  4. linux du -hd1查看文件及目录所占磁盘空间
  5. Hadoop MapReduce指定yarn队列: -Dmapreduce.job.queuename
  6. lombok pom.xml依赖
  7. ubuntu安装pip包管理器
  8. golang变量定义细节及beego环境搭建细节记录
  9. 修改docker镜像的存储地址的方法(--graph)
  10. JVM调优:-XX:+UseConcMarkSweepGC 使用CMS垃圾回收器