569 Stimmen

Was sind Iterator, Iterable und Iteration?

Was sind "Iterable", "Iterator" und "Iteration" in Python? Wie sind sie definiert?

3voto

arpan kumar Punkte 31
iterable = [1, 2] 

iterator = iter(iterable)

print(iterator.__next__())   

print(iterator.__next__())   

also,

  1. iterable ist ein Objekt die sein können umgeschwungen . z.B. Liste, String, Tupel usw.

  2. unter Verwendung der iter Funktion auf unserer iterable Objekt gibt ein Iterator-Objekt.

  3. nun dies Iterator-Objekt hat eine Methode namens __next__ (in Python 3, oder einfach next in Python 2), mit dem Sie auf jedes Element von iterable zugreifen.

also, WIRD DIE AUSGABE DES OBIGEN CODES SEIN:

1

2

3voto

user650654 Punkte 4800

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] y range(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 also it ein Iterator ist, dann iter(it) is it ist wahr.
  • Unter der Haube versteht sich eine Liste wie [2 * x for x in nums] oder eine for-Schleife wie for x in nums: handelt, als ob iter() wird auf der Iterablen aufgerufen ( nums ) und iteriert dann über nums 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))))):

2voto

Shadow Punkte 21

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

2voto

Ileana Vasquez Punkte 43
  • 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

0voto

MarianD Punkte 11029

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:

  1. 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
  2. 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X