[PYTHON] Générateur

dans une boucle for


l = ['Bonjour', 'Bonjour', 'Bonsoir']

for i in l:
    print(i)

Résultat de l'exécution en boucle for


Bonjour
Bonjour
Bonsoir

Si vous écrivez ceci en utilisant un générateur,

Générateur 1


def greeting():
    yield 'Bonjour'
    yield 'Bonjour'
    yield 'Bonsoir'

g = greeting()

print(next(g))
print(next(g))
print(next(g))

Résultat d'exécution du générateur 1


Bonjour
Bonjour
Bonsoir

Si vous avez deux générateurs,

2 générateurs


def greeting():
    yield 'Bonjour'
    yield 'Bonjour'
    yield 'Bonsoir'
g = greeting()

def counter(num=10):
    for i in range(num):
        yield 'Gaga Gaga!!!'
c = counter()

print(next(g))

print(next(c))
print(next(c))
print(next(c))
print(next(c))
print(next(c))

print(next(g))

print(next(c))
print(next(c))
print(next(c))
print(next(c))
print(next(c))

print(next(g))

Résultat d'exécution de deux générateurs


Bonjour
Gaga Gaga!!!
Gaga Gaga!!!
Gaga Gaga!!!
Gaga Gaga!!!
Gaga Gaga!!!
Bonjour
Gaga Gaga!!!
Gaga Gaga!!!
Gaga Gaga!!!
Gaga Gaga!!!
Gaga Gaga!!!
Bonsoir

Au lieu de traiter à la fois comme une boucle for Garder la génération d'éléments Un autre traitement peut être effectué.

Alors Par exemple, comme le code ci-dessous Si le traitement lourd est au milieu Plutôt que de faire tout le traitement en même temps Il peut être subdivisé et mis en œuvre.

Générateur lourd


def greeting():
    yield 'Bonjour'
    for i in range(1000000):
        print(i)
    yield 'Bonjour'
    for i in range(1000000):
        print(i)
    yield 'Bonsoir'

Rendement du processus «bonjour». for i in range(1000000): Vous n'êtes pas obligé de traiter l'impression (i).

prochain for i in range(1000000): print(i) Traitement du rendement «Bonjour».

Il peut être traité en petits morceaux.

Erreur du générateur


def greeting():
    yield 'Bonjour'
    yield 'Bonjour'
    yield 'Bonsoir'

g = greeting()

for i in range(4):
    print(next(g))

Erreur d'exécution du générateur


Traceback (most recent call last):
  File "Main.py", line 9, in <module>
    print(next(g))
StopIteration

Bonjour, bonjour, trois tels pour le Bonsoir, J'ai fait 4 tirages (suivant (g)), donc StopIteration renvoie une erreur.

Recommended Posts

Générateur
Générateur
Mémo du générateur.
Générateur de nombres naturels
Générateur de mots de passe à motifs
Essayez le générateur de numpy.random
Générateur de mot de passe de hachage
[Python] Fonction de générateur
Fonction générateur même en JavaScript
Notation d'inclusion de générateur Notation d'inclusion Taple
Notes de création du générateur de mots de passe
Liste des générateurs de graphiques NetworkX