Definition
class Iterable(metaclass=ABCMeta): __slots__ = () @abstractmethod def __iter__(self): while False: yield None @classmethod def __subclasshook__(cls, C): if cls is Iterable: if any("__iter__" in B.__dict__ for B in C.__mro__): return True return NotImplemented
Aus der Definition geht hervor, dass Iterable
das enthalten muss __iter__
Funktion
Definition
class Iterator(Iterable): __slots__ = () @abstractmethod def __next__(self): 'Return the next item from the iterator. When exhausted, raise StopIteration' raise StopIteration def __iter__(self): return self @classmethod def __subclasshook__(cls, C): if cls is Iterator: if (any("__next__" in B.__dict__ for B in C.__mro__) and any("__iter__" in B.__dict__ for B in C.__mro__)): return True return NotImplemented
Aus der Definition ist ersichtlich, dass Iterator
die __next__
und enthält __iter__
Funktionen. Wenn next außerhalb des Gültigkeitsbereichs liegt, wird eine Beziehung vom Typ StopIteration
ausgelöst
#! /usr/bin/python #-*-coding:utf-8-*- from collections import Iterator,Iterable # 迭代器 s = 'abc' l = [1,2,3] d=iter(l) print(isinstance(s,Iterable)) # True print(isinstance(l,Iterable)) # True print(isinstance(s,Iterator)) # False print(isinstance(l,Iterator)) # False print(isinstance(d,Iterable)) # True print(isinstance(d,Iterator)) # True
dazu verwenden Führen Sie next()
aus, bis der Iterator __next__()
StopIteration
auslöst. Tatsächlich bietet das System eine Möglichkeit, Iteratoren zu analysierenfor .. in ..
l = [1,2,3,4] for i in l: print(i) # 执行结果 # 1 # 2 # 3 # 4
#! /usr/bin/python #-*-coding:utf-8-*- from collections import Iterator,Iterable s = (x*2 for x in range(5)) print(s) print('Is Iterable:' + str(isinstance(s,Iterable))) print('Is Iterator:' + str(isinstance(s,Iterator))) for x in s: print(x) # 执行结果 # <generator object <genexpr> at 0x000001E61C11F048> # Is Iterable:True # Is Iterator:True # 0 # 2 # 4 # 6 # 8
yield
vorhanden ist, ist die Funktion ein Generatorobjekt. Jedes Mal, wenn die Funktion ausgeführt wird startet die Ausführung beim vorherigen next
und kehrt (entspricht yield
) beim nächsten yield
>return
zurück
Das obige ist der detaillierte Inhalt vonDetaillierte Beispiele für Iteratoren und Generatoren in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!