在搞清楚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)的更多相关文章

  1. Python 生成器 (generator) & 迭代器 (iterator)

    python 生成器 & 迭代器 生成器 (generator) 列表生成式 列表生成式用来生成一个列表,虽然写的是表达式,但是储存的是计算出来的结果,因此生成的列表受到内存大小的限制 示例: ...

  2. Python的生成器Generator小结

    一. 生成器的介绍 在介绍生成器(Generator)之前,我们首先需要熟悉列表生成式,列表生成式是Python内置的简单又强大的用来创建列表的生成式. 举个例子, 如果我们想生成[1*1,2*2,3 ...

  3. Python: 生成器与迭代 generators and iteration

    https://eastlakeside.gitbooks.io/interpy-zh/content/Generators/ 文章不是非常好 1,三个概念 可迭代对象 iterable, 迭代器 i ...

  4. Python进阶内容(四)--- 迭代器(Iterator)与生成器(Generator)

    迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的ge ...

  5. Python之生成器(generator)和迭代器(Iterator)

    generator 生成器generator:一边循环一边计算的机制. 生成器是一个特殊的程序,可以被用于控制循环的迭代行为.python中的生成器是迭代器的一种,使用yield返回值函数,每次调用y ...

  6. 生成器generator和迭代器Iterator

    一.列表生成式       在学习生成器迭代器之前先了解一下什么是列表生成式,列表生成式是Python内置的非常简单却强大的可以用来创建list的生成式.什么意思?举个例子,如果想生成列表[0,1,2 ...

  7. ES6中的迭代器(Iterator)和生成器(Generator)

    前面的话 用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简 ...

  8. TypeScript 迭代器(iterator)和生成器(generator)

    ⒈迭代器(iterator) 1.可迭代性 当一个对象实现了Symbol.iterator属性时,我们认为它是可迭代的. 一些内置的类型如 Array,Map,Set,String,Int32Arra ...

  9. 迭代器 (Iterator) 和 生成器 (Generator)

    其他章节请看: es6 快速入门 系列 迭代器 (Iterator) 和 生成器 (Generator) 试图解决的问题 let colors = ['red', 'blue', 'green', ' ...

随机推荐

  1. luogu 2115 破坏(01分数规划)

    题意:给出一个序列,删除一个连续的子串后使得剩下的平均值最小. 典型的01分数规划,令f(x)=(sum1[i]+sum2[j])/(i+j).sum1表示前缀和,sum2表示后缀和,那么我们就相当于 ...

  2. week1day01 认识python 变量 数据类型 条件if语句

    1.什么是python? Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.像Pe ...

  3. 【Mybatis】Mybatis的sql模糊查询

    这个网站中有很多方法.https://code.google.com/p/mybatis/issues/detail?id=85 自己试验了如下的方法. 1.  参数中直接加入%% param.set ...

  4. Stream My Contest UVA - 11865(带权最小树形图+二分最小值最大化)

    #include <iostream> #include <cstdio> #include <sstream> #include <cstring> ...

  5. java 调用 keytool 生成keystore 和 cer 证书

    keytool是一个Java数据证书的管理工具, keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里, 包含两种数据:密钥实体(K ...

  6. 解决Maven下载依赖慢

    微服务spring boot,在使用maven下载依赖的时候非常慢,几十K的依赖JAR,也需要漫长的等待,更悲剧呢的漫长等待结果提示下载失败,为彻底解决这个问题,决定使用国内的镜像库,想象总是美好的, ...

  7. ZendFramework安装配置

    1.创建项目目录 E:/wwwroot/myzfpro 运行cmd后,cd到框架源文件的bin目录 运行zf.bat创建命令:zf.bat create project E:/wwwroot/myzf ...

  8. http_load - 集成测试工具之

    http_load是基于linux平台的性能测试工具,它体积非常小,仅100KB.它以并行复用的方式运行,可以测试web服务器的吞吐量与负载. 1 官方地址  http://www.acme.com/ ...

  9. 同时装了Python3和Python2,怎么用pip?

    问题:同时装了Python3和Python2,怎么用pip? Ubuntu13.04, 系统内同时装了Python3.3 和 2.7 用sudo apt-get install python-pip ...

  10. php curl使用ss代理

    1.安装 ss,过程略 2.ss 配置文件 { "server":"x.x.x.x", #你的 ss 服务器 ip "server_port" ...