除了 zip(range(len())) 之外,还有更多 enumerate() 吗?

Nic*_*ais -1 python string list enumerate

Python 中的一切都是有原因的。搭载Python的所有系统都依赖于类似50的内置功能,其中大部分是非常有用的,独特的,如format()len()list(),或range()我不明白为什么enumerate()存在

它已在PEP 279 (2002) 中引入并保留至今。我真的不明白它为什么存在,因为它可以使用更多 2-3 个字符的其他更重要的内置函数来完成。来自Python 文档

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
Run Code Online (Sandbox Code Playgroud)
for i in enumerate(seasons):
    print(i)
Run Code Online (Sandbox Code Playgroud)

使用更重要的内置函数的实现是这样的:

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

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

Python Docs 中,这里相当于enumerate()

def enumerate(sequence, start=0):
    n = start
    for elem in sequence:
        yield n, elem
        n += 1
Run Code Online (Sandbox Code Playgroud)

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

tim*_*geb 7

因为不是每个迭代都有长度。

>>> 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)
Run Code Online (Sandbox Code Playgroud)

当然,这是一个微不足道的例子。但是我可以想到许多现实世界的对象,您无法合理地预先计算长度。要么因为长度是无限的(见itertools.count参考资料),要么是因为您正在迭代的对象本身不知道派对何时结束。

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

def get_user_input():
     while True:
        i = input('input value or Q to quit: ')
        if i == 'Q':
            break
        yield i
Run Code Online (Sandbox Code Playgroud)

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