Maison > Article > développement back-end > Exemples détaillés d'itérateurs et de générateurs en Python
Définition
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
Il ressort de la définition que Iterable
doit contenir le __iter__
fonction
définition
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
On peut voir à partir de la définition que Iterator
contient le __next__
et __iter__
fonctions. Lorsque le prochain est hors de portée, il lancera StopIteration
événement
relation de type
#! /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
Théoriquement, vous pouvez utiliser next()
pour exécuter __next__()
jusqu'à ce que l'itérateur lance StopIteration
En fait, le système fournit un for .. in ..
moyen d'analyser les itérateurs
l = [1,2,3,4] for i in l: print(i) # 执行结果 # 1 # 2 # 3 # 4
L'essence d'un générateur est un itérateur S'il y a
#! /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 # 8dans la fonction
yield
, la fonction est un objet générateur Chaque fois que la fonction next
est exécutée, la fonction. commencera l'exécution au yield
précédent, et les retours (équivalent à yield
) au return
suivant >
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!