首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Iterator和枚举器对象的区别

Iterator和枚举器对象的区别
EN

Stack Overflow用户
提问于 2020-04-11 05:32:06
回答 1查看 1.9K关注 0票数 3

enumerate()函数接受一个迭代器并返回一个枚举器对象。这个对象可以被视为迭代器,并且在每次迭代时,它都返回一个带有元组的第一个项目--迭代号(默认情况下从0开始)的二元组,以及调用迭代器enumerate()的下一个项的第二个项。

引用自“Python 3中的编程”-- Python语言的完整介绍。

我是Python新手,并不真正理解上面的文本意味着什么。但是,根据我对示例代码的理解,枚举器对象返回一个带有索引号和迭代器值的二元组。我说的对吗?

迭代器和枚举器有什么区别?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-11 06:01:18

你对它最终所做的理解是正确的,但这句话中的措辞是误导的。在“枚举器”(实际上不是一个标准术语)和迭代器之间没有区别,更确切地说,“枚举器”是一种迭代器。enumerate返回一个enumerate对象,因此enumerate是一个类

代码语言:javascript
运行
复制
>>> enumerate
<class 'enumerate'>
>>> type(enumerate)
<class 'type'>
>>> enumerate(())
<enumerate object at 0x10ad9c300>

就像其他内置类型的list一样

代码语言:javascript
运行
复制
>>> list
<class 'list'>
>>> type(list)
<class 'type'>
>>> type([1,2,3]) is list
True

或自定义类型:

代码语言:javascript
运行
复制
>>> class Foo:
...     pass
...
>>> Foo
<class '__main__.Foo'>
<class 'type'>
>>> type(Foo())
<class '__main__.Foo'>
>>>

enumerate对象是迭代器。不是说它们可以被“像”迭代器那样对待,它们是迭代器,迭代器是满足以下条件的任何类型:它们定义了一个__iter____next__

代码语言:javascript
运行
复制
>>> en = enumerate([1])
>>> en.__iter__
<method-wrapper '__iter__' of enumerate object at 0x10ad9c440>
>>> en.__next__
<method-wrapper '__next__' of enumerate object at 0x10ad9c440>

iter(iterator) is iterator

代码语言:javascript
运行
复制
>>> iter(en) is en
True
>>> en
<enumerate object at 0x10ad9c440>
>>> iter(en)
<enumerate object at 0x10ad9c440>

请参见:

代码语言:javascript
运行
复制
>>> next(en)
(0, 1)

现在,确切地说,它不返回索引值本身,而是返回一个二元组,其中包含可迭代中传递的下一个值以及单调递增的整数(默认从0开始),但它可以接受一个start参数,而可迭代传入的值不必是可索引的:

代码语言:javascript
运行
复制
>>> class Iterable:
...     def __iter__(self):
...         yield 1
...         yield 2
...         yield 3
...
>>> iterable = Iterable()
>>> iterable[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'Iterable' object is not subscriptable
>>> list(enumerate(iterable))
[(0, 1), (1, 2), (2, 3)]
>>> list(enumerate(iterable, start=1))
[(1, 1), (2, 2), (3, 3)]
>>> list(enumerate(iterable, start=17))
[(17, 1), (18, 2), (19, 3)]
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61152521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档