迭代器和枚举器对象之间的区别
Difference between Iterator and Enumerator object
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 的新手,不太理解上面文字的含义。但是,根据我对示例代码的理解,枚举器对象 returns 是一个具有索引号和迭代器值的二元组。我说的对吗?
迭代器和枚举器有什么区别?
您对它最终作用的理解是正确的,但该引用中的措辞具有误导性。 "enumerator"(不是真正的标准术语)和迭代器之间没有区别,或者更确切地说,"enumerator" 是 种 迭代器。 enumerate
returns 一个 enumerate
对象,所以 enumerate
是 a class:
>>> 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
个对象是迭代器。并不是说它们可以是"treated like"迭代器,它们是迭代器,迭代器是任何满足以下条件的类型:它们定义了一个__iter__
和[=23] =]:
>>> 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)
现在,具体来说,它 return 本身并不是一个索引值 ,而是 return 一个二元组,其中包含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)]
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 iteratorenumerate()
was called on.
引自“Python 编程 3 Python 语言的完整介绍”。
我是 Python 的新手,不太理解上面文字的含义。但是,根据我对示例代码的理解,枚举器对象 returns 是一个具有索引号和迭代器值的二元组。我说的对吗?
迭代器和枚举器有什么区别?
您对它最终作用的理解是正确的,但该引用中的措辞具有误导性。 "enumerator"(不是真正的标准术语)和迭代器之间没有区别,或者更确切地说,"enumerator" 是 种 迭代器。 enumerate
returns 一个 enumerate
对象,所以 enumerate
是 a class:
>>> 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
个对象是迭代器。并不是说它们可以是"treated like"迭代器,它们是迭代器,迭代器是任何满足以下条件的类型:它们定义了一个__iter__
和[=23] =]:
>>> 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)
现在,具体来说,它 return 本身并不是一个索引值 ,而是 return 一个二元组,其中包含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)]