Kursleiter: Hallo, und willkommen zurück.
In diesem Video geht es
um Generatorenklassen und Iteratoren.
Hier zeige ich Ihnen eine Klasse, die den 100-Nummern-Generator
implementiert, den wir im letzten Video verwendet haben.
Ich werde es also FirstHundredGenerator nennen.
So, und dann werden wir eine init-Methode definieren.
Die Zahl wird einfach mit Null beginnen, und dann
werden wir eine nächste Unterstrich, Unterstrich,
nächste Methode definieren.
Wenn Sie eine next-Methode in einer Klasse definieren,
können Sie jedes beliebige Objekt next of my object aufrufen, etwa so.
Es handelt sich also wieder um eine Dunder-Methode, die
es Ihnen ermöglicht, den nächsten Schritt aufzurufen.
Es sagt Python auch etwas sehr Wichtiges.
Wir werden uns das gleich ansehen.
Wenn wir also 100 Zahlen generieren wollen, müssen
wir uns nur noch selbst holen. Nummer, gibt sie zurück
und erhöht sie um eins.
Also, wenn self. Zahl kleiner als 100 ist, werden
wir das Schlüsselwort yield hier übrigens nicht
verwenden, weil man das in einem Klassengenerator nicht braucht.
Tut mir leid, in einem von diesen Dingern. (lacht) Ich werde einfach
nichts sagen, was möglicherweise als falsch
verstanden werden könnte.
Nur, damit ich Sie nicht verwirre.
Wenn die Zahl kleiner als 100 ist,
setzen wir sie in eine
Variable, erhöhen die Zahl um eins und geben dann die
aktuelle Zahl zurück, die der vorherige
Wert war, also Null.
Wir steigern uns selbst. Zahl um eins, geben wir Null zurück.
Ja.
Wichtig bei der Klasse
ist, dass wir, wenn wir
keine Zahlen mehr
zurückgeben wollen, keine Schleife verwenden,
um bei 100 anzuhalten.
Wenn wir also 100 erreichen, müssen wir einen speziellen
Fehler auslösen, der Stop Iteration genannt wird.
Stop Iteration error teilt Python mit,
dass wir das Ende des Generators erreicht haben.
Ich sage Generator und zucke leicht zusammen, ähm hier.
Denn es handelt sich im Wesentlichen um einen Generator, bei
dem man bei Null anfängt,
dann entscheidet, ob man eine neue Zahl zurückgeben will, diese Zahl
erhält, sie zurückgibt und dann das
Programm beendet.
Aber Ihr Objekt bleibt, und es erinnert sich an sich selbst. Nummer.
Wenn wir also mein Gen haben, und das ist unser erster Hunderter-Generator
dort.
Mein Gen. Nummer ist zu Beginn
natürlich Null.
Richtig?
Das wollen wir Ihnen zeigen.
Mein Gen die Zahl Null am Anfang.
Wenn Sie meine gen. und dann mein Gen
ausdrucken.
Nummer
wieder, erhalten Sie eine.
Das macht doch Sinn, oder?
Denn die nächste Methode hier prüft, ob die Zahl kleiner
als 100 ist, und erhöht
sie dann um eins.
Das alles macht also Sinn.
Damit es sich wie ein Generator
verhält, sagen wir einfach next of my gen,
etwa so.
Dann können wir das Ganze noch einmal durchführen, und es kommt das Gleiche heraus.
Natürlich gibt next of my gen die
Zahl zurück, die es hatte, bevor wir es inkrementiert haben.
Anstatt also meine Gen. Nummer hier, können wir einfach
next of my gen ausdrucken, und hier können wir auch next of
my gen ausdrucken, und wir werden die gleiche
Ausgabe erhalten, Null und Eins.
Wenn wir next zum ersten Mal aufrufen, erhalten wir den aktuellen Wert,
der Null ist, aber wir haben self inkrementiert. Nummer um eins.
Wenn wir das nächste Mal next aufrufen,
erhöhen wir diese Zahl wieder um eins, aber wir geben
den vorherigen Wert zurück, der eins ist.
Dies verhält sich also genau wie ein Generator,
und in der Tat ist dies ein Generator.
Es werden nicht alle Werte bis zu 100 in einer Liste gespeichert.
Er gibt sie dir nacheinander.
Sie werden generiert, wenn Sie die nächste Funktion aufrufen.
Entschuldigung, die nächste Methode.
Übrigens, dunder next ist neu in Python drei.
Wenn Sie also Python zwei
verwenden, müssen Sie next ohne den Unterstrich definieren.
Das gilt nur für Python zwei.
Wenn Sie Python drei verwenden, benutzen Sie als nächstes dunder.
Okay, alle Objekte,
die diese dunder next-Methode haben, werden Iteratoren
genannt.
Alle Generatoren, wie dieser hier, sind Iteratoren,
aber nicht umgekehrt.
Sie können also Iteratoren haben, die keine Zahlen erzeugen.
Wenn Sie zum Beispiel Ihren ersten Zahlengenerator
so modifizieren, dass er einen Teil einer Liste zurückgibt,
wie z.B. den ersten hundert Iterator, nicht den Generator,
können Sie hier eine init-Methode haben, die
self sagt. Die Zahlen lauten: eins,
zwei, drei, vier, fünf.
Offensichtlich ist es nicht, nicht
erste hundert, das ist erste fünf Iterator, selbst I ist Null.
Das ist also der Index, den Sie jetzt zurückgeben werden.
Null, und die Zahlen, die wir zurückgeben,
sind von eins bis fünf.
Bei der nächsten Methode wird einfach gesagt, dass I weniger als
Len von sich selbst ist. Zahlen, return
self. Zahlen I.
Richtig?
Andernfalls wird die Iteration gestoppt.
Tut mir leid, das kann man nicht so gut sehen, aber
so ist es eben.
Alles, was wir hier tun, ist also, dass wir nichts erzeugen.
Wir sagen, wenn I kleiner ist als,
übrigens müssen wir, natürlich müssen wir das tun, I plus
gleich eins, und geben
Strom zurück.
Wir müssen um eins erhöhen, und wir müssen
natürlich auch I um eins erhöhen.
Nochmals, wir generieren keine neuen Zahlen.
Wir verfolgen den I, den Index, bei dem wir gerade sind,
das muss man irgendwie machen, damit, das sollte
selbst sein. Ich übrigens auch.
Sie sehen, dass ich dieses Beispiel nicht wirklich vorbereitet habe, aber
ich wollte Ihnen nur schnell zeigen,
dass nicht alle Generatoren, nicht alle Iteratoren, Generatoren
sein müssen.
In diesem Fall generieren Sie die Zahlen nicht,
sondern geben sie aus einer Liste zurück.
Das ist nur ein kurzes Beispiel.
Sie werden dies im Beispielcode für den Abschnitt haben, wenn
ich daran denken kann, es hinzuzufügen.
Wenn wir also die nächste Methode definieren, definieren wir einen Iterator,
mit dem man eine Funktion
nach der anderen durchgehen kann, indem man die
nächste Funktion aufruft.
Es muss nicht notwendigerweise alle Zahlen selbst generieren, aber
es kann sie auch aus einer Liste, aus einer gesendeten Datei oder
von einem anderen Ort zurückgeben.
In Python ist das also wichtig.
Iteratoren sind die Objekte, die eine
dunder next-Methode haben.
Sie können sie als nächstes anrufen.
Wir haben selbst einen Iterator,
aber wir können
nicht für I in my gen, in my gen.
Das können Sie nicht tun.
Das kann ich Ihnen gleich sagen.
Wenn wir dies ausführen, erhalten Sie eine Fehlermeldung, die besagt, dass
das erste 100-Generator-Objekt nicht iterierbar ist,
aber ich habe gerade gesagt, dass es ein Iterator ist, und es ist ein Iterator.
Ein Iterator bedeutet, dass Sie die
nächste Funktion aufrufen können,
die Ihnen den nächsten Wert liefert.
Aber ein Iterator und eine Iterable sind unterschiedliche Dinge.
Sie können über eine Iterable iterieren, und
der Iterator wird verwendet, um den nächsten Wert aus einer Sequenz
oder aus generierten Werten zu erhalten.
Wir haben es hier also mit einem Iterator zu
tun, nicht mit einer Iterable.
Im nächsten Video werden wir lernen,
wie man eine Iterable erstellt,
so dass wir darüber eine Schleife
ziehen können, oder Dinge tun können wie die Summe meiner
Gene, oder was auch immer man tun möchte.
Liste meiner gen.
Diese Dinge hier benötigen eine Iterable und keinen Iterator.
Das machen wir gleich im nächsten Video.
Wir sehen uns dort.