[译]yield关键字都做了什么?
原文: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...
语句的对象,都叫做可迭代对象,例如:list
、string
、文件等等
这些可迭代对象非常方便,因为你可以根据自己的需要来访问它们。但是同时也需要将所有的值存入内存当中,无论你是不是需要所有的值,可能对于一个列表[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>
当你第一次向后迭代(用next
或for...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关键字都做了什么?相关推荐
- python里的关键字有哪些_Python中的yield关键字做了什么?
Python中的yield关键字做了什么 要理解yield做了什么,就必须明白生成器(generators)为何物,而在明白生成器之前还要知道迭代器(iterables). 1.迭代器 当我们创建一个 ...
- 反编译使用yield关键字的方法
我认为这是一个真命题:"没有用.NET Reflector反编译并阅读过代码的程序员不是专业的.NET程序员"..NET Reflector强大的地方就在于可以把IL代码反编译成可 ...
- C#中使用的yield关键字是什么?
在" 如何仅显示IList <>的片段"问题中,答案之一具有以下代码片段: IEnumerable<object> FilteredList() {fore ...
- “ yield”关键字有什么作用?
Python中yield关键字的用途是什么? 它有什么作用? 例如,我试图理解这段代码1 : def _get_child_candidates(self, distance, min_dist, m ...
- python function if yield_Python中的yield关键字
Python中的yield关键字 这是stackoverflow上一个关于yield关键字的问题以及它被推荐次数最高的一个答案 问题: Python中的yield关键字是什么?它是用来做什么的? 例如 ...
- Python 生成器 和 yield 关键字
Python 中 yield 的作用:http://youchen.me/2017/02/10/Python-What-does-yield-do/# Python 生成器详解:http://codi ...
- “yield”关键字有什么作用?
问题描述: 想要改进这篇文章?提供这个问题的详细答案,包括引文和解释为什么你的答案是正确的.没有足够细节的答案可能会被编辑或删除. Python 中的 yield 关键字有什么用?它有什么作用? 例如 ...
- 人肉反编译使用yield关键字的方法
我认为这是一个真命题:"没有用.NET Reflector反编译并阅读过代码的程序员不是专业的.NET程序员"..NET Reflector强大的地方就在于可以把IL代码反编译成可 ...
- Python中的yield关键字及表达式、生成器、生成器迭代器、生成器表达式详解
文章目录 1. yield关键字及表达式.生成器.生成器迭代器.生成器表达式 1.1 yield关键字及表达式(yield expression) 1.1.1 yield关键字 1.1.2 yield ...
最新文章
- photoshop 图片转 pdf
- 量子信息技术研究现状与未来——郭光灿
- 关于微型计算机主板的描述错误的是,2016年9月计算机一级考试试题及答案「单选」...
- 1.4编程基础之逻辑表达式与条件分支 18 点和正方形的关系
- 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_16_注解_自定义注解_元注解...
- 【优化求解】基于matlab蚁群算法的函数优化分析【含Matlab源码 219期】
- [行业报告] 芒果发布8月份国内移动广告平台数据报告
- 最新服务器处理器天梯,服务器CPU性能排行榜天梯图(双路/三路/四路)
- Win10企业版激活方法
- 计算机id换系统会变吗,小雷问答丨手机恢复出厂设置后会变成最原始的系统吗?...
- 日期计算器输入天数计算日期_计算日期范围内的活动
- 曼达洛人对机器人的评价_我们请来了五位星战粉,来一起听听他们对于《曼达洛人》第一季的感想吧...
- 服务器丢包都有哪些原因?
- FAST-LIO2代码解析(六)
- ios swift收起键盘
- Java常用消息摘要算法-MD5
- 实现在线播放Wav音频文件,支持IE和Google
- ECharts之阶梯瀑布柱状图
- 前端的组件化和模块化
- ffmpeg合并视频时的尺寸注意事项
热门文章
- webstorm 不识别.config文件_webstorm好用的十款插件
- mysql show full processlist;_mysql show full processlist 详解
- c++builder传递参数_参数按值传递和按地址传递过程中,指向内存的指针如何变化?...
- 数据结构和算法:全面的算法代码库
- Android多媒体开发:录音机
- sublime text 2 下的Markdown写作
- 服务器堡垒机登录方式
- python编程语言继承_python应用:学习笔记(Python继承)
- java private 变量_java 的private的用法保护成员变量的值,将值判断
- 使用Asible连接被控端SHH拒绝解决办法