La colonne
Recommandations d'apprentissage gratuites associées : Tutoriel Python (vidéo)
Le modèle itérateur est un modèle de conception de logiciel classique, et de nombreux langages de programmation intègrent désormais ce modèle de conception. Parmi les types de données primitifs de Python, ceux qui peuvent être utilisés pour les boucles sont des types itérables. Bien entendu, vous pouvez également utiliser la fonction iter pour obtenir l'itérateur correspondant puis parcourir l'objet. Par exemple, le code suivant :
l = [1, 3] # 可迭代对象 __iter__t = iter(l) #获取迭代器对象print(t.__next__()) print(t.__next__())# print(t.__next__()) # 报异常复制代码
Pour implémenter un objet itérable, vous devez d'abord implémenter l'objet itérateur correspondant. Pour implémenter un itérateur en Python, il vous suffit d'implémenter la méthode __next__. Cependant, la classe Iterator du package collections définit la méthode __next__ comme une méthode abstraite. L'auteur estime qu'en raison de la lisibilité du programme, vous souhaiterez peut-être hériter de la classe Iterator lors de l'implémentation d'un itérateur.
from random import samplefrom collections import Iterable, Iteratorclass WeatherIterator(Iterator): def __init__(self, cities): self.cities = cities self.index = 0 def getWeather(self, city): return (city, sample(['sun','wind','yu'], 1)[0]) def __next__(self): if self.index == len(self.cities): raise StopIteration city = self.cities[self.index] self.index += 1 return self.getWeather(city)复制代码
Pour implémenter un objet itérable, il vous suffit d'implémenter la méthode __iter__ De même, la classe Iterable du package collections définit également la méthode __iter__ comme une classe abstraite.
from collections import Iterableclass WeatherIterable(Iterable): def __init__(self, cities): self.cities = cities self.index = 0 def __iter__(self): return WeatherIterator(self.cities)复制代码
De cette façon, vous pouvez utiliser une boucle for pour itérer.
for weather in WeatherIterable(['北京', '上海', '广州']): print(weather)复制代码
Regardez d'abord le code suivant :
def gen(): print("step 1") yield 1 print("step 2") yield 2 print("step 3") yield 3复制代码
La valeur de retour de la fonction gen ci-dessus est un objet générateur.
g = gen() g.__next__() print(g.__next__()) print(g.__next__())复制代码
Comme le montre le code ci-dessus, chaque fois que la méthode __next__ du générateur est appelée, elle exécutera une fonction gen jusqu'à ce qu'elle rencontre le mot-clé rendement et renverra ce qui suit. Un générateur peut donc être compris comme une fonction qui peut être interrompue.
Remarque : les objets générateurs sont également des objets itérables.
for x in g: print(x)复制代码
En implémentant la méthode __iter__ en tant que fonction génératrice, vous pouvez implémenter des objets itérables.
class PrimeNumbers: def __init__(self, start, end): self.start = start self.end = end def isPrimeNum(self, k): #判断是否是素数 if k < 2: return False for i in range(2, k): if k % i == 0: return False return True def __iter__(self): for k in range(self.start, self.end + 1): if self.isPrimeNum(k): yield kfor num in PrimeNumbers(2, 100): print(num)复制代码
La fonction iter peut obtenir l'itérateur avant de l'objet itérable, et la fonction inversée peut obtenir l'itérateur inverse de l'objet itérable itérateur.
l = [1, 2, 3, 4, 5]for x in reversed(l): print(x)复制代码
Pour implémenter l'itération inverse, implémentez simplement la méthode __reversed__.
class FloatRange: def __init__(self, start, end, step=0.1): self.start = start self.end = end self.step = step def __iter__(self): t = self.start while t <= self.end: yield t t += self.step def __reversed__(self): t = self.end while t >= self.start: yield t t -= self.stepfor x in FloatRange(1.0, 4.0, 0.5): print(x)for x in reversed(FloatRange(1.0, 4.0, 0.5)): print(x)复制代码
La fonction islice du package itertools peut effectuer des opérations de découpage sur des objets itérables.
from itertools import islicefor x in islice(FloatRange(1.0, 4.0, 0.5), 2, 5): print(x)复制代码
Utilisez la méthode zip pour former un tuple d'éléments correspondants.
for w, e, m in zip([1, 2, 3, 4], ('a', 'b', 'c','d'), [5, 6, 7, 8]): print(w, e, m)复制代码
Utilisez la fonction chain dans le package itertools pour concaténer plusieurs objets itérables. Utilisez la méthode zip pour former un tuple d'éléments correspondants.
from itertools import chainfor x in chain([1, 2, 3, 4], ('a', 'b', 'c','d')): print(x)复制代码
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!