1.生成器

生成器的概念要比迭代器稍显复杂, 因为生成器是能够返回一个迭代器的函数, 其最大的作用是将输入对象返回为一个迭代器. Python中使用了迭代的概念, 是因为当需要循环遍历一个较大的对象时, 传统的内存载入方式会消耗大量的内存, 不如需要时读取一个元素的方式更为经济快捷.

生成器是一次生成一个值的特殊类型函数(特殊的迭代器). 可以将其视为可恢复函数. 调用该函数将返回一个可用于生成连续 x 值的生成器Generator.

有两点要先明确:

任意生成器都是迭代器(反之, 不成立)

任意生成器, 都是一个可以延迟创建值的工厂(可控性)

生成器的创建

将列表生成式中[]改成() 
通过列表生成式, 可以直接创建一个列表. 但是, 受到内存限制, 列表容量肯定是有限的. 而且, 创建一个包含百万元素的列表, 不仅是占用很大的内存空间, 如:我们只需要访问前面的几个元素, 后面大部分元素所占的空间都是浪费的.

因此, 没有必要创建完整的列表(节省大量内存空间). 在Python中, 我们可以采用生成器:边循环, 边计算的机制—>generator.

生成器是特殊的迭代器,可以通过next()内置函数来获得generator的下一个返回值:

list = [x*x for x in range(10)]
print(list)
testlist = (x*x for x in range(10))
print(testlist)print(next(testlist))
print(next(testlist))
print(next(testlist))

测试结果:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
<generator object <genexpr> at 0x05ED96F0>
0
1
4

generator是保存的算法,每次调用next()内置函数,才能计算出下一个元素.

list = (x*x for x in range(10))
for i in list:print(i)

测试结果:

0
1
4
9
16
25
36
49
64
81

2 函数--关键字yield创建生成器

简单的说就是在函数的执行过程中,yield语句会把你需要的值返回给调用生成器的地方,然后退出函数,下一次调用生成器函数的时候又从上次中断的地方开始执行,而生成器内的所有变量参数都会被保存下来供下一次使用。

著名的斐波那契数列用列表生成式写不出来,但用函数很简单:

def fun(max):n = 0a = 0b = 1while n < max:print(b)a = bb = a+bn += 1return "down"fun(5)

测试结果:

1
2
4
8
16

斐波那契数列的推算规则非常类似generator,也就是说上面的函数和generator无限接近了,只需要把print(b)改成yield b就行:

def fun(max):n = 0a = 0b = 1while n < max:yield ba = bb = a+bn += 1return "down"print(fun(5))

测试结果:

<generator object fun at 0x05604060>

函数和generator执行流程不一样。函数时顺序执行,遇到return语句或者最后一行函数语句就结束,而generator在每次执行next()时,遇到yield语句返回,再次执行时会从上次返回的yield语句处继续执行。

举例:

def odd():print("step 1")yield 1print("step 2")yield 3print("step 3")yield 5o = odd()
print("###0###")
print(o)
print("###1###")
print(next(o))
print("###2###")
print(next(o))
print("###3###")
print(next(o))
print("###4###")
print(next(o))

测试结果:

###0###
<generator object odd at 0x0530BED0>
###1###
step 1
1
###2###
step 2
3
###3###
step 3
5
###4###
Traceback (most recent call last):File "test.py", line 19, in <module>print(next(o))
StopIteration

小结:

生成器对象就是一种特殊的迭代器,满足迭代器协议,可以调用next()内置函数;对生成器for 循环时,调用iter()方法返回了生成器对象,然后再不断next()迭代,而iter()和next()都是在yield内部实现的。

生成器创建方式:常见两种(列表生成式、函数关键字)

python_generator生成器相关推荐

  1. Python 生成器总结

    通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含 100 万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数 ...

  2. 完全理解Python迭代对象、迭代器、生成器

    本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators,俺写的这篇文章是按照自己的理解做的参考翻译,算不上是原文的中译版本,推荐阅读原文,谢谢网 ...

  3. python特性(八):生成器对象的send方法

    生成器对象是一个迭代器.但是它比迭代器对象多了一些方法,它们包括send方法,throw方法和close方法.这些方法,主要是用于外部与生成器对象的交互.本文先介绍send方法. send方法有一个参 ...

  4. python基础之生成器,生成器函数,列表推导式

    内容梗概: 1. 生成器和生成器函数. 2. 列表推导式. 1.生成器函数1.1 生成器函数. 就是把return换成yield def gen():print("爽歪歪")yie ...

  5. 生成器、迭代器的区别?

    迭代器是一个更抽象的概念,任何对象,如果它的类有 next 方法和 iter 方法返回自己本身,对于 string.list. dict.tuple 等这类容器对象,使用 for 循环遍历是很方便的. ...

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

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

  7. Go 学习笔记(18)— 函数(04)[闭包定义、闭包修改变量、闭包记忆效应、闭包实现生成器、闭包复制原对象指针]

    1. 闭包定义 Go 语言中闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量,因此,简单的说: 函数 + ...

  8. 4 三元表达式 列表解析 生成器表达式

    三元表达式 #!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @File : 三元表达式 # @Version : 1.0'''三元表达式能实现简单的 i ...

  9. 重磅推出:AutoProject Studio 自动化项目生成器

    AutoProject Studio 自动化项目生成器 核心架构图 AutoProject Studio 自动化项目生成器是一款基于C#.Net Framework 4.0为平台自主研发.专为软件 设 ...

最新文章

  1. Apache Flink 零基础入门(三)编写最简单的helloWorld
  2. html读取C#参数问题
  3. 什么时候我们应谈及性能?
  4. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(4) - 比较指令
  5. 流API--流的映射
  6. 常用实例:js格式化手机号为3 4 4形式
  7. tomcat之连接器
  8. 实战腾讯云ORC文字识别
  9. 用微软的云计算来远程管理自己的电脑
  10. ariang修改默认服务器,Mac小技巧之AriaNg Native配置
  11. 全国31个省份农产品进口出口额省级数据2001-2021
  12. 【web前端教程笔记】
  13. 智能交通系统(ITS)在可持续城市交通规划中的作用(附下载)
  14. 由邻居蹭网引发的天翼宽带猫与磊科路由的硬件搭线及软件连接探索
  15. java计算机毕业设计黑格伯爵国际英语贵族学校官网MyBatis+系统+LW文档+源码+调试部署
  16. 走近Ts,用了爽,用后一直爽(二)
  17. costmap_2d 代价地图
  18. HTML入门(javaee必经之路)-任亮-专题视频课程
  19. LoadRunner下载文件脚本
  20. C++第二阶段(跨平台通信)-卢嘉文-专题视频课程

热门文章

  1. oracle merge into 优化,ORACLE 10g 的 merge into用法
  2. pyaudio usb playback_电脑USB接口怎么禁用?系统禁用USB端口的两种方法
  3. arcgis怎么只显示一个图斑_森林监测、图斑核查必备技能
  4. 又被分治题卡住好几个小时!用最笨的方法搞懂分治法边界,告别死循环!
  5. .国内外主流前端开发框架对比
  6. 在Eclipse中,如何将项目中的src/main/java目录设置为源代码包?
  7. Udp、Tcp、Http Socket
  8. mysql语法子查询_(十四)MySQL语法-子查询(二)
  9. pandas不显示index_pandas层级索引
  10. php 测试数据整数,PHP中将字符串转化为整数(int) intval() printf() 性能测试