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