Cet article est un article pour étudier la fonction générateur car il n'a pas pu être utilisé sans comprendre la fonction générateur. Le contenu est un mémorandum personnel avec des références.
Vérifiez d'abord la définition de la fonction du générateur.
--Définition: fonction de générateur [^ 1]
Si une instruction yield est utilisée dans la définition de la fonction, la fonction est appelée fonction de générateur. Les fonctions génératrices sont un type d'itérateur.
Exemple: Exécutez une fonction de générateur à l'aide de yield en Python 3.7.4. Renvoie des valeurs séparées par yield.
def sample_generator_fun():
yield 1
yield 2
yield 3
check = sample_generator_fun()
print(check.__next__())
print(check.__next__())
print(check.__next__())
Résultat d'exécution
1
2
3
Si vous exécutez une autre vérification ...
print(check.__next__())
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-25-7029da5797f2> in <module>
----> 1 print(check.__next__())
StopIteration:
Il sera affiché comme arrêt de répétition et une erreur se produira. Autrement dit, les instructions yield de sample_generator_fun seront exécutées en séquence, l'itération se terminera lorsque le troisième "yield 3" sera exécuté et aucune valeur ne sera renvoyée même si elle est exécutée plus loin.
Je n'ai pas bien compris la fonction du générateur, je l'ai pensé comme identique à un objet itérateur tel qu'une liste, et j'ai commis les erreurs suivantes. * En premier lieu, j'avais honte de ne pas connaître l'existence de la fonction de générateur.
Exemple: Vérifiez si le nombre d'itérateurs de la fonction de générateur obtenue est supérieur à 2, et si c'est le cas, exécutez-le.
** Exemple d'échec **
check = sample_generator_fun()
if len(list(check)) > 2:
print("True")
for i in check:
print(i)
else:
print("False")
Résultat d'exécution
True
Ici, je me demandais pourquoi l'instruction for ci-dessous n'a pas été exécutée alors qu'elle était True dans l'instruction if, et j'ai pu le découvrir de différentes manières et arriver à la fonction de générateur. List (check) dans l'expression conditionnelle En exécutant, le dernier "yield 3" est exécuté, donc dans l'instruction for suivante, check ne renvoie pas de valeur, donc l'instruction for n'est pas exécutée.
Il y a deux choses auxquelles vous pouvez facilement penser. Si vous souhaitez rendre la fonction de générateur appelable plusieurs fois, [cet article] (https://qiita.com/tomotaka_ito/items/15b5999c76001dbc9a58) Il peut être préférable de faire quelque chose comme [^ 2].
--Si la taille totale des données renvoyées par la fonction de générateur n'est pas importante, convertissez-la en liste et utilisez-la.
check = sample_generator_fun()
check_list = list(check)
if len(check_list) > 2:
print("True")
for i in check_list:
print(i)
else:
print("False")
Résultat d'exécution
True
1
2
3
check = sample_generator_fun()
n = 0
for i in check:
n += 1
if n > 2:
print("True")
check = sample_generator_fun()
for j in check:
print(j)
break
else:
print("False")
Résultat d'exécution
True
1
2
3
Dans le langage de script, vous pouvez écrire du code sans déclarer de types, mais si vous ne savez pas exactement quel type et quelle nature vous touchez, vous aurez des problèmes. Cette fois, c'est la même chose que "liste". Ce fut un échec dû à l'observation pleine d'espoir de l'una. Il est difficile de saisir tout le contenu de la bibliothèque à utiliser, mais je me suis rendu compte une fois de plus que les choses de base comme cette fois devraient être supprimées correctement.
[^ 1]: Kenji Nakaku: Introduction à Python pour les calculs scientifiques et technologiques, 2016, Revue technique [^ 2]: Je veux réitérer le générateur Python plusieurs fois
Recommended Posts