PEP 212 – 循环计数器迭代
- 作者:
- Peter Schneider-Kamp <nowonder at nowonder.de>
- 状态:
- 已拒绝
- 类型:
- 标准跟踪
- 创建:
- 2000年8月22日
- Python 版本:
- 2.1
- 历史记录:
拒绝通知
此 PEP 已被拒绝。 enumerate()
(在 PEP 279 中引入)涵盖了此 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
上次修改: 2023-09-09 17:39:29 GMT