python 生成器 迭代器 区别_Python生成器和迭代器的区别
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生成器和迭代器的区别相关推荐
- python 生成pdf收据_python生成器如何实现
生成器和迭代器的功能非常相似,它也会提供 __next__() 方法,这意味着程序同样可调用内置的 next() 函数来获取生成器的下一个值,也可使用 for 循环来遍历生成器. 生成器与迭代器的区别 ...
- python将list转换为迭代器代码_python中的迭代器附带代码示例
迭代的概念 迭代就是执行重复的特定的任务,知道任务完成为止 相当于我们盖房子,今天添一块砖,明天加一块瓦,直到房子盖完为止.这里每天的工作就是一次迭代 (1.)可迭代对象 a.可以直接作用于for-i ...
- python中raise和raise e区别_python raise和assert的区别
python中raise和assert的区别 一.使用raise抛出异常 python可以自动触发异常,raise(内置函数)的定义为显示的抛出异常,用户可以使用raise进行判断,显式的引发异常,r ...
- python生成器与迭代器的区别_python生成器和迭代器的区别
匿名用户 1级 2016-10-13 回答 迭代器和生成器都是Python中特有的概念,迭代器可以看作是一个特殊的对象,每次调用该对象时会返回自身的下一个元素,从实现上来看,一个可迭代的对象必须是定义 ...
- python 生成nc文件_Python生成器处理大文本文件的代码
运维经常要读写大文本文件,几个G用生成器读写,速度很快. 几十G的先切分为N个小文件,再处理. # coding:utf-8 """ 黄哥python远程视频培训班 ht ...
- python 生成器装饰器_python: 生成器,装饰器以及列表推导式写法
1.连接字符串尽量用format,两个的时候可以用 + name = "lxw" age = 24 x = "{0}{1}".format(name, age) ...
- python import from区别_python import 与 from .... import ...区别-阿里云开发者社区
在python用import或者from...import来导入相应的模块. 模块其实就一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候, 直接把相应的模块导入到我们的程序 ...
- python 枚举相等判断_python中is和==的区别
is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同. 想要知道他们的区别,首先要了解一下id()函数,id()函数用于获得python中变量或者对象的唯一标识符,可以理解为内存地址 ...
- python编辑器和python解释器的区别_python编译器和解释器的区别
高级语言不能直接被机器所理解执行,所以都需要一个翻译的阶段,解释型语言用到的是解释器,编译型语言用到的是编译器. 编译型语言通常的执行过程是:源代码--预处理器--编译器--目标代码--链接器--可执 ...
最新文章
- python3 arp局域网ip
- 速卖通新手入驻必须了解的“9大知识点”
- c/c++在windows下获取时间和计算时间差的几种方法总结
- usaco1.4.4(milk3)
- C语言DCI(OCI)方式连接DM数据库
- java 正则表达式 反向_正则表达式中的数量表示符、反向引用、零宽断言、以及java中的用法...
- cast函数_关闭RTTI后dynamic_cast和typeid报异常
- 入侵sql serve 后拿服务器_quot;条条大路quot;拿webshell
- JavaBean在jsp中的使用
- SheetJS中文文档-js导出Excel脚本库
- re2020 bt2020_如何在2020年选择最佳博客平台(比较)
- Ctrl+Shift+F 输入法变成繁体 输入法简体繁体切换
- 中国智能家居企业出海,亚马逊云科技为其提供“GPS锦囊”
- C语言——计算当前日期前/后N天的日期
- 世界上最值钱的初创公司
- 折线和柱状(自定义图案)结合
- neko vm 数据包装翻译
- php地区代码吗,将国家/地区名称转换为国家/地区代码缩写php
- HTML5 Web Audio Api-2 发声oscillator
- 计算机地图制图的过程,第四章计算机地图制图过程.ppt
热门文章
- hashMap 和linkedHashMap
- [UIKit学习]03.关于UILable
- 读书笔记之inside JVM(4)
- Linux下用多种模式实现双网卡绑定!
- 揭秘新的供应链攻击:一研究员靠它成功入侵微软、苹果等 35 家科技公司
- ImmuniWeb 推出暗网数据泄露免费查询工具,使用超简单
- C语言无缘无故提示缺少分号:missing ';' before identifier '...'
- UVA 2519 Radar Installtion
- NLPIR语义智能平台支持大数据个性化学习
- 如何为能源消费提供最后一公里智能服务