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

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Par défaut Gros problème avec fonction avec for et return en dehors de for mais qui renvoi le resultat à chaque iteration
    Oui bonjour, je suis sous Python 2.7 et j'ai un problème avec mon code le voici
    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
    def condict_reste(dn,dico_2,dico_2_i2v,dico_2_v2i,dico_2_p,maxp,r,lp):
        for pl in lp:
            pv=dico_2_p[pl]
            vp=dico_2_v2i[pv]
            if r<vp and maxp!=pl:
                None
            elif r<vp and maxp==pl:
                dn, dico_2, dico_2_i2v, dico_2_v2i, vn=condict_dict(r,dn,dico_2,dico_2_i2v,dico_2_v2i,str(r))
            elif r>=vp and maxp!=pl:
                n=r/vp
                n2=n*vp
                nr=r%vp
                if n==1:
                    vn='v'+str(pv)
                else:
                    if n<=vp<dico_2_v2i[dico_2_p[maxp]]:
                        dn, dico_2, dico_2_i2v, dico_2_v2i, vn=condict_dict(n,dn,dico_2,dico_2_i2v,dico_2_v2i,str(n))
                    elif n>vp>=dico_2_v2i[dico_2_p[maxp]]:
                        dn, dico_2, dico_2_i2v, dico_2_v2i, vn=condict_reste(dn,dico_2,dico_2_i2v,dico_2_v2i,dico_2_p,maxp,n,lp)
                    dn, dico_2, dico_2_i2v, dico_2_v2i, vn=condict_dict(n2,dn,dico_2,dico_2_i2v,dico_2_v2i,vn+'*v'+str(pv))
                if nr!=0:
                    dn, dico_2, dico_2_i2v, dico_2_v2i, vn=condict_reste(dn,dico_2,dico_2_i2v,dico_2_v2i,dico_2_p,maxp,nr,lp)
                    dn, dico_2, dico_2_i2v, dico_2_v2i, vn=condict_dict(r,dn,dico_2,dico_2_i2v,dico_2_v2i,vn+'+'+tr)
                break
        return dn, dico_2, dico_2_i2v, dico_2_v2i, vn
    qui return le résultat à chaque itération de la boucle for sans même attendre la fin de la boucle local, ce malgré que return ne sois pas imbriqué dans la boucle for, j'ai vérifié l'indexation et c'est bien la même 4 espace après le début de ligne pour arrivée à for et toujours 4 espace après le début de la ligne pour arrivée à return.

    Je ne comprend pas du tout ce qui ce passe, aidez moi, expliquer moi pourquoi il fait ça et comment y remédier pour de bon.

    Je remercie d'avance ceux qui voudrons bien n'aider parce que la je tourne totalement en rond depuis plusieurs heures voir même plus.

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2014
    Messages : 25
    Par défaut
    Bonjour

    Ce serait déjà bien si tu donnait des noms de variables un plus explicites et que tu nous indiquait leurs types et aussi le but de ta fonction ainsi que les autres fonctions auxquelles tu fais référence. Mais déjà il y a un break dans ta fonction, ne serait-il pas la cause de tout ceci ?????

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Par défaut
    Remoi, non pour le break j'ai déjà essayer sans et c'est vraiment pas ça qui ne vas pas et justement break c'est sur une partie qui justement dois avoir déjà un résultat de correct pour return sinon
    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
    def condict_reste(dn,dico_2,dico_2_i2v,dico_2_v2i,dico_2_p,maxp,r,lp):
        for pl in lp: # lit la boucle
            pv=dico_2_p[pl]
            vp=dico_2_v2i[pv]
            if r<vp and maxp!=pl: # si r est trop grand pour vp et que maxp!=pl (pl c'est un int et maxp aussi) je veut rien faire et passer à l'iteration suivante
                None
            # si non pas besoin
            elif r<vp and maxp==pl: # si malgré que toujours r trop grand pour vp mais maxp (maxp c'est toujours à la fin de la boucle) est ==pl alors faire ceci
                dn, dico_2, dico_2_i2v, dico_2_v2i, vn=condict_dict(r,dn,dico_2,dico_2_i2v,dico_2_v2i,str(r)) # condict_dict n'à pas besoin d'être montrer car il fonction correctement
            elif r>=vp and maxp!=pl: # si non si pas la fin de la boucle r assez grand (c'est à dire >=) pour vp faire ceci
                n=r/vp
                n2=n*vp
                nr=r%vp
                if n==1:
                    vn='v'+str(pv)
                else:
                    if n<=vp<dico_2_v2i[dico_2_p[maxp]]:
                        dn, dico_2, dico_2_i2v, dico_2_v2i, vn=condict_dict(n,dn,dico_2,dico_2_i2v,dico_2_v2i,str(n))
                    elif n>vp>=dico_2_v2i[dico_2_p[maxp]]:
                        dn, dico_2, dico_2_i2v, dico_2_v2i, vn=condict_reste(dn,dico_2,dico_2_i2v,dico_2_v2i,dico_2_p,maxp,n,lp) # faire appel recurvise à la fonction mais normalement pas de problème
                    dn, dico_2, dico_2_i2v, dico_2_v2i, vn=condict_dict(n2,dn,dico_2,dico_2_i2v,dico_2_v2i,vn+'*v'+str(pv))
                if nr!=0: # si reste encore alors appel encore de la function
                    dn, dico_2, dico_2_i2v, dico_2_v2i, vn=condict_reste(dn,dico_2,dico_2_i2v,dico_2_v2i,dico_2_p,maxp,nr,lp)
                    dn, dico_2, dico_2_i2v, dico_2_v2i, vn=condict_dict(r,dn,dico_2,dico_2_i2v,dico_2_v2i,vn+'+'+tr)
                break # comme boucle pas fini mais résultat correct fin de la boucle en local
        return dn, dico_2, dico_2_i2v, dico_2_v2i, vn
    pour info vn c'est str, dn du int et tout les autres variables de return sont dict si ça peut allez avec ça et sinon si faut vraiment plus comme condict_dict dite le moi et je le mettrais.

    Edit: il dois n'y avoir un seul return et ce une fois la boucle totalement fini à la demande avec break ou non parce dernier itération de la boucle et plus le choix mais la ce met pas le cas comme je l'ai dis plus haut, si recursion il y a alors 1 boucle suplémentaire est créer mais l'appel de la fonction reste pareil juste une sous boucle en plus qui dois faire la même chose et finir à son échelle local de la même manière et retourner le résultat pour la boucle local qui la appeler!

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

    Si vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            if r<vp and maxp!=pl:
                None
    avec l'intention de passer à l'itération suivante, il est préférable d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            if r<vp and maxp!=pl:
                continue
    Ca vous évite d'avoir à commenter ce que vous voulez faire...


    Citation Envoyé par MediaVistaIntel Voir le message
    Je ne comprend pas du tout ce qui ce passe, aidez moi, expliquer moi pourquoi il fait ça et comment y remédier pour de bon.
    Dans la pratique, il faut lancer le code sous un debogueur symbolique et mettre des points d'arrêts pour tester des hypothèques. Par exemple on peut dire que si le code sort à chaque itération, c'est que la liste est réduite à un élément - voire vide - ou que la condition r>=vp and maxp!=pl est vraie.
    Reste à placer les points d'arrêt pour voir si ces hypothèses sont vérifiées ou pas et en tester d'autres le cas échéant.

    Si vous ne connaissez pas le debogueur symbolique de votre IDE, vous pouvez utilisez "print", c'est plus primitif mais çà fonctionne très bien.

    De toutes façons, ce que çà fait dépend des paramètres reçus. Comme vous ne montrez qu'une fonction (sans le contexte) difficile d'en dire plus car impossible de reproduire/tester quoi que ce soit.

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

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Par défaut
    Merci à toi wiztricks j'ai fait des print et comme tu la dis c'est primitif mais çà fonctionne très bien, et en effet pour le r>=vp and maxp!=pl la partie maxp!=pl n'avais pas lieux d'être dans la condition principal N°3 c'est une erreur de ma pare mais on à parfois besoin d'un avis extérieur à sois pour y voir plus clair, et si j'ai pas mis tout le code projet en ensemble c'est que j'ai une idée que je veut pas con ne là pique! sinon mon problème est résolu et merci encore pour votre aide à tous les 2. Pour le code correct de cette session j'ai pas trop envie de le mettre non plus à cause de l'idée que j'ai peur con ne là pique voilà!

    MediaVistaIntel

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

Discussions similaires

  1. Problème de vitesse avec fonction lookup table
    Par Phelix2003 dans le forum MATLAB
    Réponses: 10
    Dernier message: 06/11/2008, 05h57
  2. Problème de fonction avec cellule vide
    Par Samjeux dans le forum Excel
    Réponses: 4
    Dernier message: 14/06/2007, 08h45
  3. Gros problèmes de CSS avec IE et Mozilla
    Par kevinf dans le forum Mise en page CSS
    Réponses: 15
    Dernier message: 24/05/2007, 11h03
  4. Gros problème d'export avec phpMyAdmin (.SQL bizarres)
    Par Meteorshadow dans le forum Outils
    Réponses: 3
    Dernier message: 27/08/2006, 04h44
  5. problème de permissions avec fonction copy()
    Par jeanfrancois dans le forum Langage
    Réponses: 5
    Dernier message: 30/03/2006, 15h37

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