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()
是否有一些我没有看到的独特功能
我看到的最大问题是
Iterable
不一定是有限的len
并不是每个结构都有意义:无法使用您的实现枚举
infinite
如果您使用
infinite
(或itertools.count
)作为range
的替代品,它将起到以下作用:但是,不幸的是,与Clojure等语言不同,^{} 不能是无限的。您必须指定结束,这需要提前知道时间的长度,这使得这里的事情变得复杂
我觉得在这里使用^{} 作为
enumerate
的替代品更合适,因为enumerate
不需要知道它只在迭代中提供下一个数字和下一个对象的长度V.S
此外,使用
len
增加了另一个不必要的操作。尽管包含enumerate消除了从库中导入以满足此类简单需求的需要因为不是每个iterable都有长度
当然,这是一个微不足道的例子。但我能想到很多现实世界中的物体,你不能合理地预先计算长度。要么因为长度是无限的(请参见^{} ),要么因为您迭代的对象本身不知道参与方何时结束
您的迭代器可能正在从大小未知的远程数据库中获取数据块,或者在没有警告的情况下连接可能丢失。或者它可以处理用户输入
您无法获取
get_user_input()
的长度,但可以在通过next
(或迭代)获取所有输入时enumerate
所有输入相关问题 更多 >
编程相关推荐