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 :

yet another question à propos de yield !


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut yet another question à propos de yield !
    Bonjour,

    une petite question de syntaxe (qui cache peut être une question de philosophie pythonienne) à propos de yield :

    Voici un petit exemple d'école pour illustrer ma question :
    Je voudrais afficher les 5 premières valeurs renvoyées par une ch'tite fonction avec un yield,
    et je n'y arrive qu'avec une syntaxe moche (à mon goût) :
    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
    # ch'tite fonction avec yield
    def values ():
        n = 5
        while True :
            yield n
            n = n*2 - 4
     
    # syntaxe qui marche, mais qui ne me convient pas :        
    for i,x in enumerate( values()) :
        if i > 4 : 
            break        
        print x
     
    # syntaxe qui ne marche pas, mais qui me conviendrait :        
    for i in xrange( 5 ):
        print values()
    Y a-t-il un moyen de concilier les 2 ?

    Petite précision : ma fonction values n'est pas forcement appelée depuis une boucle for ... xrange.
    Ce que je voudrais, c'est que quelque soit le contexte depuis lequel je l'appelle, elle continue à me donner les valeurs suivantes.
    Un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if values() > 3 :
        print values(),values()
    spam = values()*values()
    print spam + values()
    Bien sûr, je pourrais faire ça avec une variable globale...
    Mais primo, ceci est un cas d'école, beaucoup plus simple que mon vrai problème, et secondo, je trouverais ça plus élégant avec yield !

    Merci !

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,
    Je ne comprends pas comment la variable qui sert à compter les tours de boucle puisse être mis à jour par la fonction...
    Si on sépare, çà pourrait donner un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def values(first=5):
        for n in xrange(first):
            yield n*2 - 4
     
    for x in values():
        print x,
    Est ce que c'est ce que tu cherchais à faite?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    Merci de ta réponse, mais ça ne colle pas...

    (re)voici un exemple de code que je veux pouvoir écrire avec ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i in xrange( 5 ):
        print values()
    if values() > 3 :
        print values(),values()
    spam = values()*values()
    print spam + values()
    (ce code est débile, c'est juste pour donner une idée).

  4. #4
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bonsoir.

    Un exemple concret de la sortie que tu veux obtenir serait bienvenu.

  5. #5
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # ch'tite fonction avec yield
    def values ():
        n = 5
        while True :
            yield n
            n = n*2 - 4
     
    V =values()
     
    # syntaxe qui ne marche pas, mais qui me conviendrait :        
    for i in xrange( 5 ):
        print V.next()
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    ou pour que ça ressemble plus à ce que tu veux:
    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
    >>> def genvalues():
    ... 	n = 5
    ... 	while True:
    ... 		yield n
    ... 		n = n * 2 - 4
    ... 		
    >>> values = genvalues().next
    >>> values()
    5
    >>> values()
    6
    >>> values()
    8
    >>> values()
    12
    >>> values()
    20

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

Discussions similaires

  1. Question à propos des compilateurs
    Par elf dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 20/07/2005, 17h00
  2. Question à propos des niveaux de transaction
    Par davy.g dans le forum Oracle
    Réponses: 3
    Dernier message: 18/01/2005, 15h31
  3. Petite question à propos du redbook...
    Par Michaël dans le forum OpenGL
    Réponses: 3
    Dernier message: 04/11/2004, 12h54
  4. Petite question à propos d'une requete
    Par ViBy dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/09/2004, 12h21
  5. Une question à propos des thread
    Par tscoops dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/11/2003, 14h03

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