Iteratoren in Python (Iteratoren in Python), Lektion, Seite 723971
https://www.purl.org/stefan_ram/pub/iteratoren_python (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Python-Kurs

Iteratoren in Python 

Ein Iterator  ist ein Objekt, von dem wiederholt Objekte abgerufen werden können (eine Objektquelle, ein Spender für Objekte).

Englisch: “iterate ” + “-or ” = “iterator ”, „etwas, das wiederholt“ – hier: „etwas, das wiederholt gibt“.

Falls ein Iterator einmal kein Objekt mehr liefern kann, führt der Versuch des Abrufs eines Objekts zu einem Laufzeitfehler  vom Typ »StopIteration«.

Englisch: “iterate ” + “-ion ” = “iteration ”, „Wiederholung“. Das Wort „Iteration“ steht sogar im Duden! (online-Duden, Stand: 2020)

Wir nehmen einmal an, ›t‹ sei ein Iterator.

Dann könnte ›t‹ beispielsweise

Weitere Abrufe würden dann immer wieder zu einem Laufzeitfehler vom Typ »StopIteration« führen. Der Iterator wäre „verbraucht“.

Man kann sich einen Iterator wie einen Nummernspender vorstellen, wie er in manchen Warteräumen hängt. Bei jeder Betätigung eines Tasters erhält man ein Kärtchen (Objekt) mit einer neuen Wartenummer, solange bis der Vorrat an Kärtchen verbraucht (»StopIteration«) ist.

Wir uns daher oft vor, daß ein Iterator, die Objekte „enthält“, die man von ihm abrufen kann (obwohl diese nicht unbedingt immer alle direkt in dem Iterator gespeichert sein müssen, es kann auch sein, daß sie erst bei Bedarf erzeugt werden).

Die Funktion ›next

Um zu versuchen, ein Objekt von einem Iterator zu erhalten, ruft man in Python  die Funktion ›next‹ mit dem Iterator als Argument auf.

Konsolenprotokoll

from multiprocessing.pool import job_counter

next( job_counter )

0
next( job_counter )
1
next( job_counter )
2

Die Funktion ›next‹ ist eine Wertwirkfunktion : Ihr Wert  ist das aktuelle Objekt des Iterators, und die von ihr bewirkte Änderung  besteht darin, den Iterator auf das nächste Objekt weiterzustellen. (Sie ähnelt damit der Funktion ›random‹, die man als eine Quelle von Zufallszahlen ansehen kann.)

Ein weiteres Beispiel für einen Iterator (1)

Ebenfalls ein Iterator ist das Objekt ›stdin‹ aus dem Modul ›sys‹. Es liefert jeweils die nächste Eingabezeile (einschließlich das Zeilenendes) als Zeichenfolge. Daher ist es nötig, nach der Auswertung von »next( stdin )« eine Zeile einzugeben (mit der Eingabetaste) bevor das Programm weiterläuft.

Konsole

from sys import stdin

"Eingabe = " + next( stdin )

abc
Eingabe = abc\n

Durch »\n« wird symbolisch das Zeilenendzeichen (entsprechend der Eingabetaste) angezeigt, daß bei Verwendung von »next( stdin )« ebenfalls noch zu der Eingabe gehört.

Durch Eingabe von Strg-Z („^Z“, Strg-D unter Linux ) kann ein Benutzer mitteilen, daß er keine weiteren Eingaben mehr hat. Dies führt dann zu einem Laufzeitfehler vom Typ »StopIteration«. Dadurch wird ausgedrückt, daß derzeit keine weiteren Werte mehr verfügbar sind.

Konsole
"Eingabe = " + next( stdin )
^Z
StopIteration

Erkennen von Iteratoren

In der Regel erfährt man aus der Dokumentation einer Bibliothek, welche Objekte Iteratoren sind, falls man diese Information zur Benutzung der Bibliothek benötigt. Daher ist es nur selten nötig, durch ein Programm zu ermitteln, ob ein Objekt ein Iterator ist.

Wir können ›next‹ versuchsweise mit einem Objekt aufrufen, um zu erfahren, ob das Objekt ein Iterator ist.

Konsole
next( True )
TypeError: 'bool' object is not an iterator

Die Meldung »TypeError: 'bool' object is not an iterator« sagt deutlich, daß das Objekt ›2‹ kein Iterator ist.

Solche Tests des „Erkennens durch Ausprobieren“ finden ihre Grenzen in einem Programm aber darin, daß ein Aufruf wie »next( stdin )« ein Programm dauerhaft blockieren könnte (wenn niemand etwa eingibt) oder daß durch Aufruf von »next« sogar schädliche Folgen ausgelöst werden könnten.

Rückblende Wir hatten schon die Begriffe „System“ und „Zustand“ kennengelernt. Ein Iterator ist solch ein System, mit einem veränderlichen Zustand.

Anwendungsgebiete von Iteratoren

 

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723971 stefan_ram:723971 Iteratoren in Python Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723971, slrprddef723971, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/iteratoren_python