What is the difference between iterators and generators? Some examples for when you would use each case would be helpful.

总之:迭代器是具有__iter__和__next__(Python 2中的next)方法的对象。生成器提供了一种创建迭代器实例的简单内置方法。

一个包含yield的函数仍然是一个函数,当调用它时,它返回一个生成器对象的实例:def a_function():

"when called, returns generator object"

yield

生成器表达式还返回生成器:a_generator = (i for i in range(0))

要获得更深入的阐述和示例,请继续阅读。

生成器是迭代器

具体来说,生成器是迭代器的一个子类型。>>> import collections, types

>>> issubclass(types.GeneratorType, collections.Iterator)

True

我们可以用多种方法创建生成器。一种非常常见和简单的方法是使用函数。

具体地说,具有yield的函数是一个函数,当被调用时,它返回一个生成器:>>> def a_function():

"just a function definition with yield in it"

yield

>>> type(a_function)

>>> a_generator = a_function() # when called

>>> type(a_generator) # returns a generator

生成器也是迭代器:>>> isinstance(a_generator, collections.Iterator)

True

迭代器是可迭代的

迭代器是可迭代的>>> issubclass(collections.Iterator, collections.Iterable)

True

它需要返回迭代器的__iter__方法:>>> collections.Iterable()

Traceback (most recent call last):

File "", line 1, in

collections.Iterable()

TypeError: Can't instantiate abstract class Iterable with abstract methods __iter__

iterable的一些示例包括内置元组、列表、字典、集合、冻结集合、字符串、字节字符串、字节数组、范围和内存视图:>>> all(isinstance(element, collections.Iterable) for element in (

(), [], {}, set(), frozenset(), '', b'', bytearray(), range(0), memoryview(b'')))

True

迭代器需要一个next或__next__方法

在Python 2中:>>> collections.Iterator()

Traceback (most recent call last):

File "", line 1, in

collections.Iterator()

TypeError: Can't instantiate abstract class Iterator with abstract methods next

在Python 3中:>>> collections.Iterator()

Traceback (most recent call last):

File "", line 1, in

TypeError: Can't instantiate abstract class Iterator with abstract methods __next__

我们可以使用iter函数从内置对象(或自定义对象)中获取迭代器:>>> all(isinstance(iter(element), collections.Iterator) for element in (

(), [], {}, set(), frozenset(), '', b'', bytearray(), range(0), memoryview(b'')))

True

尝试使用带有for循环的对象时,将调用__iter__方法。然后对迭代器对象调用__next__方法,以获取循环的每个项。迭代器在您用完它时引发StopIteration,此时不能重用它。

从文件中

从内置类型documentation的迭代器类型部分的生成器类型部分:Python’s generators provide a convenient way to implement the iterator protocol. If a container object’s __iter__() method is implemented as a generator, it will automatically return an iterator object (technically, a generator object) supplying the __iter__() and next() [__next__() in Python 3] methods. More information about generators can be found in the documentation for the yield expression.

(强调的是。)

因此我们从中了解到生成器是一种(方便的)迭代器。

迭代器对象示例

您可以通过创建或扩展自己的对象来创建实现迭代器协议的对象。class Yes(collections.Iterator):

def __init__(self, stop):

self.x = 0

self.stop = stop

def __iter__(self):

return self

def next(self):

if self.x < self.stop:

self.x += 1

return 'yes'

else:

# Iterators must raise when done, else considered broken

raise StopIteration

__next__ = next # Python 3 compatibility

不过,简单地使用生成器来实现这一点更容易:def yes(stop):

for _ in range(stop):

yield 'yes'

或者更简单的是,生成器表达式(工作方式类似于列表理解):yes_expr = ('yes' for _ in range(stop))

它们都可以以相同的方式使用:>>> stop = 4

>>> for i, y1, y2, y3 in zip(range(stop), Yes(stop), yes(stop),

('yes' for _ in range(stop))):

... print('{0}: {1} == {2} == {3}'.format(i, y1, y2, y3))

...

0: yes == yes == yes

1: yes == yes == yes

2: yes == yes == yes

3: yes == yes == yes

结论

当需要将Python对象扩展为可迭代的对象时,可以直接使用迭代器协议。

然而,在大多数情况下,您最适合使用yield来定义返回生成器迭代器或考虑生成器表达式的函数。

