Je veux répéter plusieurs fois un générateur Python

Le générateur Python est utile, mais une fois que vous l'utilisez dans une instruction for pour une boucle, vous essayez de l'utiliser à nouveau dans une instruction for, cela ressemble à un carappo.

def i(n):
    yield n + 1
    yield n + 2


g = i(10)
print('first time:')
for n in g:
    print(n)

print('second time:')
for n in g:
    print(n)

La sortie est

first time:
11
12
second time:

Ce sera. Aucun élément n'a été itéré dans la deuxième boucle «for».

Dans les situations où vous voulez que «11» et «12» reviennent dans la deuxième boucle «for» et les suivantes, les techniques suivantes ont fonctionné.

class ReiteratableWrapper(object):
    def __init__(self, f):
        self._f = f

    def __iter__(self):
        return self._f()

def i(n):
    yield n + 1
    yield n + 2

import functools
f = functools.partial(i, 10)

g2 = ReiteratableWrapper(f)
for n in g2:
    print(n)

for n in g2:
    print(n)

Commentaire

La classe ReiteratableWrapper prend une fonction de générateur. Puisqu'il est appelé sans donner d'argument en interne, si vous voulez faire un appel de générateur avec un argument, créez une fonction sans argument qui lie l'argument en utilisant la fonction functools.partial etc. comme dans l'exemple.

Les expressions évaluées dans le contexte après in dans l'instruction for sont appelées la méthode __iter__. Par conséquent, une instance de Reiteratable Wrapper créera automatiquement un nouveau générateur à chaque fois.

Cependant, chaque fois que la méthode __iter__ est évaluée, la fonction de générateur est évaluée et exécutée, donc s'il y a un effet secondaire lors de l'appel de la fonction de générateur tel qu'une limite sur le nombre de fois où la fonction de générateur peut être exécutée, elle ne peut pas être utilisée à plusieurs reprises. Je pense qu'il y a quelque chose.

Je pense que la technique introduite cette fois-ci est efficace pour le contenu qui peut être répété, comme la lecture d'un fichier afin d'économiser de la mémoire, l'envoi d'une requête à la base de données à chaque fois et l'itération dans l'ordre.

Lien de référence

Recommended Posts

Je veux répéter plusieurs fois un générateur Python
Je veux créer un environnement Python
Je veux créer une fenêtre avec Python
Je veux faire un jeu avec Python
Je veux écrire dans un fichier avec Python
Je veux un générateur de mox
Je veux un générateur mox (2)
Je souhaite intégrer une variable dans une chaîne Python
Je veux facilement implémenter le délai d'expiration en python
Je veux générer rapidement UUID (memo memo) ~ Edition Python ~
Je veux écrire en Python! (2) Écrivons un test
Je veux échantillonner au hasard un fichier avec Python
Je veux travailler avec un robot en python.
[Python] Je veux faire d'une liste imbriquée un taple
Je veux faire fonctionner un ordinateur quantique avec Python
Je veux déboguer avec Python
[Python] Je souhaite obtenir un ensemble commun entre numpy
Je veux démarrer beaucoup de processus à partir de python
Je souhaite envoyer un message de Python à LINE Bot
Je veux ajouter un joli complément à input () en python
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
Je veux imprimer dans la notation d'inclusion
Je veux utiliser jar de python
Je souhaite rechercher le texte intégral avec elasticsearch + python
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
J'ai fait un générateur de mot de passe pour enseigner Python3 aux enfants (bonus) * Complètement refait
[Mémo Python] Je souhaite obtenir un nombre hexadécimal à 2 chiffres à partir d'un nombre décimal
Je souhaite convertir une table convertie en PDF en Python en CSV
Je veux colorer une partie de la chaîne Excel avec Python
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
Je souhaite créer une application Web en utilisant React et Python flask
Je veux faire un patch monkey seulement en partie en toute sécurité avec Python
Je veux faire de matplotlib un thème sombre
Je veux faire le test de Dunnett en Python
Je souhaite créer facilement un modèle de bruit
Je veux utiliser MATLAB feval avec python
Je veux INSÉRER un DataFrame dans MSSQL
Je veux mémoriser, y compris les arguments de mots clés de Python
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
[Python] Je veux gérer 7DaysToDie depuis Discord! 1/3
Je ne veux pas passer un test de codage
Je veux fusionner des dictionnaires imbriqués en Python
Je souhaite utiliser le répertoire temporaire avec Python2
Je veux utiliser le solveur ceres de python
#Unresolved Je veux compiler gobject-introspection avec Python3
Je souhaite créer un type d'implémentation pouvant être branché
Je veux résoudre APG4b avec Python (chapitre 2)
Je souhaite vendre les produits que j'ai listés par python scraping Mercari
[Python] Je veux gérer 7DaysToDie depuis Discord! 2/3
Je veux trouver facilement une délicieuse boutique
Je veux créer du code C ++ à partir de code Python!
Je veux afficher la progression en Python!
Je souhaite télécharger une application Django sur heroku
Je veux créer un bel environnement de développement Python pour mon nouveau Mac
Je veux juste ajouter scipy, mais c'est un mémo amusant. Ubuntu, Python 3.
Je souhaite créer une file d'attente prioritaire pouvant être mise à jour avec Python (2.7)
J'ai essayé d'expliquer à quoi sert le générateur Python aussi facilement que possible.
Je veux exécuter et distribuer un programme qui redimensionne les images Python3 + pyinstaller