Python Language
Iterables und Iteratoren
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:
import collections
>>> collections.Iterator()
>>> TypeError: Cant instantiate abstract class Iterator with abstract methods next
>>> 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:
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()