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

  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]

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Intuitivement, on voit bien que le retour du générateur vient écraser n.
    Si on le récupère dans une variable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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:
          x = generateur.send(12)
       print(n)
    tout entre dans l'ordre.

    Et cela ressemble fort à ce qu'on appelle "bug".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    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
    Sur le principe, on adapte, ça donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def interval(a,b):
       ...count = a 
       ...while count < b: 
       ...    valeur_recu = (yield count) 
       ...    if valeur_recu is not None : 
       ...        count = valeur_recu 
       ...    count += 1
    avec comme résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for n in g:
       ...if n == 10: 
       ...    g.send(12) 
       ...print(n) 
       ...                                                                      
    3
    4
    5
    6
    7
    8
    9
    10
    14

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Sur le principe, on adapte, ça donne
    Votre code, sous l'interpréteur donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    3
    4
    5
    6
    7
    8
    9
    13
    10
    14
    Prenez le temps de lire un peu pour comprendre ce qu'il se passe, essayez de reproduire le problème avant de...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    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
    Votre code, sous l'interpréteur donne
    Euh, j'ai donné le résultat du mien, qui est ipython, je ne suis pas censé savoir que le retour ne sera pas le même




  11. #11
    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 wiztricks Voir le message
    Intuitivement, on voit bien que le retour du générateur vient écraser n.
    Bien vu parce que moi, intuitivement je n'avais rien vu

    Citation Envoyé par wiztricks Voir le message
    Et cela ressemble fort à ce qu'on appelle "bug".
    Ah ça j'avais percuté

    Maintenant la vraie question c'est "est-ce que cet enchainement et mélange de yield dans tous les sens est correct " ?
    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]

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bien vu parce que moi, intuitivement je n'avais rien vu
    Nous nous sommes fait avoir par l'interpréteur.

    En fait ce qui s'affiche, c'est le retour du g.send(12) i.e. le fonctionnement normal de l'interpréteur lorsqu'on n'assigne pas le retour d'une fonction a une variable.
    On peut reproduire cela tout simplement avec:
    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
    >>> def f():
    ...     return 'xxx'
    ...
    >>> for n in range(5):
    ...     if n == 2:
    ...         f()
    ...     print(n)
    ...
    ...
    0
    1
    'xxx'
    2
    3
    4
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    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 wiztricks Voir le message
    i.e. le fonctionnement normal de l'interpréteur lorsqu'on n'assigne pas le retour d'une fonction a une variable.
    Joli
    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]

  14. #14
    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
    Citation Envoyé par wiztricks Voir le message
    Nous nous sommes fait avoir par l'interpréteur.



    - W
    merci pour tous, j'ai compris

  15. #15
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Citation Envoyé par adn.o.o.adn Voir le message
    merci pour tous, j'ai compris
    Si c'est le cas il y a le bouton , sinon autant dire ce que vous ne comprenez pas.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ 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