Python的生成器Generator小结
一. 生成器的介绍
在介绍生成器(Generator)之前,我们首先需要熟悉列表生成式,列表生成式是Python内置的简单又强大的用来创建列表的生成式。
举个例子,
如果我们想生成[1*1,2*2,3*3,4*4,5*5,6*6,7*7,8*8,9*9]
比较笨的方法是
l = []
for i in range(1,10):
l.append(i*i)
而列表生成式可以用一句语句代替上述的循环语句:
[i*i for i in range(1,10)]
更方便的是我们可以添加条件判断,或者使用多层循环,达成我们想要的结果:
#用if判断来获取偶数的平方
[ i*i for i in range(1,10) if i%2==0 ] #二重循环实现排列组合
[ x + y for x in 'abc' for y in '' ]
言归正传,回到生成器。生成器典型的应用场景是这样的: 假如我们需要生成100万个元素,但是我们需要用到的往往只有几个怎么办?如果用列表生成式全部创建的话,则会浪费大量的空间: 为了需要用到的几个元素,我们创建了100万个元素的列表。
而生成器正是这样可以不必创建完成列表,可以一边循环一边计算出后续元素的机制。
创建生成器的方法很简单,只需要把创建列表生成式时的'[]'改成'()'即可
#List
l = [ i*i for i in range(1,10) if i%2==0 ] #Generator
g = ( i*i for i in range(1,10) if i%2==0 )
生成器的用法:通过next()函数获得下一个生成的值。直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
>>> next(g)
4
>>> next(g)
16
>>> next(g)
36
>>> next(g)
64
>>> next(g)
Traceback (most recent call last):
File "<pyshell#73>", line 1, in <module>
next(g)
StopIteration
更科学的方法是使用for循环,因为generator也是可迭代对象,并且不需要关心StopIteration的错误。
>>> for i in g:
print(i) 4
16
36
64
当我们的生成器的需要计算的比较复杂,无法通过类似列表生成式的for循环实现时,则需要另外一种实现生成器的方法:在函数中使用'yield'关键字
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'Done'
对上述代码有以下几点:
1. 代码的作用是用生成器的方法实现斐波那契数列
2. 函数中使用关键字''yield"之后,函数就不再是普通的函数了,而变成了生成器
3. generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
4. 生成器中可以没有return语句,并不影响生成器的功能。上述代码例子中带的return 'Done',将会在抛出StopIteration的错误时打印出来。你可以用next()函数触发StopIteration错误试一试。
二. 迭代器和可迭代对象
迭代器:迭代器就是Iterator,意思指可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值。毫无疑问,我们的生成器就属于迭代器(Iterator)。
可迭代对象:Iterable Object,可以直接作用于for循环的对象统称为可迭代对象:Iterable Object。显然,生成器也属于可迭代对象。list, tuple, dict, set, str因为可以直接作用于for循环,所以也是可迭代对象;但是无法被next()函数调用返回下一个值,所以不属于迭代器。
总结: 生成器Generator即是迭代器(Iterator),也是可迭代对象(Iterable Object)。其实从定义上分析,迭代器一定是可迭代对象。
list, tuple, dict, set, str是可迭代对象(Iterable Object),但不是迭代器(Iterator)。
Python的生成器Generator小结的更多相关文章
- Python之生成器(generator)和迭代器(Iterator)
generator 生成器generator:一边循环一边计算的机制. 生成器是一个特殊的程序,可以被用于控制循环的迭代行为.python中的生成器是迭代器的一种,使用yield返回值函数,每次调用y ...
- python中生成器generator
通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素 ...
- Python学习-生成器 - Generator
简单来说,generator是一个能够返回迭代器对象的函数. yield的使用: 在python中,当你定义一个函数,使用了yield关键字时,这个函数就是一个生成器,它的执行会和其他普通的函数有很多 ...
- Python中生成器generator和迭代器Iterator的使用方法
一.生成器 1. 生成器的定义 把所需要值得计算方法储存起来,不会先直接生成数值,而是等到什么时候使用什么时候生成,每次生成一个,减少计算机占用内存空间 2. 生成器的创建方式 第一种只要把一个列表生 ...
- Python进阶内容(四)--- 迭代器(Iterator)与生成器(Generator)
迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的ge ...
- Python高级编程之生成器(Generator)与coroutine(二):coroutine介绍
原创作品,转载请注明出处:点我 上一篇文章Python高级编程之生成器(Generator)与coroutine(一):Generator中,我们介绍了什么是Generator,以及写了几个使用Gen ...
- Python高级编程之生成器(Generator)与coroutine(一):Generator
转载请注明出处:点我 这是一系列的文章,会从基础开始一步步的介绍Python中的Generator以及coroutine(协程)(主要是介绍coroutine),并且详细的讲述了Python中coro ...
- Python的程序结构[7] -> 生成器/Generator -> 生成器浅析
生成器 / Generator 目录 关于生成器 生成器与迭代器 生成器的建立 通过迭代生成器获取值 生成器的 close 方法 生成器的 send 方法 生成器的 throw 方法 空生成器的检测方 ...
- Python 生成器 (generator) & 迭代器 (iterator)
python 生成器 & 迭代器 生成器 (generator) 列表生成式 列表生成式用来生成一个列表,虽然写的是表达式,但是储存的是计算出来的结果,因此生成的列表受到内存大小的限制 示例: ...
随机推荐
- java设计模式、框架、架构、平台之间的关系
设计模式<框架<架构<平台,从复用角度讲,设计模式是代码级复用.框架是模块级复用.架构是系统级复用.平台是企业应用级复用. 1.设计模式 为什么要先说设计模式?因为设计模式在 ...
- 快速开发一个PHP扩展
快速开发一个PHP扩展 作者:heiyeluren时间:2008-12-5博客:http://blog.csdn.net/heiyeshuwu 本文通过非常快速的方式讲解了如何制作一个PHP 5.2 ...
- opensuse 系统启动自动加载模块
在/etc/modules-load.d目录下面加入想要自动加载的模块,例如自动加载raw模块 创建raw.conf文件,在文件中写入raw. 重启系统就可以了. 手动加载模块方法: modprobe ...
- 01HTML
1.认识HTML标记 2.元信息标记meta 2.1设置页面关键字 2.2设置页面说明 2.3定义编辑工具 2.4添加作者信息 2.5设置网页文字及语言 2.6设置网页的定时跳转 <html&g ...
- OO第四单元总结
单元架构设计 本单元OO作业主要涉及两个过程,即先根据输入的elements数组建立UML存储模型,而后基于这个模型实现一系列查询判断功能.汲取上单元的经验,建模过程中模型数据容器的选择依据要求实现的 ...
- 微信小程序的开发——01小程序的执行流程是怎样的?
作者:叶小钗 转载至:https://www.cnblogs.com/yexiaochai/p/9346043.html 我们这边最近一直在做基础服务,这一切都是为了完善技术体系,这里对于前端来说便是 ...
- jQuery入门第一天-(一个菜鸟的不正经日常)
jQuery的初步认识 菜鸟Q1:什么是jQuery? jQuery就是一个JavaScript函数库,没什么 特别的. 菜鸟Q2:jQuery能做什么?jQuery是做什么的? jQuery本身就是 ...
- 算法竞赛入门经典5.1 从c到c++
这个章节主要是讲述了一些c++的特性,在这里面,对我用处最大的应该就是字符串吧.首先是getline,getchar,stringstream的使用了吧. 首先介绍这三个函数. 1. getline函 ...
- ElasticSearch High Level REST API【5】使用模板搜索
ElasticSearch Rest高级API 提供了多种搜索方式,除了前面讲到的search查询,ElasticSearch 还提供了通过模板搜索查询.我个人比较喜欢这种方式. 我们可以通过脚本预选 ...
- flock文件锁
linux中的定时任务crontab会定时执行一些脚本,但是脚本的时间往往无法控制,当脚本的执行时间过长,可能会导致上一次任务的脚本还没执行完,下一次任务的脚本又开始执行的问题.这种情况下会出现一些并 ...