Maison > développement back-end > Tutoriel Python > Introduction détaillée aux itérateurs et générateurs Python

Introduction détaillée aux itérateurs et générateurs Python

高洛峰
Libérer: 2017-03-22 10:00:10
original
1277 Les gens l'ont consulté

1. Qu'est-ce qu'un itérateur ?

Parlons d'abord de ce qu'est l'itération. L'itération consiste à répéter une chose plusieurs fois, comme for loop. La boucle

for peut parcourir tous les objets qui ont des méthodes iter. Alors, quelle est la méthode iter ?

Le fait qu'un objet soit itérable ou non dépend du fait que l'objet ait une méthode iter. L'appel de la méthode iter de l'objet renverra un itérateur. Cet itérateur doit avoir une méthode next. La méthode de cet itérateur est appelée, l'itérateur renvoie sa valeur suivante Lorsqu'il n'y a aucune valeur à renvoyer dans l'itérateur, une exception nommée StopIteration est levée pour arrêter l'itération.

Une autre caractéristique très importante des itérateurs est qu'ils sont irréversibles et ne peuvent qu'avancer, pas reculer.

Voici comment fonctionne la boucle for. Lorsque la boucle for parcourt un objet, elle appellera la méthode iter de l'objet pour obtenir l'itérateur, puis appellera la méthode suivante de l'itérateur pour obtenir l'itérateur. . Chaque valeur incluse.

2. Quelle est la différence entre les listes et les itérateurs ? Comment puis-je implémenter un itérateur de base ?

La façon dont fonctionnent les itérateurs est de calculer une valeur et d'obtenir une valeur lors de son utilisation, tandis qu'une liste obtient toutes les valeurs à la fois. S'il y a plusieurs valeurs, cela prendra beaucoup de mémoire.

Lorsque vous créez vous-même un objet, comment rendre votre objet itérable ?

class test_class:

def init(self,start_num,stop_num):

self.start_num = start_num

self. stop_num = stop_num

def next(self):

if self.start_num < self.stop_num:

self.start_num = 1

                                                                                                                                                                                          . 🎜>imprimer test_obj.next()

>> ;>2

print test_obj.next()

>>>3

3. Qu'est-ce qu'un

générateur ?

D'après ma compréhension personnelle, le générateur est un objet itérable spécial. Il est différent des autres objets itérables, c'est-à-dire que les autres objets itérables doivent appeler la méthode iter et renvoyer un objet itérateur, puis exécuter le. next via l'objet itérateur pour obtenir la valeur dans l'itérateur, mais le générateur peut être itéré directement sans exécuter la méthode iter.

Il existe deux formes d'expression des générateurs en

python

 :

Fonction

-style générateur : c'est-à-dire, littéralement, dans une fonction régulière. générateur, la valeur de retour de l'instruction n'utilise plus return pour return, mais utilise le mot-clé rendement pour renvoyer un résultat à chaque fois. Il ne peut pas y avoir plusieurs retours dans une fonction, mais il peut y avoir plusieurs rendements, chacun dans la fonction Yield renverra. un résultat. Chaque fois qu'un rendement est exécuté, l'exécution

statut

sera 'suspendue', ce qui peut être compris comme suspendu. La prochaine fois que vous continuerez à appeler cette fonction, elle continuera à partir de la dernière suspension. position Exécuter vers le bas.

Ce qui suit est un exemple de générateur fonctionnel :

L'exemple suivant vérifie les deux caractéristiques du rendement La première est qu'une fonction peut produire plusieurs valeurs et qu'il existe plusieurs rendements. Un autre élément est la fonction de suspension des générateurs fonctionnels.

def func1() :

rendement 1

imprimer "La première exécution de rendement est terminée ~"

rendement 2 imprimer "L'exécution du deuxième rendement est terminée ~"

rendement 3

print "L'exécution du troisième rendement est terminée ~"

pour i dans func1() :

imprimer i

>>>1

La première exécution du rendement est terminée ~

2

Le deuxième rendement l'exécution est terminée ~

3

La troisième exécution de rendement est terminée ~

Générateur

Expression

 : utilisez une méthode similaire à la compréhension de liste, mais renvoyez le object Il ne s'agit plus d'une liste, mais d'un objet (générateur) qui permet de générer des résultats à la demande.

Exemple 1 :

pour je dans (je pour je dans

plage

(10000)) :

     print i

(i for i in range(5)) C'est l'expression du générateur.

(i for i in range(10000)) = def test(): for i in range(10000):yield i

Ces deux méthodes d'écriture ont le même effet, juste écrites en de différentes manières, l'une est une expression génératrice et l'autre est un générateur fonctionnel.

Avez-vous déjà pensé que ce type d'expression génératrice ressemble beaucoup à une compréhension de liste. La différence est que la compréhension de liste utilise des crochets [], tandis que l'expression génératrice utilise des crochets ().

Ça y est, la syntaxe entre elles n'est en effet qu'une différence entre parenthèses, cependant, les expressions génératrices économisent plus d'espace mémoire.

À propos des générateurs, c'est à peu près tout. Voici un résumé :

La méthode de définition des générateurs est exactement la même que celle des fonctions ordinaires. La différence est que les générateurs utilisent le rendement pour renvoyer une valeur. , la fonction utilise return pour renvoyer une valeur.

En python, le générateur implémentera automatiquement le protocole d'itération et renverra une exception StopIteration lorsqu'il n'y aura aucune valeur à renvoyer.

Les générateurs utilisent l'instruction rendement pour renvoyer une valeur. L'instruction rendement suspend l'état de la fonction génératrice, conservant suffisamment d'informations pour reprendre ultérieurement l'exécution là où elle s'était arrêtée.

L'exemple suivant est une comparaison de l'efficacité d'exécution des compréhensions de listes et des expressions génératrices. Les amis intéressés peuvent l'essayer sur leur propre ordinateur.

#Analyse de liste

sum([i for i in range(100000000)])#L'utilisation de la mémoire est importante et la machine est facile à bloquer

#Générateur expression

sum(i for i in range(100000000))# ne prend presque pas 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!

Étiquettes associées:
source:php.cn
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