gpt4 book ai didi

python - 迭代器和枚举器对象之间的区别

转载 作者:行者123 更新时间:2023-12-05 02:55:35 26 4
gpt4 key购买 nike

The enumerate() function takes an iterator and returns an enumerator object. This object can be treated like an iterator, and at each iteration it returns a 2-tuple with the tuple's first item the iteration number (by default starting from 0), and the second item the next item from the iterator enumerate() was called on.

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

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

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

最佳答案

您对它最终作用的理解是正确的,但该引用中的措辞具有误导性。 “枚举器”(不是真正的标准术语)和迭代器之间没有区别,或者更确切地说,“枚举器”是一种迭代器。 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)是迭代器:

>>> iter(en) is en
True
>>> en
<enumerate object at 0x10ad9c440>
>>> iter(en)
<enumerate object at 0x10ad9c440>

参见:

>>> next(en)
(0, 1)

现在,具体来说,它不返回索引值本身,而是返回一个二元组,其中包含传入的 iterable 中的下一个值以及单调递增的整数,默认情况下从 0 开始,但它可以接受一个 start 参数,并且传入的 iterable 不必是可索引的:

>>> 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)]

关于python - 迭代器和枚举器对象之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61152521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com