PEP 212 – Schleifenzähler-Iteration
- Autor:
- Peter Schneider-Kamp <nowonder at nowonder.de>
- Status:
- Abgelehnt
- Typ:
- Standards Track
- Erstellt:
- 22-Aug-2000
- Python-Version:
- 2.1
- Post-History:
Inhaltsverzeichnis
Ablehnungsbescheid
Diese PEP wurde abgelehnt. enumerate(), eingeführt in PEP 279, deckt den in dieser PEP vorgeschlagenen Anwendungsfall ab, und der Autor der PEP ist nicht erreichbar gewesen.
Einleitung
Diese PEP beschreibt die oft vorgeschlagene Funktion, den Schleifenzähler in for-Schleifen verfügbar zu machen. Diese PEP verfolgt den Status und die Zuständigkeit dieser Funktion. Sie enthält eine Beschreibung der Funktion und skizziert die notwendigen Änderungen zur Unterstützung der Funktion. Diese PEP fasst Diskussionen in Mailinglisten-Foren zusammen und liefert URLs für weitere Informationen, wo angemessen. Die CVS-Revisionshistorie dieser Datei enthält die endgültige historische Aufzeichnung.
Motivation
Standard-for-Schleifen in Python iterieren über die Elemente einer Sequenz [1]. Oft ist es wünschenswert, stattdessen über die Indizes oder sowohl über die Elemente als auch über die Indizes zu iterieren.
Die gebräuchlichen Idiome, um dies zu erreichen, sind unintuitiv. Diese PEP schlägt zwei verschiedene Möglichkeiten vor, die Indizes verfügbar zu machen.
Schleifenzähler-Iteration
Das aktuelle Idiom zum Iterieren über die Indizes nutzt die eingebaute Funktion range
for i in range(len(sequence)):
# work with index i
Das Iterieren über sowohl Elemente als auch Indizes kann entweder durch das alte Idiom oder durch die Verwendung der neuen eingebauten Funktion zip [2] erreicht werden.
for i in range(len(sequence)):
e = sequence[i]
# work with index i and element e
oder
for i, e in zip(range(len(sequence)), sequence):
# work with index i and element e
Die vorgeschlagenen Lösungen
Es gibt drei diskutierte Lösungen. Eine fügt ein nicht reserviertes Schlüsselwort hinzu, die andere fügt zwei eingebaute Funktionen hinzu. Eine dritte Lösung fügt Methoden zu Sequenzobjekten hinzu.
Nicht reserviertes Schlüsselwort indexing
Diese Lösung würde die Syntax der for-Schleife erweitern, indem eine optionale Klausel <Variable> indexing hinzugefügt wird, die auch anstelle der Klausel <Variable> in verwendet werden kann.
Das Iterieren über die Indizes einer Sequenz würde somit so aussehen:
for i indexing sequence:
# work with index i
Das Iterieren über sowohl Indizes als auch Elemente wäre ähnlich:
for i indexing e in sequence:
# work with index i and element e
Eingebaute Funktionen indices und irange
Diese Lösung fügt zwei eingebaute Funktionen indices und irange hinzu. Die Semantik dieser Funktionen kann wie folgt beschrieben werden:
def indices(sequence):
return range(len(sequence))
def irange(sequence):
return zip(range(len(sequence)), sequence)
Diese Funktionen könnten entweder sofort oder verzögert implementiert werden und sollten leicht erweiterbar sein, um mehr als ein Sequenzargument zu akzeptieren.
Die Verwendung dieser Funktionen würde die Idiome für das Iterieren über die Indizes und über sowohl Elemente als auch Indizes vereinfachen.
for i in indices(sequence):
# work with index i
for i, e in irange(sequence):
# work with index i and element e
Methoden für Sequenzobjekte
Diese Lösung schlägt die Hinzufügung von Methoden indices, items und values zu Sequenzen vor, die das Iterieren nur über Indizes, sowohl über Indizes und Elemente, bzw. nur über Elemente ermöglichen.
Dies würde die Idiome für das Iterieren über Indizes und für das Iterieren über sowohl Elemente als auch Indizes immens vereinfachen.
for i in sequence.indices():
# work with index i
for i, e in sequence.items():
# work with index i and element e
Zusätzlich würde dies eine konsistente Iteration über die Elemente von Sequenzen und Dictionaries ermöglichen.
for e in sequence_or_dict.values():
# do something with element e
Implementierungen
Für alle drei Lösungen gibt es mehr oder weniger grobe Patches als Patches auf SourceForge.
for i indexing a in l: Exposition des Schleifenzähler-for-Schleifen [3]- Hinzufügen von
indices()undirange()zu Built-ins [4] - Hinzufügen der
items()-Methode zu listobject [5]
Alle wurden vom BDFL begutachtet und abgelehnt.
Beachten Sie, dass das Schlüsselwort indexing nur ein NAME in der Grammatik ist und somit die allgemeine Verwendung von indexing nicht behindert.
Probleme mit der Abwärtskompatibilität
Da keine Schlüsselwörter hinzugefügt werden und die Semantik des bestehenden Codes unverändert bleibt, können alle drei Lösungen ohne Bruch bestehenden Codes implementiert werden.
Urheberrecht
Dieses Dokument wurde gemeinfrei erklärt.
Referenzen
Quelle: https://github.com/python/peps/blob/main/peps/pep-0212.rst
Zuletzt geändert: 2025-02-01 08:55:40 GMT