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 :

fonction à plusieurs sortie


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Par défaut fonction à plusieurs sortie
    Bonjour à tous.

    alors me voila face à un petit problème qui ne doit pas être trop compliqué si on connait les outils, mais moi je trouve pas.

    Je voudrais écrire une fonction qui me permet de récupérer une liste de liste, et de générer les listes au fur et a mesure.

    Je m'explique:
    Admettons que nous ayons en entrée de cette fonction la liste suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste=[[1,2,3,4],[5,6,7,8],['a','b','c','d']]
    Je voudrais pouvoir utiliser la fonction Update par exmple qui me sort les variable une par une.
    Par ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var_1,var_2,var_3,var_4=Update(liste)
    print var_1,var_2,var_3,var_4
    var_1,var_2,var_3,var_4=Update(liste)
    print var_1,var_2,var_3,var_4
    var_1,var_2,var_3,var_4=Update(liste)
    print var_1,var_2,var_3,var_4
    On aurait donc en sortie:
    1 2 3 4
    5 6 7 8
    a b c d

    Mais, (grande feinte!) je ne connais pas à l'avance la taille de mes sous-listes
    J'aurai peut etre une autre fois des sous listes de 7 éléments chacunes...

    J'ai imaginé un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class ListTest:
     
        def __init__(self,liste):
            self.liste=liste
            self.i=0
     
        def Update(self):
            for element in self.liste[self.i]:
                return element
            self.i=self.i+1
            #end for
        #end def
    Mais bien évidemment, le "return" arrete la fonction et donc il ne me ressort que le premier élément

    Quelqu'un a une idée?

  2. #2
    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
    Je ne comprends pas bien ....
    Ce code fait exactement ce que tu veux sans fonction update
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    liste=[[1,2,3,4],[5,6,7,8],['a','b','c','d']]
    def pprint(L):
        for x in L:
            print x,
        print
     
    for L in liste:
        pprint(L)
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Si ton objectif est simplement au niveau de l’affichage,
    sur ta liste le code suivant donne ce que tu veux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    liste=[[1,2,3,4],[5,6,7,8],['a','b','c','d']]
    for sl in liste:
        for u in sl:
            print str(u),
        print
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1  2  3  4
    5  6  7  8
    a  b  c  d

    Mais avec des éléments de longueurs différentes quand on les affiche, l’alignement ne tient plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    liste=[[1,2,366,4],[53,6,7,8],['a','bbhh','c','d']]
    for sl in liste:
        for u in sl:
            print str(u),
        print
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1 2 366 4
    53 6 7 8
    a bbhh c d


    Il faut alors complexifier le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    liste=[[1,2,366,4],[5378659.04,6,7,8],['a','bonjour','c','d']]
    lmax = max([len(str(u)) for sl in liste for u in sl])
    for sl in liste:
        for y in sl:
            print str(y).rjust(lmax),
        print
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
             1          2        366          4
    5378659.04          6          7          8
             a    bonjour          c          d


    On pourrait encore affiner pour justifier (rjust) les éléments affichés en fonction de la longueur max dans leur colonne.






    Mais soit dit en passant, je ne trouve pas trés astucieux de faire afficher a pour ’a’, parce que quand il s’agira de ’2’ il s’affichera 2 sans signalement que dans la liste c’est en réalité une string.

    Il vaudrait mieux afficher les strings avec leurs ’ ’ à mon avis.

    Suffit de remplacer str() par repr()
    puisque print str(’34’) affiche 34 ,
    mais print repr(’34’) affiche ’34’



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    liste=[[1,2,366,4],[5378659.04,6,7,8],['a','bonjour','c','d']]
    lmax = max([len(repr(u)) for sl in liste for u in sl])
    for sl in liste:
        for y in sl:
            print repr(y).rjust(lmax),
        print
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
             1          2        366          4
    5378659.04          6          7          8
           'a'  'bonjour'        'c'        'd'


    -–-----------
    Si ton objectif est de récupérer les éléments des sous-listes dans des variables pour les manipuler, ce n’est pas vraiment un problème:

    for sl in liste: , les éléments de sl sont sl[0],sl[1],sl[2]......

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Par défaut
    Désolé, je me suis mal expliqué.
    En fait je souhaite bien évidemment intégrer cette fonction dans une code plus large.
    Par exemple, la liste principale est généré par une fonction GenerateListe(), et j'utilise ensuite les sortie de ma fonction Update() pour les stocker dans des variables:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     # on génere ici la liste contenant plusieurs sous liste
    liste=GenerateListe()  
     
    while (il reste des sous liste à parcourir) :
     
       # on récupere ici la sous-liste suivante, et on en attribue les éléments à var_1, le second à var_2 et le 3eme à var_3
       var_1,var2,var_3=Update(liste)   
     
        #on lance une fonction avec les variables
        toto(var_1,var_3,var_3)  
    #end while
    Seulement je voudrais une fonction assez générique pour qu'elle puisse fonctionner si j'ai un nombre quelconque de variable a sortir (4,5,6 etc...)

  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
    Python permet d'écrire des fonctions avec un nombre qcq d'arguments:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    liste=[[1,2,3,4],[5,6,7,8],['a','b','c','d']]
    def func (*args):
        print args
     
    for L in liste:
        func(L)
    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
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Je n’avais pas compris effectivement. Et je ne comprends toujours pas bien.


    1/ Dans ton premier message:

    Je voudrais pouvoir utiliser la fonction Update par exmple qui me sort les variables une par une.
    «variables une par une» : ça fait penser à un générateur (quoique je ne sois pas habitué à ces bêtes là).

    Mais «une par une» ça veut dire quoi ?

    Et puis Update(liste) et non Update(sous liste), je ne comprends pas bien



    2/ Si tu veux affecter les éléments d’une sous-liste à des variables, tu peux utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a,b,c = [23,’lutin’,908]
    print b
    et donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    liste=[[1,2,366,4],[53,6,7,8],['a','bbhh','c','d']]
    for sl in liste:
        a,b,c,d = sl
        print a,'   ',b,' d est',d
    Et au lieu de chercher la “généricité’au niveau de la fonction Update() , il faut la mettre dans l’écriture de la fonction tot() qui doit prendre en charge les variables débitées.

    Au lieu de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       var_1,var2,var_3=Update(liste)   
       toto(var_1,var_3,var_3)
    il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for sl in liste:
        resupdt = Update(sl)
        toto(resupdt)
    avec toto() apte à prendre resupdt comme argument.
    Non ?

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Par défaut
    Je suis d'accord avec Eyquem, tout ca manque de clarté. Primo, si tu veux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var_1,var_2,var_3,var_4=Update(liste)
    Mais, (grande feinte!) je ne connais pas à l'avance la taille de mes sous-listes
    pourquoi ne pas utiliser une liste?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sousliste=Update(liste)
    print sousliste[0]
    puis tu utilises sousliste[0] au lieu de var_1...

    Ensuite, Update(liste) ressemble a la fonction next() de l'iterateur. Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    liste=[[1,2,3,4],[5,6,7,8],['a','b','c','d']]    
    i=iter(liste)
    sousliste=i.next()
    print sousliste
     
    # ou bien, pour reprendre ta notation:
    update=i.next
    sousliste=update()
    print sousliste

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Par défaut
    Merci a tous!
    Désolé de ne pas avoir été super claire.
    Mais en même temps je doit répondre a des exigences qui me paraissent moi même étrange.

    Bon je digere les infos et je reviens vers vous si il me faut du complément.

    @ Fructidor:
    Pour la sortie sous forme de liste, je voulais éviter justement l'utilisation d'un
    souliste[0],sousliste[1].
    En effet, je dévellope une bibliotheque de fonctions qui doivent être les plus transparentes possible pour l'utilisateur. Or si lui il veut avoir accès a des variable "toto", je ne veux pas l'obliger à jongler avec des souslite[i].

    Bref, je vais regarder ca un peu plus en détail.

    Mais merci pour votre aide!!

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Par défaut
    Ok, je comprend beaucoup mieux l'interrogation de plusieurs d'entre vous!
    En effet, le python permet d'écrire ceci:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def toto(liste):
      return liste[o]
     
     
    #Main
    liste=[[1,2,3,4],[5,6,7,8],['a','b','c','d']]
    var_1,var_2,var_3,var_4 = toto(liste)
    Et Python affectera AUTOMATIQUEMENT
    liste[o][o] -> var_1
    liste[o][1] -> var_2
    liste[o][2] -> var_3
    liste[o][3] -> var_4

    En fait cette question n'avait pas vraiment lieux d'être

    Merci en tout cas

    Julien

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

Discussions similaires

  1. [Débutant] fonction avec plusieurs sorties
    Par clem3900 dans le forum MATLAB
    Réponses: 6
    Dernier message: 25/07/2012, 16h25
  2. Appliquer une fonction à plusieurs dossiers.
    Par MegaBigBoss dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 09/04/2008, 15h07
  3. Appeler une fonction plusieurs fois
    Par philippef dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 25/10/2007, 22h54
  4. Fonctions, entrée, sortie
    Par Bahan dans le forum C
    Réponses: 6
    Dernier message: 23/05/2006, 09h45
  5. Pb fonction à plusieurs paramètres
    Par domdobrazil dans le forum Access
    Réponses: 3
    Dernier message: 03/05/2006, 12h29

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