Verstehe irgendwie, wie der folgende Code funktioniert
for i in range(5):
print(i)
# 0
# 1
# 2
# 3
# 4
Python für Anweisungen funktioniert für Iteratoren.
Ich glaube nicht, dass es zu dir kommen wird, selbst wenn du das sagst. Also werde ich erklären, warum Sie ein solches Konzept brauchen.
Betrachten Sie das folgende Beispiel als Aussage.
l = ['Alpha', 'Beta', 'Charlie']
for name in l:
print(name)
Jeder, der Python gelernt hat, weiß, was dies ausgeben wird?
Alpha
Beta
Charlie
Ja, es wird aus dem Array entfernt und der Name angezeigt. Wenn Sie dies mit while umschreiben, können Sie es so umschreiben.
l = ['Alpha', 'Beta', 'Charlie']
i = 0
while True:
if i == len(l):
break
print(l[i])
i += 1
Die Ausgabe ist die gleiche. Ist die Python for-Anweisung eine Funktion, mit der solche Operationen auf verschiedenen Arrays einfach ausgeführt werden können? Betrachten Sie das folgende Beispiel. Diesmal ist dies ein Beispiel für die Verwendung des Set-Typs anstelle des Arrays. set ist ein Objekt, das eine Menge darstellt, und selbst wenn Sie dieselbe Nummer eingeben, wird es als eine gespeichert.
s = {1, 2, 2, 3, 1, 4}
↓
{1, 2, 3, 4}
Versuche, dieses Objekt wie zuvor zu bearbeiten.
s = {1, 2, 3, 4, 5}
i = 0
while True:
if i == len(s):
break
print(s[i])
i += 1
Wenn ich dieses Programm starte, erhalte ich eine Fehlermeldung und werde wütend.
Traceback (most recent call last):
File "a.py", line 7, in <module>
print(s[i])
TypeError: 'set' object is not subscriptable
Ich wundere mich warum? Dies liegt daran, dass Objekte wie Set- und Dict-Typen nicht wie ein Array in einer horizontalen Reihe angeordnet sind. Es wird durch eine Struktur dargestellt, die als Hash-Tabelle bezeichnet wird.
(Bild aus Wikipedia)
Es gibt auch Datenstrukturen auf der Welt, die durch Bäume dargestellt werden. Dieses Mal ist es leicht zu verstehen. Nehmen wir dies als Beispiel. (Bild aus Wikipedia)
Auf diese Weise ausgedrückte Objekte werden nicht sofort genommen, selbst wenn Sie sie anweisen, "Holen Sie sich das fünfte!" Zu sagen. Sie müssen in der Reihenfolge von den ersten 2 in dieser Abbildung folgen. Daher ist der Zugriff per Index verboten. Stattdessen beantworten sie sofort Anweisungen wie "Suchen Sie nach dem, der hogehoge sagt!". Der Wörterbuchtyp ist ein Objekt, das solche Eigenschaften ausnutzt.
Wie reproduzieren Sie dasselbe Verhalten mit einer while-Anweisung? Das Folgende ist ein Beispiel.
s = {1, 2, 3, 4, 5}
while True:
if s == set():
break
print(s.pop())
Ich werde den detaillierten Algorithmus weglassen, aber Sie können sehen, dass die Operation völlig anders ist als die Liste. Die for-Anweisung kann jedoch auch für diesen Set-Typ verwendet werden.
s = {1, 2, 3, 4, 5}
for num in s:
print(num)
Ich wundere mich warum? Dies ist die Essenz von "Pythons for-Anweisung treibt einen Iterator an". Iteratoren werden in Liste und Menge implementiert. Und die for-Anweisung übergibt das Iteratorobjekt von list und set. Selbst wenn Sie wie folgt schreiben, funktioniert dies auf die gleiche Weise.
s = {1, 2, 3, 4, 5}
a = iter(s)
for num in a:
print(num)
Und \ _ \ _next \ _ \ _ () ist immer im Iteratorobjekt implementiert und gibt den Wert der Position neben dem aktuellen Iterator zurück.
Dies ergibt also immer noch die gleiche Ausgabe
s = {1, 2, 3, 4, 5}
a = iter(s)
print(next(a)) # __next__Anruf von außen
print(next(a))
print(next(a))
print(next(a))
print(next(a))
Dies ist unten dargestellt.
Ich denke, Sie haben irgendwie die Bequemlichkeit des Iterators gefunden. Der Iterator muss nur die folgenden Werte annehmen, damit Sie nicht alle Daten behalten müssen.Schauen Sie sich den folgenden Code an. Dies ist der Code, den ich zu diesem Zweck geschrieben habe
for i in range(5):
print(i)
# 0
# 1
# 2
# 3
# 4
Sie können sich diesen Code auch wie folgt vorstellen:
a = [0, 1, 2, 3, 4]
for i in a:
print(i)
# 0
# 1
# 2
# 3
# 4
Was wäre, wenn dies 10000 statt 5 wäre? Was wäre, wenn es 1000000 wäre? Wird eine Liste von 0 bis 999999 erstellt? falsch. Sie müssen nur eine Zahl vorbereiten und erhöhen.
2020-06-19 Der Quellcode, der next von Anfang an aufrief, wurde korrigiert, wie von shiracamus hervorgehoben. 2020-06-21 https://github.com/zerokpr wies darauf hin, dass der Fehler um die Datenstruktur von Set korrigiert wurde.
Recommended Posts