PEP 212 – Loop Counter Iteration
- Author:
- Peter Schneider-Kamp <nowonder at nowonder.de>
- Status:
- Rejected
- Type:
- Standards Track
- Created:
- 22-Aug-2000
- Python-Version:
- 2.1
- Post-History:
Rejection Notice
This PEP has been rejected.enumerate()
,introduced inPEP 279,
covers the use-case proposed in this PEP, and the PEP author has been
unreachable.
Introduction
This PEP describes the often proposed feature of exposing the loop counter in for-loops. This PEP tracks the status and ownership of this feature. It contains a description of the feature and outlines changes necessary to support the feature. This PEP summarizes discussions held in mailing list forums, and provides URLs for further information, where appropriate. The CVS revision history of this file contains the definitive historical record.
Motivation
Standard for-loops in Python iterate over the elements of a sequence[1].Often it is desirable to loop over the indices or both the elements and the indices instead.
The common idioms used to accomplish this are unintuitive. This PEP proposes two different ways of exposing the indices.
Loop counter iteration
The current idiom for looping over the indices makes use of the
built-inrange
function:
foriinrange(len(sequence)):
# work with index i
Looping over both elements and indices can be achieved either by the
old idiom or by using the newzip
built-in function[2]:
foriinrange(len(sequence)):
e=sequence[i]
# work with index i and element e
or:
fori,einzip(range(len(sequence)),sequence):
# work with index i and element e
The Proposed Solutions
There are three solutions that have been discussed. One adds a non-reserved keyword, the other adds two built-in functions. A third solution adds methods to sequence objects.
Non-reserved keywordindexing
This solution would extend the syntax of the for-loop by adding
an optional<variable>indexing
clause which can also be used
instead of the<variable>in
clause.
Looping over the indices of a sequence would thus become:
foriindexingsequence:
# work with index i
Looping over both indices and elements would similarly be:
foriindexingeinsequence:
# work with index i and element e
Built-in functionsindices
andirange
This solution adds two built-in functionsindices
andirange
.
The semantics of these can be described as follows:
defindices(sequence):
returnrange(len(sequence))
defirange(sequence):
returnzip(range(len(sequence)),sequence)
These functions could be implemented either eagerly or lazily and should be easy to extend in order to accept more than one sequence argument.
The use of these functions would simplify the idioms for looping over the indices and over both elements and indices:
foriinindices(sequence):
# work with index i
fori,einirange(sequence):
# work with index i and element e
Methods for sequence objects
This solution proposes the addition ofindices
,items
andvalues
methods to sequences, which enable looping over
indices only, both indices and elements, and elements only
respectively.
This would immensely simplify the idioms for looping over indices and for looping over both elements and indices:
foriinsequence.indices():
# work with index i
fori,einsequence.items():
# work with index i and element e
Additionally it would allow to do looping over the elements of sequences and dictionaries in a consistent way:
foreinsequence_or_dict.values():
# do something with element e
Implementations
For all three solutions some more or less rough patches exist as patches at SourceForge:
foriindexingainl
:exposing the for-loop counter[3]- add
indices()
andirange()
to built-ins[4] - add
items()
method to listobject[5]
All of them have been pronounced on and rejected by the BDFL.
Note that theindexing
keyword is only aNAME
in the
grammar and so does not hinder the general use ofindexing
.
Backward Compatibility Issues
As no keywords are added and the semantics of existing code remains unchanged, all three solutions can be implemented without breaking existing code.
Copyright
This document has been placed in the public domain.
References
Source:https://github.com/python/peps/blob/main/peps/pep-0212.rst
Last modified:2023-09-09 17:39:29 GMT