Exemple complet d'itérateurs et de générateurs

Parce que les itérateurs et les générateurs sont fondamentalement interopérables, certains points de connaissances doivent être intégrés ensemble

1 Itération inverse

L'itération inverse devrait également être une exigence courante, comme l'exemple d'itération depuis le début Ici, il y a un élément de liste de sortie,

list1 = [1,2,3,4,5]
for num1 in list1 :
    print ( num1 , end = ' ' )

de 1 à 5. Alors que fait-on de 5 à 1 ? C'est également très simple. Il existe une fonction intégrée reverse() dans Python

list1 = [1,2,3,4,5]
for num1 in reversed(list1) :
    print ( num1 , end = ' ' )

L'itération directionnelle est très simple, mais une chose à noter est que l'itération inverse ne se produit que lorsque la taille de l'objet peut être prédéterminée ou que l'objet peut être prédéterminé. implémente la méthode spéciale de __reversed__() pour prendre effet. Si les deux ne sont pas remplis, vous devez d'abord convertir l'objet en liste. En fait, nous pouvons souvent implémenter une itération inverse en implémentant la méthode __reversed__() sur une classe personnalisée. Cependant, certains points de connaissances n'ont pas été mentionnés dans les chapitres précédents, mais vous pouvez les lire en conséquence. Ceux qui possèdent des bases en programmation devraient être capables de les comprendre après avoir appris les points de connaissances ci-dessus.

# -*- coding: UTF-8 -*-
class Countdown:
    def __init__(self, start):
        self.start = start
    def __iter__(self):
    # Forward iterator
        n = self.start
        while n > 0:
            yield n
            n -= 1
    def __reversed__(self):
    # Reverse iterator
        n = 1
        while n <= self.start:
            yield n
            n += 1
for rr in reversed(Countdown(30)):
    print(rr)
for rr in Countdown(30):
    print(rr)

Le résultat de sortie est de 1 à 30 puis de 30 à 1, qui sont respectivement une impression séquentielle et une impression inversée

2 Itérer plusieurs séquences en même temps

Vous souhaitez itérer plusieurs séquences en même temps, à chaque fois à partir d'une séquence Prendre un élément. Avez-vous déjà rencontré un tel besoin ?

Afin d'itérer plusieurs séquences en même temps, utilisez la fonction zip() Exemple spécifique :

# -*- coding: UTF-8 -*-
names = ['laingdianshui', 'twowater', '两点水']
ages = [18, 19, 20]
for name, age in zip(names, ages):
     print(name,age)

Résultat de sortie :

laingdianshui 18
twowater 19
两点水 20

En fait, zip(a, b) générera un itérateur qui renvoie un tuple ( x, y) , où x vient de a et y vient de b. Une fois qu’une des séquences atteint la fin, l’itération se termine. Par conséquent, la longueur de l’itération est cohérente avec la longueur de la séquence la plus courte dans les paramètres. Faites attention à comprendre cette phrase, c'est-à-dire que si les longueurs de a et b sont incohérentes, la plus courte sera utilisée comme standard et le parcours se terminera.

En utilisant la fonction zip(), nous pouvons également générer un dict (dictionnaire) à partir d'une liste de clés et d'une liste de valeurs, comme suit :

# -*- coding: UTF-8 -*-
names = ['laingdianshui', 'twowater', '两点水']
ages = [18, 19, 20]
dict1= dict(zip(names,ages))
print(dict1)

Afficher les résultats suivants :

{'laingdianshui': 18, 'twowater': 19, '两点水': 20}

Permettez-moi de mentionner ici que zip() peut accepter plus de deux paramètres de séquence, pas seulement deux.

Formation continue
  • Recommandations de cours
  • Téléchargement du didacticiel