拒收通知
此 PEP 已被拒绝。,在 PEP 279 中介绍, 涵盖了本 PEP 中提出的用例,并且 PEP 作者已经 遥 不可 及。enumerate()
介绍
此 PEP 描述了经常提出的公开循环的功能 for 循环中的计数器。此 PEP 跟踪 此功能。它包含对功能的描述和 概述了支持该功能所需的更改。这个PEP 总结在邮件列表论坛中进行的讨论,并提供 URL 以获取更多信息(如适用)。CVS 修订版 此文件的历史记录包含权威的历史记录。
赋予动机
Python 中的标准 for 循环遍历 序列 [1]。通常,需要遍历索引或 元素和索引都代替。
用于实现此目的的常见习语是不直观的。这 PEP提出了两种不同的指数暴露方式。
循环计数器迭代
当前循环索引的习语利用了 内置功能:range
for i in range(len(sequence)): # work with index i
元素和索引的循环可以通过以下方式实现 旧成语或使用新的内置函数 [2]:zip
for i in range(len(sequence)): e = sequence[i] # work with index i and element e
或:
for i, e in zip(range(len(sequence)), sequence): # work with index i and element e
建议的解决方案
已经讨论了三种解决方案。一个添加一个 nonreserved 关键字,另一个增加了两个内置功能。 第三种解决方案将方法添加到序列对象中。
非保留关键字
该解决方案将扩展 for 循环的语法,方法是将 也可以使用的可选条款 而不是子句。<variable> indexing<variable> in
因此,循环序列的索引将变为:
for i indexing sequence: # work with index i
类似地,在索引和元素上循环如下:
for i indexing e in sequence: # work with index i and element e
内置功能和
此解决方案添加了两个内置函数和 . 这些的语义可以描述如下:indicesirange
def indices(sequence): return range(len(sequence)) def irange(sequence): return zip(range(len(sequence)), sequence)
这些功能可以急切地或懒惰地实现,并且 应该易于扩展,以便接受多个序列 论点。
使用这些函数将简化循环的习语 在索引以及元素和索引上:
for i in indices(sequence): # work with index i for i, e in irange(sequence): # work with index i and element e
序列对象的方法
此解决方案建议将 和 方法添加到序列中,从而实现循环 仅索引,包括索引和元素,以及仅元素 分别。indicesitemsvalues
这将极大地简化循环索引的习语 以及循环访问元素和索引:
for i in sequence.indices(): # work with index i for i, e in sequence.items(): # work with index i and element e
此外,它还允许对元素进行循环 以一致的方式排列序列和字典:
for e in sequence_or_dict.values(): # do something with element e
实现
对于这三种解决方案,都存在一些或多或少的粗糙补丁 作为 SourceForge 的补丁:
for i indexing a in l
:公开 for 循环计数器 [3]将 和 添加到内置项 [4]
indices()
irange()
将方法添加到 ListObject [5]
items()
所有这些都被BDFL宣布并拒绝。
请注意,关键字只是 语法等并不妨碍 .indexing
NAME
indexing
向后兼容性问题
由于没有添加关键字和现有代码的语义 保持不变,三种解决方案都可以实施 在不破坏现有代码的情况下。
版权
本文档已置于公共领域。
文章声明:以上内容(如有图片或视频在内)除非注明,否则均为腾龙猫勺儿原创文章,转载或复制请以超链接形式并注明出处。
本文作者:猫勺本文链接:https://www.jo6.cn/post/95.html