Maison > développement back-end > Tutoriel Python > Écrit pour le master de programmation Python 2 : itérateurs

Écrit pour le master de programmation Python 2 : itérateurs

coldplay.xixi
Libérer: 2020-11-04 17:19:11
avant
2113 Les gens l'ont consulté

La colonne

Tutoriel Python présente les itérateurs utilisés en programmation.

Écrit pour le master de programmation Python 2 : itérateurs

Recommandations d'apprentissage gratuites associées : Tutoriel Python (vidéo)

Comment implémenter des objets itérables et des itérations Objet itérateur

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__()) # 报异常复制代码
Copier après la connexion

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)复制代码
Copier après la connexion

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)复制代码
Copier après la connexion

De cette façon, vous pouvez utiliser une boucle for pour itérer.

for weather in WeatherIterable(['北京', '上海', '广州']):
    print(weather)复制代码
Copier après la connexion

Introduction aux générateurs

Regardez d'abord le code suivant :

def gen():
    print("step 1")    yield 1
    print("step 2")    yield 2
    print("step 3")    yield 3复制代码
Copier après la connexion

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__())复制代码
Copier après la connexion

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)复制代码
Copier après la connexion

Comment utiliser les fonctions génératrices pour implémenter des objets itérables

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)复制代码
Copier après la connexion

Comment effectuer une itération inverse et comment implémenter une itération inverse

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)复制代码
Copier après la connexion

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)复制代码
Copier après la connexion

Comment effectuer des opérations de découpage sur les itérateurs

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)复制代码
Copier après la connexion

Comment itérer plusieurs objets itérables dans une instruction for

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)复制代码
Copier après la connexion

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)复制代码
Copier après la connexion

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!

Étiquettes associées:
source:juejin.im
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal