enumerate()函数接受一个迭代器并返回一个枚举器对象。这个对象可以被视为迭代器,并且在每次迭代时,它都返回一个带有元组的第一个项目--迭代号(默认情况下从0开始)的二元组,以及调用迭代器enumerate()的下一个项的第二个项。
引用自“Python 3中的编程”-- Python语言的完整介绍。
我是Python新手,并不真正理解上面的文本意味着什么。但是,根据我对示例代码的理解,枚举器对象返回一个带有索引号和迭代器值的二元组。我说的对吗?
迭代器和枚举器有什么区别?
发布于 2020-04-11 06:01:18
你对它最终所做的理解是正确的,但这句话中的措辞是误导的。在“枚举器”(实际上不是一个标准术语)和迭代器之间没有区别,更确切地说,“枚举器”是一种迭代器。enumerate返回一个enumerate对象,因此enumerate是一个类
>>> enumerate
<class 'enumerate'>
>>> type(enumerate)
<class 'type'>
>>> enumerate(())
<enumerate object at 0x10ad9c300>就像其他内置类型的list一样
>>> list
<class 'list'>
>>> type(list)
<class 'type'>
>>> type([1,2,3]) is list
True或自定义类型:
>>> class Foo:
... pass
...
>>> Foo
<class '__main__.Foo'>
<class 'type'>
>>> type(Foo())
<class '__main__.Foo'>
>>>enumerate对象是迭代器。不是说它们可以被“像”迭代器那样对待,它们是迭代器,迭代器是满足以下条件的任何类型:它们定义了一个__iter__和__next__
>>> 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
>>> iter(en) is en
True
>>> en
<enumerate object at 0x10ad9c440>
>>> iter(en)
<enumerate object at 0x10ad9c440>请参见:
>>> next(en)
(0, 1)现在,确切地说,它不返回索引值本身,而是返回一个二元组,其中包含可迭代中传递的下一个值以及单调递增的整数(默认从0开始),但它可以接受一个start参数,而可迭代传入的值不必是可索引的:
>>> 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)]https://stackoverflow.com/questions/61152521
复制相似问题