Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

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

内置函数 indicesirange

此解决方案添加了两个内置函数 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]
  • 向内置函数添加 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