阅读别人的python源码时碰到了这个yield这个关键字,各种搜索终于搞懂了,在此做一下总结:

  1. 通常的for...in...循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件。它可以是mylist = [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。
    它的缺陷是所有数据都在内存中,如果有海量数据的话将会非常耗内存。
  2. 生成器是可以迭代的,但只可以读取它一次。因为用的时候才生成。比如 mygenerator = (x*x for x in range(3)),注意这里用到了(),它就不是数组,而上面的例子是[]。
  3. 我理解的生成器(generator)能够迭代的关键是它有一个next()方法,工作原理就是通过重复调用next()方法,直到捕获一个异常。可以用上面的mygenerator测试。
  4. 带有 yield 的函数不再是一个普通函数,而是一个生成器generator,可用于迭代,工作原理同上。
  5. yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码(下一行)开始执行。
  6. 简要理解:yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始。
  7. 带有yield的函数不仅仅只用于for循环中,而且可用于某个函数的参数,只要这个函数的参数允许迭代参数。比如array.extend函数,它的原型是array.extend(iterable)。
  8. send(msg)与next()的区别在于send可以传递参数给yield表达式,这时传递的参数会作为yield表达式的值,而yield的参数是返回给调用者的值。——换句话说,就是send可以强行修改上一个yield表达式值。比如函数中有一个yield赋值,a = yield 5,第一次迭代到这里会返回5,a还没有赋值。第二次迭代时,使用.send(10),那么,就是强行修改yield 5表达式的值为10,本来是5的,那么a=10
  9. send(msg)与next()都有返回值,它们的返回值是当前迭代遇到yield时,yield后面表达式的值,其实就是当前迭代中yield后面的参数。
  10. 第一次调用时必须先next()或send(None),否则会报错,send后之所以为None是因为这时候没有上一个yield(根据第8条)。可以认为,next()等同于send(None)。

彻底理解Python中的yield相关推荐

  1. 深入理解Python中的yield和send

    send方法和next方法唯一的区别是在执行send方法会首先把上一次挂起的yield语句的返回值通过参数设定,从而实现与生成器方法的交互. 但是需要注意,在一个生成器对象没有执行next方法之前,由 ...

  2. 理解Python中的yield

    理解Python中的yield 参考文献 本文浅谈自己对Python中yield关键字的理解. yield可以理解成return,但是它与return又不完全相同.在Python中,yield关键字是 ...

  3. 由浅入深|让你彻底理解Python中的yield

    没有用过的东西,没有深刻理解的东西很难说自己会,而且被别人一问必然破绽百出.虽然之前有接触过python中的生成器的概念,但是只是走马观花,这两天的一次交谈中,别人问到了生成器,顿时语塞,死活想不起来 ...

  4. python中yield讲解_「技术」如何深入理解Python中的 yield?

    深入理解 yield 为了理解什么是 yield,你必须理解什么是生成器.在理解生成器之前,让我们先走近迭代. Iterables 当你建立了一个列表,你可以逐项地读取这个列表,这叫做一个可迭代对象: ...

  5. python iterable对象_如何理解Python中的iterable对象

    转载请注明出处:https://www.jianshu.com/u/5e6f798c903a [^*] 表示注脚,在文末可以查看对应连接,但简书不支持该语法. 首先,容器和 iterable 间没有必 ...

  6. python的上下文管理用哪个关键字_正确理解python中的关键字“with”与上下文管理器...

    正确理解python中的关键字"with"与上下文管理器 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  正确理解python中的关键字&quo ...

  7. 更深入理解 Python 中的迭代

    (点击上方公众号,可快速关注) 编译: linux中国 / MjSeven   英文:  Trey Hunner https://linux.cn/article-9681-1.html 深入探讨 P ...

  8. 理解 Python 中的 for 循环

    译者注: 本文翻译自 Trey Hunner 于 2019 年 6 月 18 日发表的文章 Loop Better: a deeper look at iteration in Python 文中括号 ...

  9. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

    python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...

最新文章

  1. 【搜】mysql压缩包减肥
  2. 数据预测之BP神经网络具体应用以及matlab实现
  3. NS2相关学习——完成一个新的协议(1)
  4. saltstack之基础入门系列文章简介
  5. 塔菲尔曲线斜率的大小_中国第一塔,与埃菲尔铁塔齐名,到底有多强悍?
  6. 蛙蛙推荐:在c#使用IOCP(完成端口)的简单示例
  7. Windows下Node.js安装Canvas插件
  8. 几大经典算法c语言cnds,浮点数据有损压缩算法 附完整C代码
  9. ps写php,PS是什么
  10. 华南理工大学 电力电子技术(王兆安) 期末复习笔记3 第五章第六章第七章
  11. 测试移动硬盘的真实容量的软件,移动硬盘容量标识有猫腻:实际缩水99%
  12. 扩容内存卡用mydisktest失效,教你怎么用USBoot恢复出真实容量
  13. mybatis异常:java.lang.ExceptionInInitializerError
  14. ksoftirqd内核线程
  15. linux vim 编辑 保存 退出
  16. Java开发基础——配置文件的写入与读取
  17. 外挂太多怎么解?云上找出路
  18. 为杰克·韦尔奇点赞(我已离开通用)
  19. [分形学] 谢宾斯基 (Sierpinski) 三角形,也叫垫片
  20. android opengl版本,Android OpenGL ES(一)开发入门

热门文章

  1. 28行满分代码:L1-048 矩阵A乘以B (15分)
  2. c语言30人成绩平均分,用C语言编程平均分数
  3. 虚拟局域网Vlan与单臂路由、三层交换、链路聚合技术
  4. python调用窗口_如何调用一个函数并在另一个窗口中打开?
  5. markdown 流程图js_MarkDown 流程图示例
  6. git 只commit不push 会有影响吗_规范化团队 git 提交信息
  7. c语言第一个mfc程序,c语言之MFC的进程和线程
  8. c代码实现 ifft运算_fft算法c语言_matlab fft算法_ifft c语言
  9. c语言函数 t啥意思,C语言函数大全(t开头)
  10. bspline怎么使用 python_资源分享:微软官方的Python入门教程