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 :

aide générateurs yield python


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2017
    Messages : 4
    Par défaut aide générateurs yield python
    bonjour,
    besoin de votre aide a propos du fonctionnement de yield en python.
    ce bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    def interval(a,b):
       while a<b:
           valeur_recu = (yield a)
           if valeur_recu is not None :
                 a = valeur_recu
           a += 1
     
    generateur = interval(3,15)
     
    for n in generateur :
       if n == 10:
          generateur.send(12)
       print(n)
    donne le resultat suivant:

    3
    4
    5
    6
    7
    8
    9
    13
    10
    14

    mais moi je veux le résultat suivant:

    3
    4
    5
    6
    7
    8
    9
    13
    14

    merci de me donner une solution avec explication.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par adn.o.o.adn Voir le message
    donne le resultat suivant:

    3
    4
    5
    6
    7
    8
    9
    13
    10
    14
    Tu fais erreur, il n'y a pas de "13"...

    Citation Envoyé par adn.o.o.adn Voir le message
    mais moi je veux le résultat suivant:

    3
    4
    5
    6
    7
    8
    9
    13
    14

    merci de me donner une solution
    Tu peux remplacer
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if n == 10:
          generateur.send(12)
       print(n)
    par
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if n == 10:
          generateur.send(11)
          continue
       print(n)

    Citation Envoyé par adn.o.o.adn Voir le message
    avec explication.
    Il faudrait déjà savoir ce que tu comprends du yield !!!

    Chaque yield renvoie la valeur de "a" à l'appelant (la boucle for). Donc au début, la boucle va itérer sur les nombres de 3 à 15.
    Quand le nombre en cours d'itération est "10", tu envoies "12" au générateur qui est reçu là aussi dans le yield mais dans le sens "retour". Ce "12" est alors stocké dans "a" puis "a" s'incrémente et il passe à 13 et ce "13" est renvoyé dans la boucle via le yield. Mais la boucle ne le traite pas puisqu'elle est toujours à l'itération du "10" (et là le "10" est affiché d'où ma modification pour qu'il ne le soit plus).
    Puis le for passe à l'itération suivante qui est alors le "a" suivant issu du générateur (14). D'où ma remarque sur le fait que le "13" ne s'affiche pas.

    Je te l'accorde ce n'est pas aisé à comprendre ce yield qui fonctionne dans les deux sens. Rajoute print("a=", a) juste avant le yield et peut-être que tu verras mieux ce qui se passe...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2017
    Messages : 4
    Par défaut
    si, "13" s'affiche.
    Nom : yield22.JPG
Affichages : 248
Taille : 75,4 Ko

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Incompréhensible... parce que pas chez moi...
    Nom : VirtualBox_Debian8_64b_10_05_2019_17_12_55.png
Affichages : 284
Taille : 356,0 Ko

    Après examen de ta copie d'écran (et je te jure que j'ai examiné chaque ligne de ton code une à une !!!, je remarque que moi j'utilise un script alors que toi tu tapes en direct. Donc je tente en direct... et là le 13 apparait !!!???!!! (et pareil sous zindow: en script pas de "13" et en direct le "13")
    Nom : VirtualBox_Debian8_64b_10_05_2019_17_32_52.png
Affichages : 252
Taille : 286,6 Ko

    Je t'avoue que je reste un peu sec sur ce comportement qui diffère entre script et direct. Je suppute un comportement un peu indéterminé lié à cette utilisation du yield dans les deux sens (un peu identique à ce qui se passe quand tu demandes printf("%d, %d\n", f(), f()) en C et que tu ne peux pas garantir dans quel ordre se feront les appels des deux fonctions) mais je ne saurais t'en dire plus. J'aimerais que d'autres voient ce topic pour avoir leur avis...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonsoir,

    C'est un problème à l'initialisation de variable,

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    >>> def interval(a, b):
    ...     count = a
    ...     while count < b:
    ...         yield count
    ...         count += 1
    ... 
    >>> g = interval(3, 15)
    >>> for n in g:
    ...     print(n)
    ... 
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> g = interval(3, 15)
    >>> for n in g:
    ...     if n == 10:
    ...         g.send(12)
    ...         continue
    ...     print(n)
    ... 
    3
    4
    5
    6
    7
    8
    9
    11
    12
    13
    14
    Bonne continuation...

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    C'est un problème à l'initialisation de variable,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> def interval(a, b):
    ...     count = a
    ...     while count < b:
    ...         yield count
    ...         count += 1
    Ben peut-être mais là ton code n'a rien à voir avec le code initial. Tu ne fais que remplacer "a" par "count" ce qui ne change rien. Et elle est où la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    valeur_recu = (yield a)
           if valeur_recu is not None :
                 a = valeur_recu
    ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide jeu sur Python
    Par david803 dans le forum Débuter
    Réponses: 0
    Dernier message: 01/12/2011, 19h49
  2. aide pour script python
    Par bansan dans le forum Général Python
    Réponses: 1
    Dernier message: 28/11/2008, 23h51
  3. aide pour script python
    Par bansan dans le forum Programmation multimédia/Jeux
    Réponses: 0
    Dernier message: 28/11/2008, 19h41
  4. Aide MySQL et Python
    Par pierrot10 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 09/05/2008, 15h06

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