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()有一些我没有看到的独特功能。
因为不是每个迭代都有长度。
>>> 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(或迭代)获取所有输入。