Suche…


Iterator vs Iterable vs Generator

Ein Iterable ist ein Objekt, das einen Iterator zurückgeben kann . Jedes Objekt mit einem Status, das eine __iter__ Methode hat und einen Iterator zurückgibt, ist ein __iter__ . Es kann sich auch um ein Objekt ohne Status handeln, das eine __getitem__ Methode implementiert. - Die Methode kann Indizes annehmen (beginnend bei Null) und einen IndexError wenn die Indizes nicht mehr gültig sind.

Die str Klasse von Python ist ein Beispiel für eine __getitem__ .

Ein Iterator ist ein Objekt, das den nächsten Wert in einer Sequenz erzeugt, wenn Sie next(*object*) für ein Objekt aufrufen. Darüber hinaus ist jedes Objekt mit einer __next__ Methode ein Iterator. Ein Iterator erhöht die StopIteration nachdem der Iterator erschöpft ist, und kann an dieser Stelle nicht erneut verwendet werden.

Iterable Klassen:

Iterable-Klassen definieren eine __iter__ und eine __next__ Methode. Beispiel für eine iterierbare Klasse:

class MyIterable:

    def __iter__(self):

         return self

    def __next__(self):
         #code

#Classic iterable object in older versions of python, __getitem__ is still supported...
class MySequence:

    def __getitem__(self, index):

         if (condition):
             raise IndexError
         return (item)

 #Can produce a plain `iterator` instance by using iter(MySequence())

Der Versuch, die abstrakte Klasse aus dem collections Modul zu instanziieren, um dies besser zu verstehen.

Beispiel:

Python 2.x 2.3
import collections
>>> collections.Iterator()
>>> TypeError: Cant instantiate abstract class Iterator with abstract methods next
Python 3.x 3.0
>>> TypeError: Cant instantiate abstract class Iterator with abstract methods __next__

Behandeln Sie die Python 3-Kompatibilität für iterierbare Klassen in Python 2, indem Sie folgende Schritte ausführen:

Python 2.x 2.3
class MyIterable(object): #or collections.Iterator, which I'd recommend....

     ....

     def __iter__(self): 

          return self

     def next(self): #code

     __next__ = next

Beide sind jetzt Iteratoren und können durchgeschleift werden:

ex1 = MyIterableClass()
ex2 = MySequence()

for (item) in (ex1): #code
for (item) in (ex2): #code

Generatoren sind einfache Möglichkeiten, Iteratoren zu erstellen. Ein Generator ist ein Iterator und ein Iterator ist ein Iterator.

Was kann iterierbar sein

Iterable kann alles sein, für das Elemente einzeln empfangen werden, nur weiterleiten . Eingebaute Python-Sammlungen sind wiederholbar:

[1, 2, 3]     # list, iterate over items
(1, 2, 3)     # tuple
{1, 2, 3}     # set
{1: 2, 3: 4}  # dict, iterate over keys

Generatoren geben iterables zurück:

def foo():  # foo isn't iterable yet...
    yield 1

res = foo()  # ...but res already is

Iteration über ganze iterable

s = {1, 2, 3}

# get every element in s
for a in s:
    print a  # prints 1, then 2, then 3

# copy into list
l1 = list(s)  # l1 = [1, 2, 3]

# use list comprehension
l2 = [a * 2 for a in s if a > 2]  # l2 = [6]

Überprüfen Sie nur ein Element in iterable

Verwenden Sie das Auspacken, um das erste Element zu extrahieren und sicherzustellen, dass es das einzige ist:

a, = iterable

def foo():
    yield 1

a, = foo()  # a = 1

nums = [1, 2, 3]
a, = nums  # ValueError: too many values to unpack

Extrahieren Sie die Werte einzeln

Beginnen Sie mit iter() , um den Iterator für iterable zu verwenden, und verwenden Sie next() , um Elemente nacheinander StopIteration bis StopIteration wird, um das Ende StopIteration :

s = {1, 2}   # or list or generator or even iterator
i = iter(s)  # get iterator
a = next(i)  # a = 1
b = next(i)  # b = 2
c = next(i)  # raises StopIteration

Iterator ist nicht wiedereintrittsfähig!

def gen():
    yield 1

iterable = gen()
for a in iterable:
    print a

# What was the first item of iterable? No way to get it now.
# Only to get a new iterator
gen()


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow