除了zip(range(len())之外,还有更多的内容需要枚举吗?

2024-04-24 11:36:41 发布

您现在位置:Python中文网/ 问答频道 /正文

Python中的一切都是有原因的。Python支持的所有系统都依赖于大约50个内置函数,其中大多数函数非常有用且独特,如format()len()list()range()我不明白enumerate()为什么存在

它是在2002年引入的,一直保留到现在。我真的不明白它为什么会存在,因为它可以使用其他更重要的内置函数来完成,只需2-3个字符。从Python Docs开始:

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
for i in enumerate(seasons):
    print(i)

使用更重要的内置函数的实现如下:

for i in zip(range(len(seasons)), seasons):
    print(i)
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]

这两者是相同的,我们都知道zip()range()是多么的重要。那么,为什么要添加一个内置函数,而除了这两个函数之外似乎没有任何附加值呢

Python Docs中,这里是enumerate()的等价物:

def enumerate(sequence, start=0):
    n = start
    for elem in sequence:
        yield n, elem
        n += 1

底线:我想知道enumerate()是否有一些我没有看到的独特功能


Tags: 函数indocsforlenrangezip内置
3条回答

我看到的最大问题是Iterable不一定是有限的len并不是每个结构都有意义:

def infinite():
    n = 0
    while True:
        yield n
        n += 1

for i, n in enumerate(infinite()):
    print(i, n)

无法使用您的实现枚举infinite

如果您使用infinite(或itertools.count)作为range的替代品,它将起到以下作用:

for i, n in zip(infinite(), seasons):
    print(i, n)

但是,不幸的是,与Clojure等语言不同,^{}不能是无限的。您必须指定结束,这需要提前知道时间的长度,这使得这里的事情变得复杂

我觉得在这里使用^{}作为enumerate的替代品更合适,因为enumerate不需要知道它只在迭代中提供下一个数字和下一个对象的长度

from itertools import count
for i, o in zip(count(), iterable):
    ...

V.S

for i, o in enumerate(iterable):
    ...

此外,使用len增加了另一个不必要的操作。尽管包含enumerate消除了从库中导入以满足此类简单需求的需要

因为不是每个iterable都有长度

>>> def countdown(x):
...     while x >= 0:
...         yield x
...         x -= 1
...         
>>> down = countdown(3)
>>> len(down)
Traceback (most recent call last):
[...]
TypeError: object of type 'generator' has no len()
>>> enum = enumerate(down)
>>> next(enum)
(0, 3)
>>> next(enum)
(1, 2)

当然,这是一个微不足道的例子。但我能想到很多现实世界中的物体,你不能合理地预先计算长度。要么因为长度是无限的(请参见^{}),要么因为您迭代的对象本身不知道参与方何时结束

您的迭代器可能正在从大小未知的远程数据库中获取数据块,或者在没有警告的情况下连接可能丢失。或者它可以处理用户输入

def get_user_input():
     while True:
        i = input('input value or Q to quit: ')
        if i == 'Q':
            break
        yield i

您无法获取get_user_input()的长度,但可以在通过next(或迭代)获取所有输入时enumerate所有输入

相关问题 更多 >