Python >> Tutoriel Python >  >> Python

Comment itérer deux fois sur un générateur

Salut les Finxters ! Il est temps pour un autre sujet Python qui reviendra à coup sûr dans votre carrière de développeur Python.

Formulation du problème : Comment itérer deux fois sur un générateur ?

Ensuite, nous examinerons trois solutions sur la façon dont nous pouvons itérer deux fois, voire plusieurs fois, sur un générateur ou un itérateur.

Tout d'abord, nous devons comprendre qu'un générateur en python est une routine spéciale qui peut être utilisée pour contrôler le comportement d'itération d'une boucle.

Dans cet article, nous allons nous concentrer sur le itertool module et les différentes façons dont il est utilisé dans le monde réel. Ce module est préinstallé dans Python, nous n'avons donc qu'à l'importer. Nous examinerons de près itertools.repeat(), itertool.count et itertools.product. Chacun d'eux génère différentes manières de parcourir une liste, un tuple ou un dictionnaire.

Méthode 1

Dans ce premier exemple, nous allons utiliser le itertools.repeat() et comment il est utilisé dans l'itération. itertools.repeat() crée un itérateur qui renvoie un objet encore et encore.

Il s'exécute indéfiniment à moins que l'argument times ne soit spécifié. Il est utilisé comme argument de map() pour les paramètres invariants à la fonction appelée. Il peut également être utilisé avec zip() pour créer une partie invariante d'un enregistrement de tuple. Cela le rend inestimable pour ce que nous sommes sur le point de faire.

Jetez un œil au code ci-dessous :

def repeat(object, times=None):
    # repeat(10, 3) --> 10 10 10
    if times is None:
        while True:
            yield object
    else:
        for i in range(times):
            yield object

list(map(pow, range(10), repeat(2)))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Ci-dessus, j'ai défini deux arguments dans la définition de repeat(object, times=None) , étant donné mon instruction if-else, demandant à répéter pour voir combien de fois je veux qu'il passe sur mon objet, et si je ne veux pas que quelque chose se produise (Aucun), cela rendra cette liste d'expressions d'objets me revient, dans ce cas rien ou il parcourra mon objet un certain nombre de fois avant de me renvoyer un objet répété. J'ai appelé ma solution à l'intérieur de la fonction ci-dessus qui demande une liste de 10 nombres à leurs puissances puis répétée deux fois.

Méthode 2

La façon dont il est écrit ci-dessus a certainement l'air sympa, mais c'est aussi celui qu'un programmeur débutant écrirait. L'exemple suivant fera ce que l'exemple de code ci-dessus peut faire, mais avec moins de code pour un code véritablement pythonique :

import itertools
squares = list(map(pow, range(10), itertools.repeat(2)))
print(squares)

La sortie est :

squares = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Ces trois lignes représentent le même code que ci-dessus. N'est-ce pas incroyable! Nous avons pris moins de code pour obtenir les mêmes résultats que celui ci-dessus !

L'ordre d'évaluation de gauche à droite des itérables est garanti. Cela rend possible un idiome pour regrouper une série de données en groupes de longueur n en utilisant zip(*[iter(s)]*n) . Cela répète le même itérateur n fois afin que chaque tuple de sortie ait le résultat de n appels à l'itérateur. Cela a pour effet de diviser l'entrée en morceaux de longueur n. Depuis, j'ai demandé 10 numéros avec une répétition de 5, ma sortie ci-dessus est correcte.

Méthode 3

Encore un autre exemple d'utilisation de itertools.repeat() est :

import itertools

data = list(zip(range(10), itertools.repeat(5)))
print(data)

Il renvoie un itérateur de tuples où le nombre d'itérables de la liste 1 correspond à la liste 2. L'itérateur s'arrête lorsque la liste la plus courte est épuisée. Ainsi, la sortie de ce code est :

data = [ (0,5),
	 (1,5),
	 (2,5),
	 (3,5),
	 (4,5),
	 (5,5),
	 (6,5),
	 (7,5),
	 (8,5),
         (9,5)]

Cette méthode est utilisée si vous souhaitez avoir une répétition d'une valeur particulière ou avoir une partie invariante d'un enregistrement de tuple.

Conclusion

Comme nous pouvons le voir, itertools est un outil important à utiliser si nous voulons créer des répétitions avec un générateur en Python. Nous pouvons créer des carrés comme nous l'avons vu ci-dessus dans deux méthodes différentes et nous pouvons compresser deux listes avec une valeur invariante et imprimer la sortie.

Python dispose de nombreux outils qui peuvent faciliter votre travail au quotidien. De la création d'un enregistrement et de carrés à l'aide d'un map() fonction. Nous sommes capables de le faire avec Python dans une courte quantité de code et de le rendre simple. Je vous encourage à lire la documentation officielle de Python et à vous exercer un peu à jouer avec itertools jusqu'à ce que vous soyez à l'aise avec son utilisation dans votre programmation.

Merci de m'avoir rejoint dans ce voyage de itertools.repeat() . Il existe une tonne d'autres outils que vous pouvez utiliser à la place de repeat() . Même si je ferais attention ! Certaines de ces méthodes ne peuvent être utilisées qu'une seule fois dans un programme, vous devez donc être prudent lorsque vous les utilisez ! D'autres répéteront indéfiniment sauf indication contraire ! Examinez attentivement celle qui conviendrait le mieux à votre application, puis utilisez cette méthode. Cela prend un peu d'essais et d'erreurs, mais cela fera de vous un meilleur programmeur Python à la fin !