https://eastlakeside.gitbooks.io/interpy-zh/content/Generators/

文章不是非常好

1,三个概念

可迭代对象 iterable, 迭代器 iterator, 迭代 iteration.

可迭代对象就是能提供迭代器的任意对象。Python中的任意对象,只要它定义了能返回迭代器的 __iter__ 方法,或者定义了支持下标索引的 __getitem__ 方法它就是一个可迭代对象。

按照文章的说法,只要定义了 __next__ 方法的对象,它就是迭代器。

-- 这样乍一看,可迭代对象和迭代器岂非是同一个的东西?其实不然。请看下面例子。

my_string = "Yasoob"
next(my_string)
# Output: Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# TypeError: str object is not an iterator
以上异常说明,str 不是迭代器;虽然它是可迭代对象,但它不是迭代器。也就是说,它支持迭代,但是不能直接对其进行迭代操作。
这时候应该使用内置函数 iter, 它根据一个可迭代对象返回一个迭代器对象。
my_string = "Yasoob"
my_iter = iter(my_string)
next(my_iter)
# Output: 'Y'
可以认为,迭代器是可迭代对象的方法的结果;可迭代对象通过方法得到迭代器;只有迭代器才是可以进行迭代操作的。
 
2,生成器 generator
generator是一个函数,但是它的行为想迭代器,它可以放在for..loop中。
generator的特点是:
1)运行时生成值;
2)可以用for遍历;
3)以函数形式实现,但是不返回值,而是yield一个值。
 
3,generator 和 function 的区别
先看如下例子:
>>> def myGen(n):
... yield n
... yield n + 1
...
>>> g = myGen(6)
>>> next(g)
6
>>> next(g)
7
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
可见,生成器的对象仅生成一次,但是其代码不一定会一次性全部跑一遍。代码在调用next的时候开始跑,但是也可能只跑一部分,代码在执行到yield的时候即停下来了;在下次调用next的时候,代码会在上次暂停的地方重新开始跑。
函数的做法是,从头跑到尾,碰到return之后返回并把前面的中间状态抛弃掉。
 
4,generator 相对于 function的优点
在运行中生成值,不需要像函数那样先构造很大的List,更有效利用内存。
 
参考如下链接体会generator的用法:
https://docs.python.org/3/library/itertools.html
 
一下这段话来自于 廖雪峰 。
List,Dict,Str都是iterable,但都不是iterator。
为什呢?因为Python的迭代器对象表示的是一个数据流,迭代器对象可以被next函数调用并不断返回下一个数据,知道没有数据是抛出StopIteration错误。我们可以把数据流堪称一个有序序列,但我们却没法提前知道序列的长度,只能通过next函数实时按需计算下一个数据,所以说iterator的计算是惰性的,只有在需要返回下一个数据时才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数,而是用List显然是不可能做到的。

Python: 生成器与迭代 generators and iteration的更多相关文章

  1. python之 可迭代 迭代器 生成器

    0. 1.总结 (1) (a)iterable 可迭代(对象) 能力属性 指一个对象能够一次返回它的一个成员,for i in a_list 而不需要通过下标完成迭代. 例子包括所有序列类型(list ...

  2. Python 函数 切片 迭代 列表生成器

    函数 编写     定义一个函数要用def语句    def sum(i,n):   ⚠有冒号 返回多值     实际上是返回一个tuple 定义默认参数    默认参数的作用是简化调用   def ...

  3. Python生成器,迭代器,可迭代对象

    在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict ...

  4. Generator - Python 生成器

    Generator, python 生成器, 先熟悉一下儿相关定义, generator function 生成器函数, 生成器函数是一个在定义体中存有 'yield' 关键字的函数. 当生成器函数被 ...

  5. python——生成器

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

  6. python学习之”迭代从入门到精通“

    在开发的过程中,假如给你一个list或者tuple,我们可以通过for循环来遍历这个list或者tuple,这种遍历我们成为迭代(Iteration).在Python中,迭代是通过for ... in ...

  7. Python生成器 yield

    迭代器与list相比较,就for in句型循环拿数据而言: 用list写很简洁,但如果list数据过大,会很消耗资源. 用iteration 迭代器写,则不会消耗那么多资源.他会随用随取,用一个拿一个 ...

  8. python 生成器和迭代器有这篇就够了

    本节主要记录一下列表生成式,生成器和迭代器的知识点 列表生成器 首先举个例子 现在有个需求,看列表 [0,1,2,3,4,5,6,7,8,9],要求你把列表里面的每个值加1,你怎么实现呢? 方法一(简 ...

  9. python 生成器与协程

    生成器在迭代中以某种方式生成下一个值并且返回和next()调用一样的东西. 挂起返回出中间值并多次继续的协同程序被称作生成器. 语法上讲,生成器是一个带yield语句的函数.一个函数或者子程序只返回一 ...

随机推荐

  1. VSCode 中文乱码

    方式一 vscode 菜单栏:  文件 >> 首选项 >> 设置 搜索: "files.autoGuessEncoding": false, 改为: &qu ...

  2. 随便写点什么,证明我还活着,VS2010出现的问题

    今天使用VS2010的过过程中出现了这个问题,哎... 简单地说,其实就是在我的sln里面有某个proj出问题了, 问题是某个或者某几个依赖项出问题了, 怎么办呢,没办法,只能一个一个排查, 我把所有 ...

  3. (转)Unity UI之GUI使用

    一:GUI技术介绍 二:常见基础控件使用 三:GUILayout自动布局 四:GUI皮肤 一:GUI技术介绍 GUI技术看似成为古老的技术,但是Unity5.x之后并没有取消这种UI传统的技术.Uni ...

  4. springmvc3.2集成redis集群

    老项目需要集成redis集群 因为spring版本才从2.x升级上来,再升级可能改动较大,且并非maven项目升级麻烦,故直接集成. jar包准备: jedis-2.9.0.jar  -- 据说只有这 ...

  5. python_django_中间件

    什么是中间件? 可以介入django的请求和响应的轻量级的底层插件,它其实就是一个python类,我们在settings配置文件中的↓↓↓↓,都是中间件 MIDDLEWARE = [ 'django. ...

  6. python异常整理

    一.操作excel 时异常 1.PermissionError: [Errno 13] Permission denied (1)原因:权限错误:[Errno 13] 权限被拒绝 错误产生的原因是文件 ...

  7. 【JZOJ3918】蛋糕

    description 今天是Bessie的生日,他买了一个蛋糕和朋友们一起分享,蛋糕可以看成是一个R行C列的表格,共有R*C个格子,每个格子都有一个0至9的数字,表示该格子蛋糕拥有的巧克力.现在Be ...

  8. 阿里巴巴持续投入,etcd 正式加入 CNCF

    摘要: 2018 年 12 月 11 日,在 KubeCon + CloudNativeCon 北美峰会上,etcd 项目正式加入 CNCF. 2018 年 12 月 11 日,在 KubeCon + ...

  9. NX二次开发-UFUN修剪体UF_MODL_trim_body

    1 NX11+VS2013 2 3 4 #include <uf.h> 5 #include <uf_modl.h> 6 7 8 UF_initialize(); 9 10 / ...

  10. NX二次开发-UFUN建模创建特征组UF_MODL_create_set_of_feature

    NX11+VS2013 #include <uf.h> #include <uf_modl.h> UF_initialize(); //创建块 UF_FEATURE_SIGN ...