Jose: Hallo und willkommen zurück.
In diesem Video geht es um Iterables in Python.
Im letzten Video haben wir uns Iteratoren
angesehen. Was zum Teufel ist ein Iterable?
Nun, eine Iterable ist ein Objekt,
das eine __iter__()-Methode oder eine __iter__()-Methode hat.
Also etwas, das wie folgt aussieht.
Sobald Sie diese Methode in einem beliebigen Objekt definieren,
handelt es sich um ein iterables Objekt.
Lassen Sie uns hier also etwas definieren.
Definieren wir ein FirstHundredIterable.
Diese FirstHundredIterable wird einfach
diese __iter__() oder __iter()-Methode definieren, und diese __iter__()-Methode
sagt Python, dass Sie in der Lage sein wollen, über diese Iterable zu
iterieren, wie in einer for-Schleife, oder Sie wollen etwas
davon tun, oder Sie wollen es in eine Liste
verwandeln.
Was muss sie zurückgeben?
Sie muss einen Iterator zurückgeben.
Geben Sie also FirstHundredGenerator() zurück.
Jetzt können Sie etwas tun, wie die
Summe von FirstHundredIterable zu drucken,
und es wird wie es, und es wird Ihnen 4950 sagen.
Sie können auch mit einer for-Schleife
darüber iterieren und es wird gut sein.
Dort werden Ihnen auch alle Zahlen angezeigt.
Das ist es also, was eine Iterable ausmacht.
Es muss nichts Magisches sein, es muss nichts Ausgefallenes sein.
In Python müssen Sie nur diese Methode definieren,
um eine Iterable zu werden, und diese Methode muss etwas zurückgeben,
auf das Sie __next__() anwenden
können.
Sie muss einen Iterator zurückgeben.
Alle Generatoren sind Iteratoren,
also kann dies natürlich auch ein Generator sein.
Nun, wenn Sie dies ein bisschen einfacher machen wollen, was
Sie tun können, anstatt
eine separate Klasse zu haben, die den FirstHundredIterator
zurückgibt, können Sie sich fragen ...
Es gibt hier eine __iter__()-Methode,
die ein Objekt dieses Typs zurückgibt.
Was bedeutet FirstHundredGenerator() im
Zusammenhang mit dieser Klasse?
Das ist eine ziemlich vage Frage, aber ich würde sagen, es ist selbst.
Self ist immer das aktuelle Objekt, und
was Sie hier tun, ist, dass Sie ein Objekt zurückgeben,
also können Sie dies sicherlich
tun.
Jetzt brauchen Sie dieses FirstHundredIterable nicht mehr,
und Sie können hier einfach FirstHundredGenerator() zurückgeben, und es
wird so bleiben, wie es jetzt ist.
Jetzt ist Ihr Generator etwas verwirrender, weil
er sowohl ein Iterator als auch eine Iterable ist, und das kann in manchen
Fällen verwirrend sein, aber in anderen Fällen
kann es wirklich praktisch sein,
weil es viel kürzer ist, als eine separate Klasse zu
haben, die das für Sie erledigt.
Auch hier gibt die Iterable mit der Methode __iter__()
einen Iterator zurück.
Man kann das also auch vom Iterator
selbst aus tun, da self immer ein Iterator ist, weil
self das Objekt ist, das diese dunder __next__() Methode hat.
Ich habe schon viel früher im Kurs
etwas über for-Schleifen erwähnt und dass wir ein Objekt
brauchen, das dunder __len__() und dunder __getitem__() definiert hat.
Was hat es damit auf sich?
Definieren wir eine weitere
iterable, und sie wird eine __len__(),
len(self. Autos), und ich werde hier oben die Autos initialisieren.
Nehmen wir also an, wir haben ein Selbst. cars gleich dieser
Zwei-Elemente-Liste ist, dann definieren wir eine dunder __len__()-Methode,
die die Länge der Liste zurückgibt, und wir definieren
auch eine __getitem__()-Methode, die den Index aufnimmt, den wir abrufen
wollen, und nur self zurückgibt.
Autos[i].
Früher im Kurs haben wir uns das angeschaut und ich habe gesagt, dass man,
wenn man ein Objekt hat, das so aussieht
und die __len__() und die __getitem__() Methode hat, eine for-Schleife
darauf anwenden kann.
Und in der Tat, wenn wir für Auto in AnotherIterable() tun, werden
Sie sehen, dass dies die Autos ausgibt, Fiesta und Focus.
Ist dies also auch eine Iterable?
Es hat keine __iter__() Methode.
Es wird kein Generator zurückgegeben.
Und die Antwort lautet: Ja.
In Python können Sie Ihre Iterablen entweder mit einer __iter__()-Methode
definieren, die eine Iterable zurückgibt, oder Sie
können ein Objekt haben, das eine Länge und ein getitem hat.
Beides sind Iterablen und man kann for-Schleifen verwenden, man kann __sum__()
verwenden, man kann __len__() in ihnen verwenden ...
Sorry, nicht __len__(), Sie können __list__() in ihnen verwenden.
Beides sind also Iterabilien.
Jetzt, okay?
Und jetzt haben wir ein wenig über Iterables
gelernt, wie sie sich von Iteratoren unterscheiden,
aber sie sind normalerweise zusammen, Hand in Hand.
Ein Iterator wird verwendet, um den nächsten Wert zu erhalten, und eine
Iterable wird verwendet, um über alle Werte eines
Iterators zu gehen.
Mit einem Iterator kann man also Schritt für Schritt
vorgehen, falls man das tun möchte, indem man __next__()
aufruft, und mit der Iterable kann man alle Elemente durchgehen.
Das war's also mit diesem Video.
Wenn das nicht viel Sinn macht und Sie
sich fragen: "Wozu zum Teufel brauche ich das? Machen Sie sich keine
Sorgen.
In ein paar Abschnitten werden
Sie sagen: "Oh mein Gott, das macht so viel Sinn",
wenn wir über asynchrones Python lernen.
Ich gebe Ihnen hier nur ein paar Hinweise.
Und wenn Sie eine etwas längere Liste verwenden oder
durchgehen wollen, können Sie dazu Generatoren verwenden.
Lassen Sie mich auch sagen, jetzt, wo wir
hier sind, dass anstelle von my_numbers = [x for
x in [1, 2, 3, 4, 5]] zum Beispiel,
dies ist eine Liste Verständnis.
my_numbers_gen() können Sie ein Generatorverständnis durchführen.
Diese Instanz ist nicht sehr nützlich, aber sie
ist jetzt auch ein Generatorobjekt.
Das ist nur eine Abkürzung für die Iteration über eine Sequenz.
Sie können next(my_numbers_gen) ausführen.
Sie können es ausdrucken.
So Generator Verständnis, eine ziemlich beliebte
Sache zu tun, wie gut, noch ist die eine gedruckt da draußen.
Ich wollte das nur erwähnen.
Dies ist nicht das Tupel-Verständnis;
dies ist ein Generator-Verständnis.
Und wir können es benutzen, um ein Generator-Objekt on the fly zu
erstellen, wir können __next__() auch in dieser Syntax aufrufen.
Auch hier ist alles, was es tut, über diese Liste
zu gehen und jede Zahl zu liefern, wenn Sie __next__() aufrufen.
Es wird also nicht die gesamte Liste kopiert, was hier der Fall ist.
Dadurch wird die Liste kopiert und Sie erhalten eine weitere Kopie.
So können Sie sie einzeln durchgehen,
ohne die gesamte Liste zu kopieren.
Natürlich ist dieses Beispiel nicht sehr gut.
Sie könnten einfach über diese
Liste iterieren, da Sie sie bereits haben, aber
es kann in anderen Fällen nützlich sein, z.
B. wenn Sie über einen anderen Generator iterieren
und einige Änderungen daran vornehmen wollen.
Sie kann also in manchen Fällen nützlich sein.
Wir werden später noch weitere Beispiele dafür finden.
Ich wollte Ihnen nur einen kleinen Einblick in die Syntax geben.
Das war's dann aber auch schon mit diesem Video.
Ich will dich nicht länger aufhalten.
Wir sehen uns beim nächsten Mal.