Die Python-Funktion iter() erzeugt einen Iterator aus zwei verschiedenen Eingaben: entweder aus einem Iterable (list, tuple, str, dict, ...) — dann ruft sie intern __iter__() auf — oder aus einer callable Funktion mit Sentinel-Wert — dann liefert der Iterator solange Werte, bis die Funktion den Sentinel zurückgibt. Die zweite Form ist ein wenig bekanntes, aber elegantes Werkzeug für Streams und Polling-Schleifen.
Einleitung
In Python kennen wir Iterables und Iteratoren. Ein Iterable ist alles, was sich mit for x in obj durchlaufen lässt — Listen, Strings, Dicts, Generatoren. Ein Iterator ist das Objekt, das tatsächlich __next__() aufruft und Element für Element liefert.
iter(iterable) ist der formale Weg, aus einem Iterable einen Iterator zu machen — meist als Vorbereitung für next()-Aufrufe oder zur expliziten Steuerung der Iteration.
Die Zwei-Argument-Form iter(callable, sentinel) ist seltener bekannt: Sie erzeugt einen Iterator, der bei jedem next() die Callable aufruft und das Ergebnis liefert — bis dieses Ergebnis == sentinel ist. Das ist perfekt für Datei-Streams, Netzwerk-Reads, Polling und alle Szenarien, in denen ein Endsignal über einen Wert kommt.
Syntax
iter(object) # aus Iterable
iter(callable, sentinel) # bis callable() == sentinelobject Ein Iterable mit __iter__()-Methode oder ein Sequenz-Objekt mit __getitem__().
callable Eine 0-stellige Funktion oder Lambda. Wird bei jedem next()-Aufruf einmal aufgerufen.
sentinel Wert, bei dessen Rückgabe die Iteration endet (StopIteration).
Rückgabewert
Ein Iterator-Objekt. Aufruf von next() liefert das nächste Element, am Ende StopIteration.
Beispiele
Iterator aus Liste
numbers = [1, 2, 3]
it = iter(numbers)
print(next(it))
print(next(it))
print(next(it))
try:
print(next(it))
except StopIteration:
print("fertig")1
2
3
fertigAus String
it = iter("abc")
print(list(it))['a', 'b', 'c']Sentinel-Form
# Counter, der bei 5 stoppt
counter = iter(lambda i=[0]: (i.__setitem__(0, i[0] + 1) or i[0]), 5)
print(list(counter))[1, 2, 3, 4]Praktische Beispiele
Datei in fester Block-Größe lesen
# Liest 1024 Bytes auf einmal — bis EOF (leerer Bytes-String)
with open("big.bin", "rb") as f:
for block in iter(lambda: f.read(1024), b""):
process(block)Erstes passendes Element finden
users = [
{"name": "Alice", "alter": 17},
{"name": "Bob", "alter": 24},
{"name": "Cleo", "alter": 31},
]
# next() mit Generator und Default
first_adult = next(
(u for u in users if u["alter"] >= 18),
None,
)
print(first_adult){'name': 'Bob', 'alter': 24}Manueller Iteratoren-Reset
# Iteratoren sind „verbraucht" nach Durchlauf — frischen Iterator holen:
data = [10, 20, 30]
for _ in range(2):
for n in iter(data):
print(n, end=" ")
print()10 20 30
10 20 30 Praktische Hinweise
for-Schleifen rufeniter()automatisch auf — du brauchst es selten explizit.- Iteratoren sind einmal-konsumierbar: Nach dem Durchlauf ist er „leer" —
iter()auf das Original holt einen neuen. - Sentinel-Form ist ideal für stream-artige APIs (
socket.recv,f.read,queue.get_nowait). - Verwandte Funktionen:
next()(nächstes Element),enumerate()(Index + Element),itertools(Iterator-Bibliothek).