IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Generateur avec paramètre via send (première itération)


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Par défaut Generateur avec paramètre via send (première itération)
    Bonjour,

    Je débute en Python et je me contente actuellement de suivre des tutoriels. Est-ce possible de changer le paramètre d'un générateur lors de la première itération ? J'ai l'impression qu'il faille au moins que la première itération soit faite avec la valeur du paramètre par défaut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    def Gen(value = 100):
        while True:
            new_value = yield value
            if new_value is not None:
                value = new_value
     
    # générateur avec valeur du paramètre par défaut
    gen = Gen()
     
    ## fonctionne si le générateur itère au moins une fois avec la valeur par défaut.
    # print(next(gen))
     
    # modification de la valeur du paramètre
    gen.send(20)
     
    print(next(gen))
    Merci par avance !

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Je ne comprends pas ton code. Il est censé faire quoi ton générateur ? Si tu veux modifier le paramètre, pourquoi n'appelle tu pas toput simplement Gen(20) ?
    Qu'est censé donner print(list(Gen(20))) et print(list(Gen())) ?

  3. #3
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Citation Envoyé par Orbeaman Voir le message
    Est-ce possible de changer le paramètre d'un générateur lors de la première itération ? J'ai l'impression qu'il faille au moins que la première itération soit faite avec la valeur du paramètre par défaut.
    La technique pour faire cela est d'utiliser un décorateur pour amorcer le générateur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def geninit(gen, *args, **dargs):
        def f():
            g = gen(*args, **dargs)
            next(g)
            return g
        return f
     
     
    @geninit
    def Gen(value = 100):
        # code

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Rien n'empêche de fabriquer un itérateur, qui permettra un contrôle plus fin du déroulement.

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    # -*- coding: utf-8 -*-
    # Python 3
     
    class Gen:
     
        def __init__(self, value=100):
            self.value = value
     
        def __iter__(self):
            return self
     
        def next(self):
            value = self.value
            if value<0:
                raise StopIteration
            self.value -= 1
            return value
     
        def send(self, value):
            self.value = value        
     
     
    gen = Gen() # value est ici à 100 par défaut
     
    gen.send(5) # optionnel: changement de value à 5 avant 1er appel
     
    while True:
        try:
            print(gen.next()) # appel des valeurs
        except StopIteration:
            break
    Ce qui affichera:


  5. #5
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Juste pour information : cela doit faire 5 ans que je fais du Python et je n'ai jamais utilisé les générateurs !!!
    Cela ne me manque pas souvent...

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour marco056

    Citation Envoyé par marco056 Voir le message
    Juste pour information : cela doit faire 5 ans que je fais du Python et je n'ai jamais utilisé les générateurs !!!
    Cela ne me manque pas souvent...
    Quelquefois, au lieu d'obtenir la liste complète de quelque chose, on préfère avoir les éléments de cette liste un par un, et c'est là que yield est utile.

    Pour prendre un exemple: glob du module glob obtient la liste complète des fichiers cherchés, et iglob permet de les obtenir un par un. Cela permet d'arrêter la recherche quand on a trouvé ce qu'on cherchait (gain de temps et de place mémoire).

    En plus, si on a la fonction générateur xxx(), on obtient facilement la liste complète avec list(xxx()): on a donc pas besoin d'avoir les 2 versions de la fonction (glob est d'ailleurs calculé en utilisant iglob).

Discussions similaires

  1. cPanel, créer compte FTP avec paramètres via script PHP
    Par TheStarcraftx dans le forum Langages serveur
    Réponses: 0
    Dernier message: 01/08/2018, 22h03
  2. Lancer un .jar avec paramètre via un .bat
    Par Silen dans le forum Général Java
    Réponses: 9
    Dernier message: 25/02/2015, 09h51
  3. Tâche XML avec paramètres via les variables
    Par CoderCool dans le forum SSIS
    Réponses: 2
    Dernier message: 19/09/2011, 15h40
  4. Appeler programme C++ avec paramétres via PHP
    Par hssine dans le forum C++
    Réponses: 1
    Dernier message: 18/04/2008, 13h06
  5. invoquer directement un webService avec paramètre via url
    Par Nycos62 dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 21/12/2006, 12h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo