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

尼古拉斯·热维斯

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

除了Finalize之外,还有其他更多的直接析构函数可用吗?

除了<span>之外,还有其他选择吗?

除了 tsc 之外,还有其他 TypeScript 工具吗?

除了拥有正确的方法之外,接口还有更多其他功能

除了for循环之外,还有更好的方法,

除了作为匿名方法之外,还有其他有用的替代用途吗?

除了访问DOM API的JavaScript之外,还有其他替代方法吗?

除了使用nodetool status之外,还有其他方法可以获取cassandra hostid吗?

除了使用Xpath之外,还有其他方法吗?

除了正则表达式(\\。|。)之外,还有其他Lua模式吗?

除了Javadoc之外,JDK类还有其他规范吗?

除了XSOM之外,还有其他解析XSD的框架吗?

除了减少混乱之外,还有其他清理Java中未使用的导入的原因吗?

除了alsactl存储之外,还有什么其他方法可以保存alsamixer设置吗?

除了.innerHTML之外,还有其他将Javascript生成的HTML插入DOM的选项吗?

除了主线程之外,还有其他特殊线程吗?

除了Caledon之外,还有其他基于Haskell的HOL编程语言吗?

除了注入温莎城堡类型的工厂之外,还有其他选择吗?

除了这些之外,android中还有其他传感器吗?

除了SELinux和AppArmor之外,还有其他LSM(Linux安全模块)吗?

除了全局,系统和本地之外,git配置设置还有其他地方吗?

除了在每个模型文件中包含require('mongoose')之外,还有其他更好的方法吗?

除了在SSIS中创建Parent Package变量之外,还有其他选择吗?

除了身份验证之外,还有其他方法可以区分用户吗?

除了 no_data_needed 之外,还有其他异常被 oracle 捕获吗?

除了获取DataFrame的子集之外,还有其他更快的选择吗?

除了在CTE的递归部分中使用ROW_NUMBER()之外,还有其他选择吗?

除了递归调用本身之外,命名被分配的函数还有其他用途吗?

除了可以运行macOS .app文件的macOS之外,还有其他替代方法吗?