[Python] Fonction de générateur

introduction

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.

Définition

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.

Exemple d'échec

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.

Solution

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

Impressions

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

[Python] Fonction de générateur
fonction python ①
fonction python ②
fonction d'énumération python
Python> fonction> Fermeture
Python> fonction> Fonction interne
Décorateur de fonction Python
À propos des arguments de fonction (python)
Résumé des arguments de la fonction Python
Fonction d'impression Python (suite)
Python: à propos des arguments de fonction
Fonction de plancher de temps (Python)
Zundokokiyoshi (générateur) en Python
Créer une fonction en Python
Python
[python] Valeur de l'objet fonction (?)
2017-04-11 Python> J'ai essayé le générateur> On m'a appris l'expression du générateur / la fonction du générateur / suivant ()
Fonction ntile (décile) en python
[Python] L'origine du nom de la fonction python
Générateur
À propos de la fonction enumerate (python)
le paramètre d'URL de python inclut la fonction
Python #function 2 pour les super débutants
Modélisation de fonctions non linéaires en Python
Dessiner la fonction Yin en python
Exemple de fonctions d'ordre supérieur (décorateurs) en Python
Fonction immédiate (lie) en python
Générateur
[Python] Qu'est-ce qu'une fonction zip?
Inclusions de tapple Python et expressions de générateur
[python] Fonction de rappel (passez la fonction en argument)
Définition du type d'argument de fonction en python
générateur de nombres aléatoires français avec python
Générateur principal infini en Python3
Mesurer le temps d'exécution de la fonction en Python
[Présentation de l'application Udemy Python3 +] 59. Générateur
[Python] Faire de la fonction une fonction lambda
Fonction Python #len pour les super débutants
Synthèse de fonctions et application en Python
Précautions lors de la création d'un générateur Python
Comment utiliser la fonction zip de python
[Python] Différence entre fonction et méthode
[Python] Arguments de fonction * (étoile) et ** (étoile double)
[OpenCV; Python] Résumé de la fonction findcontours
python kafka
[Introduction à Udemy Python3 + Application] 63. Notation d'inclusion du générateur
Python3> Fonctions> Mécanisme de changement de nom de fonction> f = fib
Les bases de Python ⑤
Créer un décorateur de fonction Python avec Class
Python intégré
Notation d'inclusion Python
Technique Python
Étudier Python
Compte à rebours Python 2.7
Mémorandum Python
Python FlowFishMaster
Service Python
Réaliser un générateur PHP / Python avec Golang / Ruby