python 生成器 迭代器 区别_Python生成器和迭代器的区别相关推荐

  1. python 生成pdf收据_python生成器如何实现

    生成器和迭代器的功能非常相似,它也会提供 __next__() 方法,这意味着程序同样可调用内置的 next() 函数来获取生成器的下一个值,也可使用 for 循环来遍历生成器. 生成器与迭代器的区别 ...

  2. python将list转换为迭代器代码_python中的迭代器附带代码示例

    迭代的概念 迭代就是执行重复的特定的任务,知道任务完成为止 相当于我们盖房子,今天添一块砖,明天加一块瓦,直到房子盖完为止.这里每天的工作就是一次迭代 (1.)可迭代对象 a.可以直接作用于for-i ...

  3. python中raise和raise e区别_python raise和assert的区别

    python中raise和assert的区别 一.使用raise抛出异常 python可以自动触发异常,raise(内置函数)的定义为显示的抛出异常,用户可以使用raise进行判断,显式的引发异常,r ...

  4. python生成器与迭代器的区别_python生成器和迭代器的区别

    匿名用户 1级 2016-10-13 回答 迭代器和生成器都是Python中特有的概念,迭代器可以看作是一个特殊的对象,每次调用该对象时会返回自身的下一个元素,从实现上来看,一个可迭代的对象必须是定义 ...

  5. python 生成nc文件_Python生成器处理大文本文件的代码

    运维经常要读写大文本文件,几个G用生成器读写,速度很快. 几十G的先切分为N个小文件,再处理. # coding:utf-8 """ 黄哥python远程视频培训班 ht ...

  6. python 生成器装饰器_python: 生成器,装饰器以及列表推导式写法

    1.连接字符串尽量用format,两个的时候可以用 + name = "lxw" age = 24 x = "{0}{1}".format(name, age) ...

  7. python import from区别_python import 与 from .... import ...区别-阿里云开发者社区

    在python用import或者from...import来导入相应的模块. 模块其实就一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候, 直接把相应的模块导入到我们的程序 ...

  8. python 枚举相等判断_python中is和==的区别

    is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同. 想要知道他们的区别,首先要了解一下id()函数,id()函数用于获得python中变量或者对象的唯一标识符,可以理解为内存地址 ...

  9. python编辑器和python解释器的区别_python编译器和解释器的区别

    高级语言不能直接被机器所理解执行,所以都需要一个翻译的阶段,解释型语言用到的是解释器,编译型语言用到的是编译器. 编译型语言通常的执行过程是:源代码--预处理器--编译器--目标代码--链接器--可执 ...

最新文章

  1. python3 arp局域网ip
  2. 速卖通新手入驻必须了解的“9大知识点”
  3. c/c++在windows下获取时间和计算时间差的几种方法总结
  4. usaco1.4.4(milk3)
  5. C语言DCI(OCI)方式连接DM数据库
  6. java 正则表达式 反向_正则表达式中的数量表示符、反向引用、零宽断言、以及java中的用法...
  7. cast函数_关闭RTTI后dynamic_cast和typeid报异常
  8. 入侵sql serve 后拿服务器_quot;条条大路quot;拿webshell
  9. JavaBean在jsp中的使用
  10. SheetJS中文文档-js导出Excel脚本库
  11. re2020 bt2020_如何在2020年选择最佳博客平台(比较)
  12. Ctrl+Shift+F 输入法变成繁体 输入法简体繁体切换
  13. 中国智能家居企业出海,亚马逊云科技为其提供“GPS锦囊”
  14. C语言——计算当前日期前/后N天的日期
  15. 世界上最值钱的初创公司
  16. 折线和柱状(自定义图案)结合
  17. neko vm 数据包装翻译
  18. php地区代码吗,将国家/地区名称转换为国家/地区代码缩写php
  19. HTML5 Web Audio Api-2 发声oscillator
  20. 计算机地图制图的过程,第四章计算机地图制图过程.ppt

热门文章

  1. hashMap 和linkedHashMap
  2. [UIKit学习]03.关于UILable
  3. 读书笔记之inside JVM(4)
  4. Linux下用多种模式实现双网卡绑定!
  5. 揭秘新的供应链攻击:一研究员靠它成功入侵微软、苹果等 35 家科技公司
  6. ImmuniWeb 推出暗网数据泄露免费查询工具,使用超简单
  7. C语言无缘无故提示缺少分号:missing ';' before identifier '...'
  8. UVA 2519 Radar Installtion
  9. NLPIR语义智能平台支持大数据个性化学习
  10. 如何为能源消费提供最后一公里智能服务