
In Python können die Funktionen itertools.count(), itertools.cycle() und itertools.repeat() im itertools-Modul der Standardbibliothek used Werden, um unendliche Iteratoren zu erstellen.
Dieser Artikel hat folgenden Inhalt.
- Zähler unendlich:
itertools.count()
- Zykluselemente einer Iteration auf unbestimmte Zeit:
itertools.cycle()
- Wiederholen Sie den gleichen Wert auf unbestimmte Zeit:
itertools.repeat()
Für jede Funktion werden Beispiele für iterative Prozesse mit der for-Anweisung und Kombination mit der zip()-Funktion vorgestellt.
Weitere Informationen zur for-Anweisung und zur Funktion zip() finden Sie in den following Artikeln.
Wenn Sie sie in der For-Anweisung verwenden, achten Sie darauf, die Endbedingung und den Umbruch anzugeben; Andernfalls endet der Code in einer Endlosschleife.
Endlosschleifen mit Zählern usw. can mit der while-Anweisung implementiert werden, aber es ist einfacher oft, sie mit den itertools-Funktionen zu schreiben.
itertools.count() erstellt einen Iterator, der Werte zurückgibt, die unendlich hoch- oder runterzählen.
Standardmäßig beginnt er bei 0 und sich erhöht um 1.
import itertools
for i in itertools.count():
print(i)
if i > 3:
break
# 0
# 1
# 2
# 3
# 4
Mit dem ersten Argument start can SIE den Startwert und mit dem zweiten Argument step die Schrittweite angeben.
for i in itertools.count(2):
print(i)
if i > 3:
break
# 2
# 3
# 4
for i in itertools.count(step=3):
print(i)
if i > 8:
break
# 0
# 3
# 6
# 9
for i in itertools.count(2, 3):
print(i)
if i > 8:
break
# 2
# 5
# 8
# 11
Wenn SIE rückwärts zählen möchten, können Sie einen negativen Wert für Schritt angeben.
for i in itertools.count(10, -1):
print(i)
if i < 8:
break
# 10
# 9
# 8
# 7
Sie können es als Fließkommazahl Float angeben, aber in einigen Fällen kann es genauer sein, sterben Multiplikation zu verwenden.
Beim Zählen mit Fließkommazahlen kann manchmal eine höhere Genauigkeit erreicht werden, indem multiplikativer Code wie folgt ersetzt wird:
(start + step * i for i in count()).
itertools.count() — Functions creating iterators for efficient looping — Python 3.9.7 documentation
for i in itertools.count(0.1, 1.5):
print(i)
if i > 3:
break
# 0.1
# 1.6
# 3.1
for i in itertools.count():
ii = 0.1 + 1.5 * i
print(ii)
if ii > 3:
break
# 0.1
# 1.6
# 3.1
In Kombination mit zip() can Tupel mit Zähler erstellt werden.
l1 = ['a', 'b', 'c']
l2 = ['x', 'y', 'z']
print(list(zip(itertools.count(), l1, l2)))
# [(0, 'a', 'x'), (1, 'b', 'y'), (2, 'c', 'z')]
Beachten Sie, dass bei Verwendung von enumerate() und zip() verschachtelte Tupel erstellt werden.
print(list(enumerate(zip(l1, l2))))
# [(0, ('a', 'x')), (1, ('b', 'y')), (2, ('c', 'z'))]
If you es in der for-Schleife verwenden, can you also enumerate() und zip() verwenden, um jeden Wert wie folgt zu extrahieren.
names = ['Alice', 'Bob', 'Charlie']
ages = [24, 50, 18]
for i, (name, age) in enumerate(zip(names, ages)):
print(i, name, age)
# 0 Alice 24
# 1 Bob 50
# 2 Charlie 18
itertools.cycle() erstellt einen Iterator, der die Elemente eines iterierbaren Objekts wie einer Liste endlos durchläuft.
l = [1, 10, 100]
sum_value = 0
for i in itertools.cycle(l):
print(i)
sum_value += i
if sum_value > 300:
break
# 1
# 10
# 100
# 1
# 10
# 100
# 1
# 10
# 100
Beispiel für die Angabe von range():
sum_value = 0
for i in itertools.cycle(range(3)):
print(i)
sum_value += i
if sum_value > 5:
break
# 0
# 1
# 2
# 0
# 1
# 2
Beispiel für die Kombination mit zip():
l1 = [1, 10, 100]
l2 = [0, 1, 2, 3, 4, 5, 6]
print(list(zip(itertools.cycle(l1), l2)))
# [(1, 0), (10, 1), (100, 2), (1, 3), (10, 4), (100, 5), (1, 6)]
itertools.cycle() speichert eine Kopie des ursprünglichen iterierbaren Objekts. Sie, dass bei Einer großen Note des ursprünglichen iterierbaren Objekts viel Arbeitsspeicher verwendet werden kann.
Beachten Sie, dass dieses Mitglied des Toolkits möglicherweise erheblichen zusätzlichen Speicherplatz benötigt (abhängig von der Länge des Iterable).
itertools.cycle() – Funktionen, die Iteratoren für effizientes Schleifen erstellen – Dokumentation zu Python 3.9.7
itertools.repeat() erstellt einen Iterator, der den unendlichen Wert zurückgibt.
sum_value = 0
for i in itertools.repeat(10):
print(i)
sum_value += i
if sum_value > 40:
break
# 10
# 10
# 10
# 10
# 10
Die Anzahl der Iterationen kann mit dem zweiten Argument mal angegeben werden.
for i in itertools.repeat(10, 3):
print(i)
# 10
# 10
# 10
Das erste Argument kann ein beliebiges Objekt sein. Es ist auch möglich, ein Funktionsobjekt zu wiederholen. Im following Beispiel WIRD sterben eingebaute Funktion len() wiederholt.
for l in itertools.repeat([0, 1, 2], 3):
print(l)
# [0, 1, 2]
# [0, 1, 2]
# [0, 1, 2]
for func in itertools.repeat(len, 3):
print(func('abc'))
# 3
# 3
# 3
Beispiel für die Kombination mit zip() ist wie folgt. Sie können konstante Elemente hinzufügen.
l = [0, 1, 2, 3]
print(list(zip(itertools.repeat(10), l)))
# [(10, 0), (10, 1), (10, 2), (10, 3)]