Python 除了zip(range(len())之外,还有更多的内容需要枚举吗?
Python中的一切都是有原因的。所有由Python支持的系统都依赖于大约50个内置函数,其中大多数函数都非常有用和独特,如Python 除了zip(range(len())之外,还有更多的内容需要枚举吗?,python,string,list,enumerate,Python,String,List,Enumerate,Python中的一切都是有原因的。所有由Python支持的系统都依赖于大约50个内置函数,其中大多数函数都非常有用和独特,如format()、len()、list()、或range()我不明白为什么存在enumerate() 它于(2002年)推出,一直保留到现在。我真的不明白它为什么会存在,因为它可以使用其他更重要的内置函数来完成,只需2-3个字符。从: 使用更重要的内置函数的实现如下: for i in zip(range(len(seasons)), seasons): print
format()
、len()
、list()
、或range()
我不明白为什么存在enumerate()
它于(2002年)推出,一直保留到现在。我真的不明白它为什么会存在,因为它可以使用其他更重要的内置函数来完成,只需2-3个字符。从:
使用更重要的内置函数的实现如下:
for i in zip(range(len(seasons)), seasons):
print(i)
这两者是相同的,我们都知道zip()
和range()
是多么重要。那么,为什么要添加一个内置函数,而除了这两个函数之外似乎没有任何附加值呢
在中,以下是与枚举()等效的代码:
底线:我想知道
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\u user\u input()
的长度,但您可以在通过next
(或迭代)获取输入时枚举所有输入。我看到的最大问题是可伸缩的
不一定是有限的<代码>长度
并非对每个结构都有意义:
def infinite():
n = 0
while True:
yield n
n += 1
for i, n in enumerate(infinite()):
print(i, n)
无法使用您的实现枚举无限
如果您使用infinite
(或itertools.count
)作为范围
的替代品,它将起到以下作用:
for i, n in zip(infinite(), seasons):
print(i, n)
但不幸的是,与Clojure等语言不同,它不可能是无限的。您必须指定结束,这需要提前知道长度,这使这里的事情变得复杂。我觉得在这里使用枚举作为枚举的替代方法更合适,因为枚举
不需要知道它只在迭代中提供下一个数字和下一个对象的长度
from itertools import count
for i, o in zip(count(), iterable):
...
V.S
for i, o in enumerate(iterable):
...
此外,使用len
会添加另一个不必要的操作。尽管enumerate的加入消除了从库中导入这些简单需求的需要。我认为enumerate
和等效的zip(range(len…
mess)之间的可读性差异是不言而喻的当技术上可以使用for
循环时,为什么要有列表理解?当技术上可以使用while
时,为什么要有for
?等等。这一切都是为了在不需要大量样板文件的情况下优雅地表达常见用例。同样,在您的替代方法中,您也在重复
,这通常不是一件好事。因此,枚举
还是更好。为什么整个itertools
模块,而这些都是可以使用更原始的东西构建的配方…?当您可以用Malbolge对所有内容进行编码时,Python为什么还存在?您的模块如何更灵活?enumerate是如何实现的ble?我觉得这里面有一个答案:为什么你需要为如此普通的东西导入一个模块…
def infinite():
n = 0
while True:
yield n
n += 1
for i, n in enumerate(infinite()):
print(i, n)
for i, n in zip(infinite(), seasons):
print(i, n)
from itertools import count
for i, o in zip(count(), iterable):
...
for i, o in enumerate(iterable):
...