Was sind "Iterable", "Iterator" und "Iteration" in Python? Wie sind sie definiert?
Antworten
Zu viele Anzeigen?iterable = [1, 2]
iterator = iter(iterable)
print(iterator.__next__())
print(iterator.__next__())
also,
-
iterable
ist ein Objekt die sein können umgeschwungen . z.B. Liste, String, Tupel usw. -
unter Verwendung der
iter
Funktion auf unsereriterable
Objekt gibt ein Iterator-Objekt. -
nun dies Iterator-Objekt hat eine Methode namens
__next__
(in Python 3, oder einfachnext
in Python 2), mit dem Sie auf jedes Element von iterable zugreifen.
also, WIRD DIE AUSGABE DES OBIGEN CODES SEIN:
1
2
Hier ist eine andere Ansicht mit collections.abc
. Diese Ansicht kann beim zweiten Mal oder später nützlich sein.
Von collections.abc
können wir die folgende Hierarchie erkennen:
builtins.object
Iterable
Iterator
Generator
d.h. Generator ist abgeleitet von Iterator ist abgeleitet von Iterable ist abgeleitet von dem Basisobjekt.
Folglich,
- Jeder Iterator ist ein Iterable, aber nicht jedes Iterable ist ein Iterator. Zum Beispiel,
[1, 2, 3]
yrange(10)
sind Iterables, aber keine Iteratoren.x = iter([1, 2, 3])
ist ein Iterator y eine Iterable. - Eine ähnliche Beziehung besteht zwischen Iterator und Generator.
- Aufruf von
iter()
auf einen Iterator oder einen Generator gibt sich selbst zurück. Wenn alsoit
ein Iterator ist, danniter(it) is it
ist wahr. - Unter der Haube versteht sich eine Liste wie
[2 * x for x in nums]
oder eine for-Schleife wiefor x in nums:
handelt, als obiter()
wird auf der Iterablen aufgerufen (nums
) und iteriert dann übernums
unter Verwendung dieses Iterators. Daher sind alle der folgenden Funktionen äquivalent (z. B. mit,nums=[1, 2, 3]
):for x in nums:
for x in iter(nums):
for x in iter(iter(nums))
:for x in iter(iter(iter(iter(iter(nums))))):
Bevor wir uns mit den Iterablen und Iteratoren befassen, ist der wichtigste Faktor, der über die Iterable und den Iterator entscheidet, die Sequenz
Sequenz: Sequenz ist die Sammlung von Daten
Iterierbar: Iterable sind Objekte vom Typ Sequenz, die Folgendes unterstützen __iter__
método.
Iter-Methode: Die Iter-Methode nimmt eine Sequenz als Eingabe und erstellt ein Objekt, das als Iterator bezeichnet wird.
Iterator: Iterator sind die Objekte, die die nächste Methode aufrufen und die Sequenz durchlaufen. Beim Aufruf der next-Methode wird das Objekt zurückgegeben, das gerade durchlaufen wurde.
Beispiel:
x=[1,2,3,4]
x ist eine Sequenz, die aus einer Sammlung von Daten besteht
y=iter(x)
Bei Anruf iter(x)
es gibt einen Iterator nur zurück, wenn das x-Objekt iter-Methode hat sonst es eine exception.if es gibt Iterator dann y ist wie diese zuweisen:
y=[1,2,3,4]
Da y ein Iterator ist, unterstützt er next()
método
Beim Aufruf der Methode next werden die einzelnen Elemente der Liste nacheinander zurückgegeben.
Wenn wir nach der Rückgabe des letzten Elements der Sequenz erneut die nächste Methode aufrufen, wird ein StopIteration-Fehler ausgelöst
Beispiel:
>>> y.next()
1
>>> y.next()
2
>>> y.next()
3
>>> y.next()
4
>>> y.next()
StopIteration
- Eine iterierbar ist ein Objekt, das eine iter ()-Methode, die einen Iterator zurückgibt. Es ist etwas, das in einer Schleife durchlaufen werden kann. Beispiel: Eine Liste ist iterierbar, weil wir in einer Schleife über eine Liste laufen können, aber sie ist kein Iterator.
- Eine Iterator ist ein Objekt, von dem Sie einen Iterator erhalten können. Es ist ein Objekt mit einem Zustand, so dass es sich während der Iteration erinnert, wo es sich befindet
Um zu sehen, ob das Objekt diese Methode hat iter () können wir die folgende Funktion verwenden.
ls = ['hello','bye']
print(dir(ls))
Ausgabe
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
Wie Sie sehen können, hat die iter () bedeutet, dass es sich um ein iterierbares Objekt handelt, das aber nicht die nächste ()-Methode, die ein Merkmal der Iterator objeto
Wann immer Sie in Python eine for-Schleife, eine Map oder eine Listenauflösung verwenden, wird die nächste Methode wird automatisch aufgerufen, um jedes Element aus der Iteration zu erhalten
Andere Leute haben bereits ausführlich erklärt, was die iterierbar y Iterator Ich werde also versuchen, das Gleiche zu tun mit Stromerzeuger .
IMHO ist das Hauptproblem für das Verständnis von Generatoren die verwirrende Verwendung des Wortes "Generator", denn dieses Wort wird verwendet in 2 verschiedene Bedeutungen:
- als Werkzeug zum Erstellen (Generieren) Iteratoren,
- in Form eines Funktion, die einen Iterator zurückgibt (d.h. mit dem
yield
Anweisung(en) in seinem Körper), - in Form eines Generatorausdruck
- in Form eines Funktion, die einen Iterator zurückgibt (d.h. mit dem
- als Ergebnis der Verwendung dieses Werkzeugs, d. h. der resultierende Iterator.
(In dieser Bedeutung ist ein Generator ist eine besondere Form eines Iterator - das Wort "Generator" weist darauf hin wie dieser Iterator erstellt wurde. )
Generator als Werkzeug der 1 st Typ:
In[2]: def my_generator():
...: yield 100
...: yield 200
In[3]: my_generator
Out[3]: <function __main__.my_generator()>
In[4]: type(my_generator)
Out[4]: function
Generator als Ergebnis (d.h. ein Iterator ) der Verwendung dieses Instruments:
In[5]: my_iterator = my_generator()
In[6]: my_iterator
Out[6]: <generator object my_generator at 0x00000000053EAE48>
In[7]: type(my_iterator)
Out[7]: generator
Generator als Werkzeug der 2 und Typ - ununterscheidbar von der resultierender Iterator dieses Werkzeugs:
In[8]: my_gen_expression = (2 * i for i in (10, 20))
In[9]: my_gen_expression
Out[9]: <generator object <genexpr> at 0x000000000542C048>
In[10]: type(my_gen_expression)
Out[10]: generator