PEP 212 – 循环计数器迭代
- 作者:
- Peter Schneider-Kamp <nowonder at nowonder.de>
- 状态:
- 已拒绝
- 类型:
- 标准跟踪
- 创建日期:
- 2000年8月22日
- Python 版本:
- 2.1
- 发布历史:
拒绝通知
此PEP已被拒绝。PEP 279 中引入的 enumerate() 涵盖了此PEP中提出的用例,且PEP作者已无法联系。
引言
此PEP描述了经常被提议的在for-循环中公开循环计数器的功能。此PEP跟踪此功能的现状和所有权。它包含对该功能的描述,并概述了支持该功能所需的更改。此PEP总结了在邮件列表论坛中进行的讨论,并在适当的地方提供了更多信息的URL。此文件的CVS修订历史记录包含确切的历史记录。
动机
Python中的标准for-循环迭代序列的元素 [1]。通常,需要迭代索引或同时迭代元素和索引。
用于实现此目的的常见习惯用法不直观。此PEP提出了两种不同的公开索引的方法。
循环计数器迭代
当前用于迭代索引的习惯用法使用内置的 range 函数
for i in range(len(sequence)):
# work with index i
迭代元素和索引可以通过旧的习惯用法或使用新的 zip 内置函数来实现 [2]
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
提议的解决方案
已经讨论了三种解决方案。一种添加了非保留关键字,另一种添加了两个内置函数。第三种解决方案向序列对象添加了方法。
非保留关键字 indexing
此解决方案将通过添加可选的 <variable> indexing 子句来扩展for-循环的语法,该子句也可以代替 <variable> in 子句使用。
因此,迭代序列的索引将变为
for i indexing sequence:
# work with index i
迭代索引和元素也将类似地变为
for i indexing e in sequence:
# work with index i and element e
内置函数 indices 和 irange
此解决方案添加了两个内置函数 indices 和 irange。它们的语义可以描述如下
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
序列对象的方法
此解决方案提议向序列添加 indices、items 和 values 方法,它们分别允许仅迭代索引、同时迭代索引和元素以及仅迭代元素。
这将极大地简化迭代索引以及同时迭代元素和索引的习惯用法
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]- 将
indices()和irange()添加到内置函数中 [4] - 向listobject添加
items()方法 [5]
所有这些都被 BDFL 宣布并拒绝。
请注意,indexing 关键字在语法中只是一个 NAME,因此不会阻碍 indexing 的一般使用。
向后兼容性问题
由于没有添加关键字,并且现有代码的语义保持不变,因此所有三种解决方案都可以在不破坏现有代码的情况下实现。
版权
本文档已置于公共领域。
参考资料
来源:https://github.com/python/peps/blob/main/peps/pep-0212.rst