为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

湖上湖 2022-10-06 15:52:06
该enumerate()函数接受一个迭代器并返回一个枚举器对象。这个对象可以被视为一个迭代器,在每次迭代时它返回一个 2 元组,元组的第一项是迭代号(默认从 0 开始),第二项是迭代器中的下一项enumerate()被调用。引用自“Python 3 中的编程:Python 语言的完整介绍。我是 Python 新手,从上面的文字中并不真正理解它的含义。但是,根据我对示例代码的理解,枚举器对象返回一个带有索引号和迭代器值的 2 元组。我对吗?迭代器和枚举器有什么区别?
查看完整描述

1 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

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


查看完整回答
反对 回复 2022-10-06
  • 1 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信