Python 中的一切都是有原因的。搭载Python的所有系统都依赖于类似50的内置功能,其中大部分是非常有用的,独特的,如format()
,len()
,list()
,或range()
。我不明白为什么enumerate()
存在。
它已在PEP 279 (2002) 中引入并保留至今。我真的不明白它为什么存在,因为它可以使用更多 2-3 个字符的其他更重要的内置函数来完成。来自Python 文档:
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()
有一些我没有看到的独特功能。
因为不是每个迭代都有长度。
>>> 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)
当然,这是一个微不足道的例子。但是我可以想到许多现实世界的对象,您无法合理地预先计算长度。要么是因为长度是无限的(请参阅itertools.count
参考资料),要么是因为您正在迭代的对象本身不知道派对何时结束。
您的迭代器可能正在从未知大小的远程数据库中获取数据块,或者连接可能会在没有警告的情况下丢失。或者它可以处理用户输入。
def get_user_input():
while True:
i = input('input value or Q to quit: ')
if i == 'Q':
break
yield i
您无法获得 的长度get_user_input()
,但您可以enumerate
通过next
(或迭代)获取所有输入。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句