Maison  >  Article  >  développement back-end  >  Une brève introduction aux générateurs et itérateurs en Python (avec exemples)

Une brève introduction aux générateurs et itérateurs en Python (avec exemples)

不言
不言original
2018-09-27 14:53:592626parcourir

Cet article vous apporte une brève introduction aux générateurs et itérateurs en Python (avec des exemples). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Itérateur

En Python, si un objet peut être bouclé (traversé) à travers chaque élément de l'objet, le processus est appelé itération. Par exemple, dictionnaire, chaîne, liste, tuple, ensemble, etc. La raison pour laquelle ils peuvent être itérés est qu'ils ont tous une fonction intégrée commune __iter__. En exécutant la fonction __next__ d'un objet intégré, tous les éléments de l'objet peuvent être imprimés en séquence. Par exemple, il existe une liste qui stocke les valeurs de 1 à 100, mais nous souhaitons imprimer uniquement les 50 premiers éléments.

flag=True
l=[x for x in range(1,101)]
l_iter = l.__iter__()
while flag:
    try:
       item=l_iter.__next__()
       if item==51:
           flag=False
           break
       else:
           print(item)
    except:
        break

Dans la boucle While, l'itérateur exécutera toujours la fonction __next__(), mais l'itérateur lui-même ne sait pas combien d'éléments il souhaite itérer. Lorsque le dernier élément est exécuté, la fonction __next__() continuera à être exécutée, mais pour le moment, aucun élément ne peut être itéré. Puisque l'itérateur ne peut pas trouver l'élément qui peut être itéré, une erreur sera signalée. Par conséquent, lorsque nous utilisons la boucle while, nous l'utilisons avec le code de capture d'exception try except. Lorsqu'une exception se produit pendant le processus d'itération, la boucle suivante sera automatiquement arrêtée.

Générateur :

Supposons que nous ayons une exigence selon laquelle, à l'exception du premier et du deuxième éléments, les autres éléments sont la somme des deux premiers éléments.

Nous pouvons écrire comme ceci

def fib1(max):
    n,a,b=0,0,1
    while n<max:
        print(b)
        a,b=b,a+b
        n=n+1
    return &#39;done&#39;

a=fib1(5)
print(a)

Le résultat de sortie

1
1
2
3
5
done

Le processus de dérivation est tel qu'illustré dans la figure

Utiliser une autre méthode

def fib2(max):
    n,a,b=0,0,1
    while n<max:
        yield b
        a,b=b,a+b
        n=n+1
    return &#39;done&#39;

appelle la fonction

a=fib2(5)
print(a)

et génère le résultat 1 ffa224a4e62674611c399d015e74f669

À ce stade, nous avons constaté que les résultats ne peuvent pas être affichés directement comme avant. Le fib défini à ce moment n'est pas une simple fonction, mais a été transformé en générateur. Si vous souhaitez connaître les résultats générés, vous pouvez exécuter la fonction __next__ dans l'ordre, mais un seul résultat sera renvoyé à chaque fois. Une exception sera levée lorsqu'il n'y aura plus d'éléments pouvant être itérés.

De plus, nous pouvons également utiliser for loop et while (doivent être utilisés avec try except) pour imprimer les résultats.

 a=fib2(5)
 for c in a:
    print(c)

Afficher les résultats de sortie 1 1 2 3 5.

Avantages de l'utilisation de générateurs : les générateurs calculent l'élément suivant en fonction du processus de dérivation. Regardons les deux premières fonctions fib1 et fib2. Ouvre un espace mémoire fixe dans l'ordinateur pour stocker les résultats complets du calcul. Cependant, si nous voulons accéder à un certain élément des résultats du calcul, nous devons parcourir l'intégralité du calcul. les résultats en premier. Nous pouvons obtenir les résultats souhaités via des indices d'objet ou en utilisant des boucles for et des jugements conditionnels. Cela peut répondre à nos besoins, mais cela consommera plus d'espace mémoire. fib2 calcule l'élément suivant en fonction du processus d'inférence, afin que nous puissions obtenir l'élément souhaité avant de créer l'objet complet. Réduisant ainsi la consommation de mémoire.

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!

Déclaration:
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