看到下面这段程序的时候,有点不明白这个yield到底是个啥东西,看了网上很多的博客,大致理解了yield的含义,所以记录下来。

要说yield首先要说python中的生成器,那么什么是生成器?

假设有一个包含一百万个元素的列表,我们每次只需要这个列表中的一个元素。如果程序一开始就创建该列表的话,无疑要浪费大量存储空间。所以如果列表中的元素能够以某种方法推导出来,我们就可以根据程序的需要对列表元素进行生成,进而节省大量存储空间。这种一边循环一遍计算的机制,就是生成器。那么yield和生成器有什么关系?

如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是变成了一个生成器。

此时a是一个函数,而a()则是一个生成器对象。我们用下面的程序来看看yield函数到底怎么用。

程序开始时,初始化一个生成器a=a(0),然后通过next方法循环打印生成器中的元素。生成器中的yield其实就相当于一个断点,每次程序执行到一个yield,就将其后的值当做生成器的一个元素。然后再次调用next方法,就从yield之后继续运行,直到运行到程序结束。

从上面的程序来看,首先定义生成器对象a,然后进入主程序循环:

第一次调用next:进入a(i)内部,首先打印‘func a is running’,然后进入生成器循环。打印‘in circle’,表示当前生成器进入循环中,然后碰到yield i。此时将i的值作为第一个元素返回给生成器a,然后结束next方法,打印20个‘=’。

第二次调用next:从上次的yield处继续执行,首先会打印一个‘step 1’,然后i++,然后又是一个yield,此时再次将i的值作为生成器的下一个元素进行返回,然后结束next方法,打印20个‘=’。

第三次调用next:再次从上次的yield处继续执行,首先打印一个‘step 2’,然后注意此时由于i的值为1,满足生成器循环的条件,因此会打印‘in circle’,然后继续向下执行。

第四、五、六次调用next:与上面保持一致。

第七次调用next:从yield处向后执行,会首先打印‘step 2’,然后此时i=3,不满足生成器循环条件,于是打印‘out circle’,然后打印i的值。

第八次调用next:由于此时生成器无下一个元素,程序会抛出StopIteration异常,然后结束整个程序的运行。最后要说一下python2中的range和xrange。

Python2中,range是一个内建的函数,用于生成一个列表。而xrange则为一个生成器,循环时不断生成元素。Python3时就将内建的range改成了xrange,只不过名字没变。

python yield理解_对Python中Yield的理解相关推荐

  1. java对多态的理解_对于Java中多态的理解

    所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个 ...

  2. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  3. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  4. AQS理解之五—并发编程中AQS的理解

    AQS理解之五-并发编程中AQS的理解 首先看下uml类图: AbstractOwnableSynchronizer 这个类定义是提供一个创建锁的基础,设置一个排它线程,帮助控制和监控访问. 先看下A ...

  5. python生成器单线程_「Python异步编程-3」协程、生成器、yield 的联系

    异步编程的基础在于理解协程,而协程的基础在于理解生成器,而生成器的基础在于理解yield关键字,下面就来说说这几个概念. 什么是yield关键字? 相当于return关键字,在每次next(),或者f ...

  6. python一切皆对象的理解_在 Python 中万物皆对象

    在 Python 中一切都是对象,并且几乎一切都有属性和方法.所有的函数都有一个内置的 __doc__ 属性,它会返回在函数源代码中定义的 doc string:sys 模块是一个对象,它有一个叫作 ...

  7. python索引例子_谈谈python中的索引

    最近以python为工具,取代VBA处理工作中Excel遇到的小问题,我觉得其优点:一是语言更清爽友善,因为VBA的语言一来IDE难用,语法风格不大气优雅(我个人的见解):二是,我一直怀疑Excel对 ...

  8. python核心装饰_《python核心编程》中高级闭包和装饰器理解?

    1.<python核心编程>的这段程序怎么理解?对于这个函数,书上说两个wraaped是闭包,但是不知道谁是自由变量. 2.代码: from time import time def lo ...

  9. python库名_在python存储库名称和包名称中使用连字符/破折号 - python

    我试图使我的git仓库pip可安装.为此,我正在重组仓库以遵循正确的约定.通过查看其他存储库,我的理解是,我应该将所有源代码放在与存储库名称相同的软件包中.例如.如果我的存储库称为myrepo,则源代 ...

  10. 3_1符合python语言变量_以下选项中符合Python语言变量命名规则的是

    [单选题]以下选项中,不是Python语言特点的是 [单选题]较小的尺寸应离轮廓线较近,较大的尺寸线离轮廓线较远.( ) [单选题]关于Python语言的变量,以下选项中说法正确的是 [单选题]182 ...

最新文章

  1. [LeetCode]题解(python):108-Convert Sorted Array to Binary Search Tree
  2. ElasticSearch的基本原理与用法
  3. 24c04硬件地址位_一文读懂IP地址和MAC地址有什么区别和联系
  4. 数据结构与算法(C++)– 贪婪算法(Greedy algorithm)
  5. Django(part50)--Web请求认证
  6. [LeetCode] 3. Longest Substring Without Repeating Characters 题解
  7. linux进程管理子系统分析,linux进程管理子系统简要分析
  8. 这些Python代码技巧,你肯定还不知道
  9. CentOS操作系统版本信息查看和隐藏
  10. 用CSS实现一个易于换肤的移动导航栏
  11. HDU 4050 wolf5x 概率dp 难度:1
  12. 怎样从altera下载软件与器件库
  13. centos7软件仓库资源的配置目录
  14. NGINX-SESSION粘滞
  15. c++语言中string类型,c++string类型占几个字节
  16. 深度实践嵌入式linux系,深度实践嵌入式Linux系统移植 完整pdf_操作系统教程_源雷技术空间...
  17. MODIS数据所有产品介绍与下载地址
  18. 前端导出zip格式压缩包
  19. ODBC驱动器管理器——未发现数据源名称并且未指定默认驱动程序
  20. 杀毒软件 clamav 的安装和使用

热门文章

  1. Data - 【转】数据分析的道与术
  2. CSS里总算是有了一种简单的垂直居中布局的方法了
  3. 如何把 XML 文件显示为 HTML 表格
  4. lazyload.js实现图片异步延迟加载
  5. short_open_tag 必须打开
  6. 结构体中定义函数指针
  7. AWS攻略——使用CodeCommit托管代码
  8. CUDA Samples: Ray Tracking
  9. C++实现tar包解析
  10. opencv实现二值图像细化的算法