精慕HU
您对其最终作用的理解是正确的,但该引文中的措辞具有误导性。“枚举器”(不是真正的标准术语)和迭代器之间没有区别,或者更确切地说,“枚举器”是一种迭代器。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 listTrue或自定义类型:>>> class Foo:... pass...>>> Foo<class '__main__.Foo'><class 'type'>>>> type(Foo())<class '__main__.Foo'>>>>enumerate对象是迭代器。并不是说它们可以被“视为”迭代器,它们是迭代器,迭代器是满足以下条件的任何类型:它们定义了 a__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 enTrue>>> 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)]