2000-07-22 05:02:49 -04:00
|
|
|
|
PEP: 212
|
2000-08-23 01:06:22 -04:00
|
|
|
|
Title: Loop Counter Iteration
|
2000-07-22 05:02:49 -04:00
|
|
|
|
Version: $Revision$
|
2006-03-23 15:13:19 -05:00
|
|
|
|
Last-Modified: $Date$
|
2000-08-23 01:06:22 -04:00
|
|
|
|
Author: nowonder@nowonder.de (Peter Schneider-Kamp)
|
2006-05-01 16:03:44 -04:00
|
|
|
|
Status: Deferred
|
2000-08-23 01:06:22 -04:00
|
|
|
|
Type: Standards Track
|
|
|
|
|
Created: 22-Aug-2000
|
2000-12-14 10:37:25 -05:00
|
|
|
|
Python-Version: 2.1
|
2000-07-22 05:02:49 -04:00
|
|
|
|
|
|
|
|
|
|
2000-07-22 11:13:23 -04:00
|
|
|
|
Introduction
|
|
|
|
|
|
2000-08-23 01:06:22 -04:00
|
|
|
|
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.
|
2000-07-22 11:13:23 -04:00
|
|
|
|
|
|
|
|
|
|
2000-08-23 01:06:22 -04:00
|
|
|
|
Motivation
|
2000-07-22 11:13:23 -04:00
|
|
|
|
|
2000-08-23 01:06:22 -04:00
|
|
|
|
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.
|
2000-07-22 11:13:23 -04:00
|
|
|
|
|
2000-08-23 01:06:22 -04:00
|
|
|
|
The common idioms used to accomplish this are unintuitive. This
|
|
|
|
|
PEP proposes two different ways of exposing the indices.
|
2000-07-22 11:13:23 -04:00
|
|
|
|
|
|
|
|
|
|
2000-08-23 01:06:22 -04:00
|
|
|
|
Loop counter iteration
|
|
|
|
|
|
|
|
|
|
The current idiom for looping over the indices makes use of the
|
|
|
|
|
built-in 'range' function:
|
|
|
|
|
|
|
|
|
|
for i in range(len(sequence)):
|
|
|
|
|
# work with index i
|
|
|
|
|
|
|
|
|
|
Looping over both elements and indices can be achieved either by the
|
|
|
|
|
old idiom or by using the new 'zip' built-in function[2]:
|
|
|
|
|
|
|
|
|
|
for i in range(len(sequence)):
|
|
|
|
|
e = sequence[i]
|
|
|
|
|
# work with index i and element e
|
|
|
|
|
|
|
|
|
|
or
|
|
|
|
|
|
|
|
|
|
for i, e in zip(range(len(sequence)), sequence):
|
|
|
|
|
# work with index i and element e
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The Proposed Solutions
|
|
|
|
|
|
2000-12-14 10:37:25 -05:00
|
|
|
|
There are three solutions that have been discussed. One adds a
|
2000-08-23 01:06:22 -04:00
|
|
|
|
non-reserved keyword, the other adds two built-in functions.
|
2000-12-14 10:37:25 -05:00
|
|
|
|
A third solution adds methods to sequence objects.
|
2000-08-23 01:06:22 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Non-reserved keyword 'indexing'
|
|
|
|
|
|
|
|
|
|
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:
|
|
|
|
|
|
|
|
|
|
for i indexing sequence:
|
|
|
|
|
# work with index i
|
|
|
|
|
|
|
|
|
|
Looping over both indices and elements would similarly be:
|
|
|
|
|
|
|
|
|
|
for i indexing e in sequence:
|
|
|
|
|
# work with index i and element e
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Built-in functions 'indices' and 'irange'
|
|
|
|
|
|
|
|
|
|
This solution adds two built-in functions 'indices' and 'irange'.
|
|
|
|
|
The semantics of these can be described as follows:
|
|
|
|
|
|
|
|
|
|
def indices(sequence):
|
|
|
|
|
return range(len(sequence))
|
|
|
|
|
|
|
|
|
|
def irange(sequence):
|
|
|
|
|
return zip(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:
|
|
|
|
|
|
|
|
|
|
for i in indices(sequence):
|
|
|
|
|
# work with index i
|
|
|
|
|
|
|
|
|
|
for i, e in irange(sequence):
|
|
|
|
|
# work with index i and element e
|
2000-07-22 11:13:23 -04:00
|
|
|
|
|
|
|
|
|
|
2000-12-14 10:37:25 -05:00
|
|
|
|
Methods for sequence objects
|
|
|
|
|
|
|
|
|
|
This solution proposes the addition of 'indices', 'items'
|
|
|
|
|
and 'values' 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:
|
|
|
|
|
|
|
|
|
|
for i in sequence.indices():
|
|
|
|
|
# work with index i
|
|
|
|
|
|
|
|
|
|
for i, e in sequence.items():
|
|
|
|
|
# work with index i and element e
|
|
|
|
|
|
|
|
|
|
Additionally it would allow to do looping over the elements
|
|
|
|
|
of sequences and dicitionaries in a consistent way:
|
|
|
|
|
|
|
|
|
|
for e in sequence_or_dict.values():
|
|
|
|
|
# do something with element e
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Implementations
|
|
|
|
|
|
|
|
|
|
For all three solutions some more or less rough patches exist
|
|
|
|
|
as patches at SourceForge:
|
|
|
|
|
|
|
|
|
|
'for i indexing a in l': exposing the for-loop counter[3]
|
|
|
|
|
add indices() and irange() to built-ins[4]
|
|
|
|
|
add items() method to listobject[5]
|
|
|
|
|
|
|
|
|
|
All of them have been pronounced on and rejected by the BDFL.
|
|
|
|
|
|
|
|
|
|
Note that the 'indexing' keyword is only a NAME in the
|
|
|
|
|
grammar and so does not hinder the general use of 'indexing'.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
|
2000-07-22 11:13:23 -04:00
|
|
|
|
Copyright
|
|
|
|
|
|
|
|
|
|
This document has been placed in the public domain.
|
|
|
|
|
|
|
|
|
|
|
2000-08-23 01:06:22 -04:00
|
|
|
|
References
|
|
|
|
|
|
|
|
|
|
[1] http://www.python.org/doc/current/ref/for.html
|
2006-03-28 21:02:27 -05:00
|
|
|
|
[2] Lockstep Iteration, PEP 201
|
2000-12-14 10:37:25 -05:00
|
|
|
|
[3] http://sourceforge.net/patch/download.php?id=101138
|
|
|
|
|
[4] http://sourceforge.net/patch/download.php?id=101129
|
|
|
|
|
[5] http://sourceforge.net/patch/download.php?id=101178
|
2000-08-23 01:06:22 -04:00
|
|
|
|
|
|
|
|
|
|
2000-07-22 05:02:49 -04:00
|
|
|
|
|
|
|
|
|
Local Variables:
|
|
|
|
|
mode: indented-text
|
|
|
|
|
indent-tabs-mode: nil
|
|
|
|
|
End:
|