生成器(generator)和迭代(iterable , iterator, iteration)
在搞清楚Generator之前,我们先讨论一下 iterable , iterator, iteration
1.Iterable
我们知道,在Python中所有东西都是object, 比如说变量,容器,类对象都是object.
Iterable就是一种object,它具有__iter__ 或者__getitem__方法,能够返回一个iterator。
即iterable是给我们提供iterator的object.
2.Iterator
iterator 是一种用于 next 方法的object. 调用next()方法,可以每次取得iterator中的一个元素。
3.Iteration
在一个数据容器中遍历它的成员的过程 就是iteration。
4. Generator
Generator是那种通过yield方法来遍历元素的函数(即函数体中有yield存在的函数)。
Generator也是iterator,但是只能遍历它一次。它的好处是不存储元素值,也就不占内存空间。
关于Generator 可以看这个介绍:
http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/index.html
用一个斐波那契数列的例子:
写法1: 直接打印出
- def fab(max):
- n, a, b = 0, 0, 1
- while n < max:
- print b
- a, b = b, a + b
- n = n + 1
这种方法能够将每一步的值打印出来,但是缺点是无法复用,比如算完fab(5)之后,再算fab(10)又要重新计算。
因此我们可能考虑将中间结果用一个list容器保留下来。
写法2: 用list保存结果。
- def fab(max):
- n, a, b = 0, 0, 1
- L = []
- while n < max:
- L.append(b)
- a, b = b, a + b
- n = n + 1
- return L
这种写法的缺陷是随着参数的增大,list中存储的数据会特别占内存。
因此我们引入generator,前文已经说了,它只能遍历一次,且不占内存。
写法3:使用generator
- def fab(max):
- n, a, b = 0, 0, 1
- while n < max:
- yield b
- # print b
- a, b = b, a + b
- n = n + 1
- >>> for n in fab(5):
- ... print n
注意,此时的fab(5) 其实是一个iterator而不是一个函数了,我们只需要遍历它并且输出就可以了。generator在运行时,每次迭代都会保存这一次的yield的值,下次迭代就从这个值开始计算,因此不占内存。
注意: 在generator function中一般是没有return的,如果在执行中return,则抛出StopIteration 终止迭代。
在for循环一个generator时,是不会越界的。但是如果用iterator.next()这种方法遍历,则会产生越界情况,此时会抛出StopIteration 异常,终止迭代。
生成器(generator)和迭代(iterable , iterator, iteration)的更多相关文章
- Python 生成器 (generator) & 迭代器 (iterator)
python 生成器 & 迭代器 生成器 (generator) 列表生成式 列表生成式用来生成一个列表,虽然写的是表达式,但是储存的是计算出来的结果,因此生成的列表受到内存大小的限制 示例: ...
- Python的生成器Generator小结
一. 生成器的介绍 在介绍生成器(Generator)之前,我们首先需要熟悉列表生成式,列表生成式是Python内置的简单又强大的用来创建列表的生成式. 举个例子, 如果我们想生成[1*1,2*2,3 ...
- Python: 生成器与迭代 generators and iteration
https://eastlakeside.gitbooks.io/interpy-zh/content/Generators/ 文章不是非常好 1,三个概念 可迭代对象 iterable, 迭代器 i ...
- Python进阶内容(四)--- 迭代器(Iterator)与生成器(Generator)
迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的ge ...
- Python之生成器(generator)和迭代器(Iterator)
generator 生成器generator:一边循环一边计算的机制. 生成器是一个特殊的程序,可以被用于控制循环的迭代行为.python中的生成器是迭代器的一种,使用yield返回值函数,每次调用y ...
- 生成器generator和迭代器Iterator
一.列表生成式 在学习生成器迭代器之前先了解一下什么是列表生成式,列表生成式是Python内置的非常简单却强大的可以用来创建list的生成式.什么意思?举个例子,如果想生成列表[0,1,2 ...
- ES6中的迭代器(Iterator)和生成器(Generator)
前面的话 用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简 ...
- TypeScript 迭代器(iterator)和生成器(generator)
⒈迭代器(iterator) 1.可迭代性 当一个对象实现了Symbol.iterator属性时,我们认为它是可迭代的. 一些内置的类型如 Array,Map,Set,String,Int32Arra ...
- 迭代器 (Iterator) 和 生成器 (Generator)
其他章节请看: es6 快速入门 系列 迭代器 (Iterator) 和 生成器 (Generator) 试图解决的问题 let colors = ['red', 'blue', 'green', ' ...
随机推荐
- BZOJ4888 Tjoi2017异或和(树状数组)
化为前缀和相减.考虑每一位的贡献.则需要快速查询之前有几个数和当前数的差在第k位上为1.显然其与更高位是无关的.于是用BIT维护后k位的数的出现次数,瞎算一算即可. // luogu-judger-e ...
- C 类网络的子网快速划分
CIDR ( Classless Inter-Domain Routing ,无类域间路由选择) 进行子网划分的方法有很多,最适合你的方式就是正确的方式.在 C 类地址中,只有 8 位用于定义主机.注 ...
- Fdisk 分区详解
Fdisk 分区详解 来源 http://blog.itpub.net/20674423/viewspace-722812/ 1. 通过Fdisk查看系统分区详细信息: Fdi ...
- 【MediaElement】WPF视频播放器【2】
一.前言 上回说到需要做放视频的使用向导,这两天公司里的老司机一直帮我答疑解惑,让这个任务变得挺顺的,真心感谢他们! 这次与[1]中的不同之处在于: (1)播放和暂停按钮集成在<Me ...
- 【BZOJ1443】游戏(二分图匹配,博弈论)
[BZOJ1443]游戏(二分图匹配,博弈论) 题面 BZOJ 题解 很明显的二分图博弈问题. 发现每次移动一定是从一个黑点到达一个白点,或者反过来. 所以可以对于棋盘进行染色然后连边. 考虑一下必胜 ...
- mac os 启动服务命令 launchctl
参考苹果开发者网址 https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Ch ...
- [学习笔记]矩阵乘法及其优化dp
1.定义: $c[i][j]=\sum a[i][k]\times b[k][j]$ 所以矩阵乘法有条件,(n*m)*(m*p)=n*p 即第一个矩阵的列数等于第二个矩阵的行数,否则没有意义. 2.结 ...
- Git 自动补全
如果你用的是 Bash shell,可以试试看 Git 提供的自动补全脚本. http://git-scm.com/download 下载 Git 的源代码,进入contrib/completion ...
- Virtual Box虚拟机下CentOS网络设置
VirtualBox中有4中网络连接方式: a. NAT 网络地址转换模式(Network Address Translation)b. Bridge ...
- 题解【luogu2045 方格取数游戏加强版】
Description 给出一个 \(n*n\) 的矩阵,每一格有一个非负整数 \(A_{i,j}\) ,(\(A_{i,j} <= 1000\))现在从 \((1,1)\) 出发,可以往右或者 ...