彻底理解Python中的yield
阅读别人的python源码时碰到了这个yield这个关键字,各种搜索终于搞懂了,在此做一下总结:
- 通常的for...in...循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件。它可以是mylist = [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。
它的缺陷是所有数据都在内存中,如果有海量数据的话将会非常耗内存。 - 生成器是可以迭代的,但只可以读取它一次。因为用的时候才生成。比如 mygenerator = (x*x for x in range(3)),注意这里用到了(),它就不是数组,而上面的例子是[]。
- 我理解的生成器(generator)能够迭代的关键是它有一个next()方法,工作原理就是通过重复调用next()方法,直到捕获一个异常。可以用上面的mygenerator测试。
- 带有 yield 的函数不再是一个普通函数,而是一个生成器generator,可用于迭代,工作原理同上。
- yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码(下一行)开始执行。
- 简要理解:yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始。
- 带有yield的函数不仅仅只用于for循环中,而且可用于某个函数的参数,只要这个函数的参数允许迭代参数。比如array.extend函数,它的原型是array.extend(iterable)。
- send(msg)与next()的区别在于send可以传递参数给yield表达式,这时传递的参数会作为yield表达式的值,而yield的参数是返回给调用者的值。——换句话说,就是send可以强行修改上一个yield表达式值。比如函数中有一个yield赋值,a = yield 5,第一次迭代到这里会返回5,a还没有赋值。第二次迭代时,使用.send(10),那么,就是强行修改yield 5表达式的值为10,本来是5的,那么a=10
- send(msg)与next()都有返回值,它们的返回值是当前迭代遇到yield时,yield后面表达式的值,其实就是当前迭代中yield后面的参数。
- 第一次调用时必须先next()或send(None),否则会报错,send后之所以为None是因为这时候没有上一个yield(根据第8条)。可以认为,next()等同于send(None)。
彻底理解Python中的yield相关推荐
- 深入理解Python中的yield和send
send方法和next方法唯一的区别是在执行send方法会首先把上一次挂起的yield语句的返回值通过参数设定,从而实现与生成器方法的交互. 但是需要注意,在一个生成器对象没有执行next方法之前,由 ...
- 理解Python中的yield
理解Python中的yield 参考文献 本文浅谈自己对Python中yield关键字的理解. yield可以理解成return,但是它与return又不完全相同.在Python中,yield关键字是 ...
- 由浅入深|让你彻底理解Python中的yield
没有用过的东西,没有深刻理解的东西很难说自己会,而且被别人一问必然破绽百出.虽然之前有接触过python中的生成器的概念,但是只是走马观花,这两天的一次交谈中,别人问到了生成器,顿时语塞,死活想不起来 ...
- python中yield讲解_「技术」如何深入理解Python中的 yield?
深入理解 yield 为了理解什么是 yield,你必须理解什么是生成器.在理解生成器之前,让我们先走近迭代. Iterables 当你建立了一个列表,你可以逐项地读取这个列表,这叫做一个可迭代对象: ...
- python iterable对象_如何理解Python中的iterable对象
转载请注明出处:https://www.jianshu.com/u/5e6f798c903a [^*] 表示注脚,在文末可以查看对应连接,但简书不支持该语法. 首先,容器和 iterable 间没有必 ...
- python的上下文管理用哪个关键字_正确理解python中的关键字“with”与上下文管理器...
正确理解python中的关键字"with"与上下文管理器 来源:中文源码网 浏览: 次 日期:2018年9月2日 [下载文档: 正确理解python中的关键字&quo ...
- 更深入理解 Python 中的迭代
(点击上方公众号,可快速关注) 编译: linux中国 / MjSeven 英文: Trey Hunner https://linux.cn/article-9681-1.html 深入探讨 P ...
- 理解 Python 中的 for 循环
译者注: 本文翻译自 Trey Hunner 于 2019 年 6 月 18 日发表的文章 Loop Better: a deeper look at iteration in Python 文中括号 ...
- python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递
python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...
最新文章
- 【搜】mysql压缩包减肥
- 数据预测之BP神经网络具体应用以及matlab实现
- NS2相关学习——完成一个新的协议(1)
- saltstack之基础入门系列文章简介
- 塔菲尔曲线斜率的大小_中国第一塔,与埃菲尔铁塔齐名,到底有多强悍?
- 蛙蛙推荐:在c#使用IOCP(完成端口)的简单示例
- Windows下Node.js安装Canvas插件
- 几大经典算法c语言cnds,浮点数据有损压缩算法 附完整C代码
- ps写php,PS是什么
- 华南理工大学 电力电子技术(王兆安) 期末复习笔记3 第五章第六章第七章
- 测试移动硬盘的真实容量的软件,移动硬盘容量标识有猫腻:实际缩水99%
- 扩容内存卡用mydisktest失效,教你怎么用USBoot恢复出真实容量
- mybatis异常:java.lang.ExceptionInInitializerError
- ksoftirqd内核线程
- linux vim 编辑 保存 退出
- Java开发基础——配置文件的写入与读取
- 外挂太多怎么解?云上找出路
- 为杰克·韦尔奇点赞(我已离开通用)
- [分形学] 谢宾斯基 (Sierpinski) 三角形,也叫垫片
- android opengl版本,Android OpenGL ES(一)开发入门
热门文章
- 28行满分代码:L1-048 矩阵A乘以B (15分)
- c语言30人成绩平均分,用C语言编程平均分数
- 虚拟局域网Vlan与单臂路由、三层交换、链路聚合技术
- python调用窗口_如何调用一个函数并在另一个窗口中打开?
- markdown 流程图js_MarkDown 流程图示例
- git 只commit不push 会有影响吗_规范化团队 git 提交信息
- c语言第一个mfc程序,c语言之MFC的进程和线程
- c代码实现 ifft运算_fft算法c语言_matlab fft算法_ifft c语言
- c语言函数 t啥意思,C语言函数大全(t开头)
- bspline怎么使用 python_资源分享:微软官方的Python入门教程