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 :

Yield dans une boucle for retourne un gènèrateur et pas une valeur


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Par défaut Yield dans une boucle for retourne un gènèrateur et pas une valeur
    Bonjour,

    Je constate que le mot clef yield utilisé dans une boucle for renvoie un générateur et pas une valeur

    Exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    liste = [1,2,3,4,5,6]
    for i, el In enumerate(liste) :
        Yield i # ne renvoie pas 0 mais un gènérateur pourquoi ? Pour reprendre la boucle plus tard avec une ligne comme
     
    gen.next()?
    Quelle est la différence entre yield et return ?

    Merci pour les renseignements !

    Salutations

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Est-ce que cet exemple peut aider:
    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
     
    >>> def enumerator(num):
    ...     for i in range(num):
    ...         yield i
    ... 
    >>> gen = enumerator(6)
    >>> while 1:
    ...     print(next(gen))
    ... 
    0
    1
    2
    3
    4
    5
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    StopIteration
    (Les puristes diront que for i in range(x) est déjà un générateur, mais c'est l'exemple qui compte)

  3. #3
    Membre très actif
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Par défaut
    Bonjour.
    Je ne comprends pas encore quel est le rôle de yield dans une boucle for renvoyer le générateur qui est derrière le In et pour faire quoi par exemple ?
    Interrompu une boucle et la reprendre plus tard avec next()Avez-vous un exemple plus complet
    Merci d'avance

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 063
    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 063
    Par défaut
    yield permet d'enregistrer des données en mémoire sans interrompre la fonction, sous forme d'un générateur. Le principe du générateur c'est de consommer ces données une seule fois après l'enregistrement, après ces données ne seront plus utilisables.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 750
    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 750
    Par défaut
    Salut,

    Citation Envoyé par Battant Voir le message
    Je ne comprends pas encore quel est le rôle de yield dans une boucle for renvoyer le générateur qui est dérrière le In et pour faire quoi par exemple ?
    Il n'y a rien à comprendre, on a construit cela pour çà. La seule chose que vous pouvez faire, c'est ouvrir un/des tutos qui racontent comment çà fonctionne et apprendre à vous en servir.
    Et si vous regardez un peu ce qu'il y a en magasin, il y a déjà 3 tutoriels Python :

    qui devraient répondre à vos questions.

    Citation Envoyé par VinsS Voir le message
    (Les puristes diront que for i in range(x) est déjà un générateur, mais c'est l'exemple qui compte)
    Justement, plutôt que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> def enumerator(num):
    ...     for i in range(num):
    ...         yield i
    ...
    range étant un générateur, depuis Python 3.3, on peut éviter la boucle for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> def enumerator(num):
    ...         yield from range(num)
    ...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. multi ouverture de la console dans une boucle for
    Par jamesleouf dans le forum C++
    Réponses: 2
    Dernier message: 16/03/2006, 21h26
  2. Shell - Erreur dans une boucle for
    Par claralavraie dans le forum Linux
    Réponses: 4
    Dernier message: 11/01/2006, 13h45
  3. Problème avec une DLL dans une boucle For
    Par BraDim dans le forum Langage
    Réponses: 5
    Dernier message: 20/09/2005, 12h22
  4. [batch] incrémentation dans une boucle for
    Par bart64 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 08/09/2004, 20h05
  5. Réponses: 3
    Dernier message: 06/07/2004, 10h21

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