生成器的特点是工作到一半,就会停下来看别人干活直至有人踢它屁股,这时它才继续往下干活。实现这一功能的精髓要用到yield。

生成器是一种特殊的迭代器,因此我们先来了解一下什么是迭代器。我们都知道著名的斐波那契数列:1、1、2、3、5、8、13、21、34……从第三个数开始,每个数都可以由其前面的两个数相加得到,这就是一个迭代过程。很显然,这是一个不收敛的数列,我们无法用列表或者使集合去一次性将它们提取出来。这时候,如果我们把这样一个迭代过程封装成一个迭代器,只有在调用一次它的时候它才进行一次迭代,并且只保留当前的迭代结果,这样一来,程序的运行速度能得到提高,同时也不会对内存造成严重的负担。迭代器可以表示一个无限大的数据流,也可以表示一个有限的数据流。

从代码的角度讲,所有可以被next()函数调用并不断返回下一个值的对象就叫做迭代器:Iterator。与迭代器相近的一个概念是可迭代对象(Iterable),凡是可用for循环遍历的对象都是可迭代对象,比如list、dict和str等。但是这几个对象不是迭代器,这一点在上一段已经从迭代器的特点说明,不再赘述。然而,世事无绝对,通过iter()函数,可以将它们变成迭代器。

由此,我们可以建立这样一个斐波那契数列生成器:

defgenerate():

b,c= 0,1

while True: #a用来计数

b,c= c,b +c #迭代公式

yieldcreturn "fault" #出错时的返回值

y= generate() #产生一个生成器对象,但不调用生成器

for i in range(15): #调用15次

print(y.__next__(),end=" ") #使用next()方法调用生成器

print("\r") #换行操作符

for i in range(9): #继续迭代

print(y.__next__(), end=" ")

yield的作用是让生成器在这里暂停执行,执行下一条程序指令。当下一次调用next()函数时,生成器从暂停的地方继续往下执行。一次,每调用一次产生一个值,如下图所示

这种类型的生成器并不需要参数,当我们需要给生成器内部传递参数时,我们需要用到send()函数,因为next()函数不具备该功能。看下面这样一段代码:

1 defsing(word1):2 print(word1)3 whileTrue:4 word2 = yield #每次调用时生成器都停留在这里

5 print(word2)6

7

8 a = sing("如今走过这世间")9 a.send(None) #可以替换成a.__next__()

10 a.send("万般流连")

上述代码,如果不用while循环,则没办法使每次调用的结果程序都停留在yield这里,而是执行完print(word2)变结束了,这使程序会报错。在第一次使用需要传递参数的生成器时,我们不能直接使用send()函数传递我们想传递的参数,因为此时函数停在yeild,并不需要到这个参数。因此我们可以用next()函数来进行第一次调用,然后再调用send()传递参数并调用。当然,如果我们非要用send()函数实现第一次调用时,应该传递一个空参数。运行结果如下所示:

至此,大功告成!

python经济_python生成器——懒到欠揍,但很经济相关推荐

  1. python生成器 图片分类_python批量处理图片图片Python迭代器和生成器介绍

    Python迭代器和生成器介绍迭代器 迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration ...

  2. python迭代器和生成器的作用_python迭代器与生成器的详细介绍

    一.什么玩意是迭代器? 先说说什么是迭代吧,迭代就是一件事情重复很多次,比如说for循环. for循环可以对一切有iter方法的对象进行迭代,那么什么是iter方法呢? 一个对象是否可迭代,全都取决于 ...

  3. python 生成器 原理_python 生成器和迭代器的原理解析

    一.生成器简介 在python中,生成器是根据某种算法边循环边计算的一种机制.主要就是用于操作大量数据的时候,一般我们会将操作的数据读入内存中处理,可以计算机的内存是比较宝贵的资源,我认为的当要处理的 ...

  4. python迭代器与生成器实际用途_python迭代器和生成器

    python迭代器和生成器 一.迭代器 1.什么是迭代器 说迭代器之前有个相关的名词需要介绍: 可迭代对象:只要定义了iter()方法,我们就说该对象是可迭代对象,并且可迭代对象能提供迭代器. 在Py ...

  5. python编程语言_python编程语言的简要历史

    python编程语言 The Python programming language is a general-purpose programming language that has carved ...

  6. python基础(迭代器,生成器,装饰器)

    python: 生成器: 因为当列表元素达到一定上限,列表会占很大内存空间来存储,所以列表是受到内存限制的来适当使用. 生成器可以按照一个算法,循环推导出元素,就不用一次生成整个列表,而通过生成器(g ...

  7. 简单介绍python迭代器和生成器

    这篇文章主要介绍了Python中的迭代器和生成器,涉及到Python中很多重要的特性,需要的朋友可以参考下,希望能够给你带来帮助 python迭代器和生成器 1.迭代器 这里用字典示例 while T ...

  8. python画代码-Python教程_Python画Mandelbrot集 代码

    Python教程_Python画Mandelbrot集 代码 作者:Comet 来源: 课课家 www.kokojia.com点击数:278发布时间:2015-06-19 11:17:19 曼德勃罗集 ...

  9. python编程有什么用处-python中的生成器是什么?生成器有什么用处?

    在以下的文章之中我们来了解一下什么是python中生成器.了解一下python生成器是什么,以及生成器在python编程之中能起到什么样的作用. python生成器是什么? 通过列表生成式,我们可以直 ...

最新文章

  1. VS不显示最近打开的项目
  2. 苹果裁撤自动驾驶项目员工200余人
  3. CYQ.Data V4系列全面开源(2013-08-04)
  4. 快速解决正则----模糊匹配、字符类、量词
  5. 固态硬盘坏块修复工具_哪些情况影响固态硬盘寿命 影响固态硬盘寿命症状【详解】...
  6. 基于Vue-SSR优化方案归纳总结
  7. 如何验证python的下载安装_如何下载python并正确安装
  8. windows下搭建iphone开发环境
  9. 用matlab绘制中国海岸线,matlab显示全球海岸线
  10. oracle中长字符串长度吗,Oracle 字符串长度函数
  11. c语言数组插入一个数字 移位,如何将一个数组的元素循环左移?
  12. 操作系统实战45讲01:运行HelloOS
  13. PHP 5.4.8 添加系统服务命令
  14. Python 的几种推导式
  15. uniapp手写地图搜索选取功能
  16. Java内存模型基础知识
  17. 完美解决MATLAB建立新文件没有权限问题
  18. java使用memcached
  19. 对12306车票数据的提取
  20. 什么是真正的架构设计?十年Java经验让我总结出了这些,不愧是我

热门文章

  1. kindeditor和easyui整合出不来
  2. 8 线程安全且高效的单例模式
  3. iOS开发 autoResizingMask使用
  4. cut命令详解(转)
  5. 计算机网络——分层结构,协议,接口和服务
  6. python安装百度aip_Python3.6安装aip
  7. java2019 数据结构算法面试题_2019年JVM最新面试题,必须收藏它
  8. python操作csv文件第7行开始的数据_Python教程-Python读写CSV文件
  9. python计算入门_Python入门教程02-01(计算机核心基础)
  10. python变量类型之间转换_Python常用数据类型之间的转换总结