原文:https://stackoverflow.com/que...

我的微信公众号:python每日一练

要理解什么是 yield,必须理解什么是生成器(generator)。在理解生成器之前,让我们先了解迭代。

迭代

当你建立了一个列表,你可以逐个地访问这个列表的元素,而这个访问的过程叫做迭代(iteration)

>>> mylist = [1, 2, 3]
>>> for i in mylist:
...    print(i)
1
2
3

代码中的mylist就是一个可迭代对象(iterable),当你使用列表生成式时,你就创建了一个list,同时也创建了一个可迭代对象:

>>> mylist = [x*x for x in range(3)]
>>> for i in mylist:
...    print(i)
0
1
4

凡是能使用for...in...语句的对象,都叫做可迭代对象,例如:liststring、文件等等

这些可迭代对象非常方便,因为你可以根据自己的需要来访问它们。但是同时也需要将所有的值存入内存当中,无论你是不是需要所有的值,可能对于一个列表[x for x in range(100000)],你仅仅想拿到里面的素数,但当这个列表生成式被执行的时候,已经将所有100000个数字存入了内存中。

生成器

生成器是一种只能迭代一次的迭代器,生成器不会一次将所有的元素存入内存中,而是一边迭代一边运算:

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...    print(i)
0
1
4

这份代码看起来和上面的代码没有什么区别。但是你不能再次执行for i in mygenerator,因为生成器只能使用一次:

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...     print(i)
...
0
1
4
>>> for i in mygenerator:
...     print(i)
...
>>>

Yield

yield的使用和return的使用没什么区别,只是yield会返回一个生成器

>>> def createGenerator():
...    mylist = range(3)
...    for i in mylist:
...        yield i*i
...
>>> mygenerator = createGenerator() # 创建一个生成器
>>> print(mygenerator) # mygenerator是一个对象!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
...     print(i)
0
1
4

当你的函数需要返回一个很大的元素集合,并且每个元素只需要用到一次的时候,使用yield会非常方便

要想理解yield,你必须理解当你调用一个包含yield的函数的时候,函数体代码并不会执行,这个函数仅仅是返回一个生成器而已

>>> def createGenerator():
...     print('head')
...     for i in range(5):
...         yield i*i
...     print('tail')
...
>>> createGenerator()
<generator object createGenerator at 0x0000023454FB5990>

当你第一次向后迭代(用nextfor...in...语句时)这个生成器时,函数体才会从最开始执行到yield处然后返回yield的值,随后再次向后迭代,会执行剩余的代码然后再次遇到yield停止并返回值。直到运行到函数结尾处停止,此时如果是用next()则会抛出StopIteration异常,如果是用for...in...则会结束循环并且不会有异常

>>> def createGenerator():
...     print('head')
...     for i in range(5):
...         yield i*i
...     print('tail')
...
>>> g = createGenerator()
>>> next(g)
head
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
tail
Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration

[译]yield关键字都做了什么?相关推荐

  1. python里的关键字有哪些_Python中的yield关键字做了什么?

    Python中的yield关键字做了什么 要理解yield做了什么,就必须明白生成器(generators)为何物,而在明白生成器之前还要知道迭代器(iterables). 1.迭代器 当我们创建一个 ...

  2. 反编译使用yield关键字的方法

    我认为这是一个真命题:"没有用.NET Reflector反编译并阅读过代码的程序员不是专业的.NET程序员"..NET Reflector强大的地方就在于可以把IL代码反编译成可 ...

  3. C#中使用的yield关键字是什么?

    在" 如何仅显示IList <>的片段"问题中,答案之一具有以下代码片段: IEnumerable<object> FilteredList() {fore ...

  4. “ yield”关键字有什么作用?

    Python中yield关键字的用途是什么? 它有什么作用? 例如,我试图理解这段代码1 : def _get_child_candidates(self, distance, min_dist, m ...

  5. python function if yield_Python中的yield关键字

    Python中的yield关键字 这是stackoverflow上一个关于yield关键字的问题以及它被推荐次数最高的一个答案 问题: Python中的yield关键字是什么?它是用来做什么的? 例如 ...

  6. Python 生成器 和 yield 关键字

    Python 中 yield 的作用:http://youchen.me/2017/02/10/Python-What-does-yield-do/# Python 生成器详解:http://codi ...

  7. “yield”关键字有什么作用?

    问题描述: 想要改进这篇文章?提供这个问题的详细答案,包括引文和解释为什么你的答案是正确的.没有足够细节的答案可能会被编辑或删除. Python 中的 yield 关键字有什么用?它有什么作用? 例如 ...

  8. 人肉反编译使用yield关键字的方法

    我认为这是一个真命题:"没有用.NET Reflector反编译并阅读过代码的程序员不是专业的.NET程序员"..NET Reflector强大的地方就在于可以把IL代码反编译成可 ...

  9. Python中的yield关键字及表达式、生成器、生成器迭代器、生成器表达式详解

    文章目录 1. yield关键字及表达式.生成器.生成器迭代器.生成器表达式 1.1 yield关键字及表达式(yield expression) 1.1.1 yield关键字 1.1.2 yield ...

最新文章

  1. photoshop 图片转 pdf
  2. 量子信息技术研究现状与未来——郭光灿
  3. 关于微型计算机主板的描述错误的是,2016年9月计算机一级考试试题及答案「单选」...
  4. 1.4编程基础之逻辑表达式与条件分支 18 点和正方形的关系
  5. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_16_注解_自定义注解_元注解...
  6. 【优化求解】基于matlab蚁群算法的函数优化分析【含Matlab源码 219期】
  7. [行业报告] 芒果发布8月份国内移动广告平台数据报告
  8. 最新服务器处理器天梯,服务器CPU性能排行榜天梯图(双路/三路/四路)
  9. Win10企业版激活方法
  10. 计算机id换系统会变吗,小雷问答丨手机恢复出厂设置后会变成最原始的系统吗?...
  11. 日期计算器输入天数计算日期_计算日期范围内的活动
  12. 曼达洛人对机器人的评价_我们请来了五位星战粉,来一起听听他们对于《曼达洛人》第一季的感想吧...
  13. 服务器丢包都有哪些原因?
  14. FAST-LIO2代码解析(六)
  15. ios swift收起键盘
  16. Java常用消息摘要算法-MD5
  17. 实现在线播放Wav音频文件,支持IE和Google
  18. ECharts之阶梯瀑布柱状图
  19. 前端的组件化和模块化
  20. ffmpeg合并视频时的尺寸注意事项

热门文章

  1. webstorm 不识别.config文件_webstorm好用的十款插件
  2. mysql show full processlist;_mysql show full processlist 详解
  3. c++builder传递参数_参数按值传递和按地址传递过程中,指向内存的指针如何变化?...
  4. 数据结构和算法:全面的算法代码库
  5. Android多媒体开发:录音机
  6. sublime text 2 下的Markdown写作
  7. 服务器堡垒机登录方式
  8. python编程语言继承_python应用:学习笔记(Python继承)
  9. java private 变量_java 的private的用法保护成员变量的值,将值判断
  10. 使用Asible连接被控端SHH拒绝解决办法