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 :

Problème avec la boucle for


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 19
    Par défaut Problème avec la boucle for
    Bonjour à toutes et à tous qui venez m'aider, qui passez par là par hasard ou qui ont le même problème.

    Qui a l'aire simple pourtant.
    Je vous montre le script:


    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
    liste = {"a":0 , "b":0 , "c":0}
    a = 0
    b = 0
    c = 0
     
     
    for cle,valeur in liste.items():
     
                    print(" \n ")
                    print(" Combien pour ",cle," :")
                    valeur = input("")
                    if valeur == "":
                                    valeur = "0"
     
                    valeur = int(valeur)
     
                    print("La valeur de ",cle," est de ",valeur,".")
     
    print(liste)
    Voilà, c'est la même chose que je voudrait faire mais en plus simple.

    Maintenant, voilà le résultat, quelque soit la valeur que nous désirons associer aux clefs contenue dans le dictionnaire:

    Combien pour a :
    1
    La valeur de a est de 1 .


    Combien pour b :
    0
    La valeur de b est de 0 .


    Combien pour c :

    La valeur de c est de 0 .
    {'a': 0, 'b': 0, 'c': 0}

    Comme vous pouvez le voir, quand je met 1 à a, python dit que a vaut 1, quand je met 0 à b, python dit que b vaut 0, quand je met rien à c, python dit que ça vaut 0.
    Ok jusque là, tout cela est prévu dans le script.

    Mais voyez vous le problème?
    Non? Si?

    Je vous dis:
    quand la boucle est finie:
    LES VALEUR ASSOCIEES AUX CLEFS SONT COMME S'IL ELLES N'AVAIENT PAS ETE MODIFIEES!!
    Et je suis triste que ca marsse pas pôsque j'aurai besoin que python fasse ça...

    Pensez-vous pouvoir m'aider?

    Merci par avance.

    Vraiment merci.

    PS : je débute en python... Donc si vous me présentez des programmes complexes, ou qui induisent de s'y connaître vraiment dans le sujet, je vous prierai de bien vouloir me les expliquer.
    Marssi bôcou

  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,

    Si vous débutez, vous avez tout intérêt à jouer avec la console Python pour voir ce qu'il se passe. Si on y écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> a = 1
    >>> b = a
    >>> b
    1
    >>>
    Est-ce que "a" doit changer lorsqu'on assigne autre chose à "b"?

    Ok votre code peut vous sembler différent mais écrire for cle,valeur in liste.items():, c'est assigner des valeurs aux variables cle, valeur à chaque itération à partir du contenu du dictionnaire (plutôt qu'à partir du "a" de mon exemple) et assigner autre chose à "valeur" dans la boucle ne changera pas la valeur associée à liste[cle].

    PS : je débute en python... Donc si vous me présentez des programmes complexes, ou qui induisent de s'y connaître vraiment dans le sujet, je vous prierai de bien vouloir me les expliquer.
    Je me contenterai de vous suggérer d'ouvrir un tuto. Ils sont fait pour vous... et ils vous permettent d'avancer pas à pas dans la connaissance du langage Python.

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

  3. #3
    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

    Quand tu commences ta boucle for cle,valeur in liste.items(), tu crées deux variables "cle" et "valeur" qui récupèrent une copie des items de ta liste. Si ensuite tu modifies "cle" ou "valeur", ben tu ne fais que modifier ces deux copies sans affecter la liste d'origine.

    La seule façon de modifier le contenu de "liste", c'est de le dire clairement

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    liste = {"a":0 , "b":0 , "c":0}
     
    for k in liste.viewkeys():
    	print(" \n ")
    	print(" Combien pour %s:" % k)
    	valeur = input("")
     	try:
    		liste[k]=int(valeur)
    	except ValueError:
    		liste[k]=0
    # for
     
    print(liste)

    Concernant le try/except, c'est juste pour plus de robustesse. Toi tu te protèges de l'erreur en testant "vide/non vide". Or il y a beaucoup d'autres cas d'erreurs (comme celui qui entre "toto" par exemple). Alors qu'avec try/except c'est le contraire. On commence par essayer l'action voulue en considérant qu'elle réussira. Et si cette action ne réussit pas pour une raison X (ici notemment une "ValueError" signifiant que la fonction int() ne reçoit pas le bon paramètre), alors tu pars sur une action alternative. C'est la philosophie Python "mieux vaut demander pardon que permission"...
    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]

  4. #4
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 19
    Par défaut Toujours la même chose
    Bonjour, merci pour vos réponses.

    Je vais m'intéresser tout d'abord à celle de Sve@r.

    Je ne connait pas cette fonctionnnalité de la boucle for( le truc qui fait " for k in liste.viewkeys(): ")
    En effet, dans le cours que je suis, que je n'ai pas terminé parceque c'était un peu long et que ce que je savait me semblait suffire largement, je n'ai vu que la fonctionnalité que j'ai mise dans mon programme.
    Et donc, que fais celle-ci? Merci par avance pour la réponse.
    L'autre élément que je ne connaît pas, c'est le signe "%". En fait, si, je le connait pour l'histoire des modulos, mais est-ce le même principe ici? Je ne pense pas, pouvez-vous m'aider?
    Merci encore par avance.
    Sinon, je connaissais le reste, simplement, pour cette discussion, j'ai simplifié au maximum le programme pour pouvoir prendre le moins de place possible.
    Dans le programme que j'espère réussir à réaliser grâce à vous, il y a... beaucoup plus de ligne, et j'ai pensé à la sécurité.
    Mais merci quand même de me l'avoir rappelé.

    Maintenant, je passe à la réponse de wiztricks.
    Dont je viens de me rendre compte que je l'avais pas comprise mais que maintenant, c'est clair et que c'était bien le problème que j'avais. (je ne connais malheureusement pas de logiciel capable de traduire ce que je viens d'écrire.)
    Merci pour cette réponse.
    Comme je l'ai dit juste au dessus, je suis moi même un cours (du verbe "suivre") qui commençait à être long et assez peu clair, en fait.
    Et le programme que je compte réalisé ne nécessite pas de connaître toutes les ficelles du language python. C'est d'ailleurs le but que je recherche, faire un logicel sympa en sachant le moins de chose possible.
    Pour décomplexer un peu les informatophobes (une fois encore, pas de logiciel de traduction, désolé ).
    Voilà voilà, à bientôt!

  5. #5
    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 Palisthe Voir le message
    Je ne connait pas cette fonctionnnalité de la boucle for( le truc qui fait " for k in liste.viewkeys(): ")
    C'est pourtant la même chose que for cle,valeur in liste.items() de ton premier code !!!
    Un dictionnaire contient des clefs, et des valeurs
    On accède aux clefs en utilisant la méthode keys(), viewkeys() ou iterkeys() (les différences entre les 3 sont un peu complexes pour un débutant). Perso je préfère la viewkeys().
    De même on accède aux valeurs en utilisant la méthode values(), viewvalues() ou itervalues() (idem pour la différence).
    Et on accède aux couples clefs+valeurs en utilisant la méthode items(), viewitems() ou iteritems() (là encore pareil).

    Moi, pour ton souci, je n'ai besoin que des clefs. Donc viewkeys() (uniquement parce qu'il a ma préférence mais ici keys() ou même iterkeys() aurait aussi fonctionné).

    Citation Envoyé par Palisthe Voir le message
    L'autre élément que je ne connaît pas, c'est le signe "%". En fait, si, je le connait pour l'histoire des modulos, mais est-ce le même principe ici? Je ne pense pas, pouvez-vous m'aider?
    Ca permet de mettre en forme une chaine contenant des éléments non connus (variables, résultat de fonctions, etc) quand on écrit son print.
    On écrit d'abord la chaine voulue en indiquant via "%X" la position d'un élément variable ("X" à choisir entre "s" pour "string", "d" pour "décimal" et "f" pour "flottant"). Puis on place, après la chaine, soit l'élément variable s'il n'y en a qu'un seul, soit un tuple contenant tous les éléments s'il y en a plusieurs
    Exemple
    for i in range(10): print "i=%d" % i.
    for (i, x) in enumerate("azertyuiop"): print "lettre[%d] vaut %s" % (i, x).
    On peut même répéter plusieurs fois une valeur sans refaire le calcul qui la génère ex: print "On trouve le résultat ici %(res)d et aussi ici %(res)d" % {"res" : grosCalcul()} (tu noteras ici que ce n'est plus un tuple mais un dictionnaire que l'on place après "%").

    A noter que cette écriture devait à l'origine disparaitre au profit de "format()" (plus puissante mais moins usuelle) dans Python3 mais devant la demande des utilisateurs Python, les créateurs du langage l'ont maintenue.
    Mêmes exemples avec "format" (qui est disponible aussi dans Python2)
    for i in range(10): print "i={0}".format(i).
    for (i, x) in enumerate("azertyuiop"): print "lettre[{0}] vaut {1}".format(i, x).
    print "On trouve le résultat ici {0} et aussi ici {0}".format(grosCalcul()).

    Citation Envoyé par Palisthe Voir le message
    Comme je l'ai dit juste au dessus, je suis moi même un cours (du verbe "suivre") qui commençait à être long et assez peu clair, en fait.
    Le Swinnen (disponible en téléchargement) est un très bon tuto. Long aussi mais très clair...

    Citation Envoyé par Palisthe Voir le message
    C'est d'ailleurs le but que je recherche, faire un logicel sympa en sachant le moins de chose possible.
    Je ne pense pas que ce soit une bonne idée...
    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]

  6. #6
    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
    Citation Envoyé par Sve@r Voir le message
    On accède aux clefs en utilisant la méthode keys(), viewkeys() ou iterkeys() (les différences entre les 3 sont un peu complexes pour un débutant). Perso je préfère la viewkeys().
    De même on accède aux valeurs en utilisant la méthode values(), viewvalues() ou itervalues() (idem pour la différence).
    Et on accède aux couples clefs+valeurs en utilisant la méthode items(), viewitems() ou iteritems() (là encore pareil).
    for key in liste: fonctionne aussi (et est bien plus simple).
    .viewkeys() n'existe plus avec Python3.

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

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 19
    Par défaut encore toujours encore la même chose.
    Bonjour,

    J'ai trouvé une solution à mon problème, en grande partie grâce à vous.
    En fait, une fois que les valeurs étaient bien entrées, j'avais besoin de les écrire, de les marquer ou voilà. Je vous montrerai comment j'ai fait. La réponse, venue en grande partie grâce au hasard, m'a fait utiliser deux listes dans la boucle for plutôt qu'un seul dictionnaire.
    Et c'est génial, ça marche.
    Il faut plus de lignes, mais le résultat en vaut le coup, selon moi. Je vous affiche le programme, plus lisible que la fois précédente, je l'espère.

    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
    a = 0
    b = 0
    c = 0
    liste1 = [a, b, c]
    liste2 = ["a", "b", "c"]
    d = 0
    liste3 = {}
     
    for k1, k2 in zip(liste1, liste2):
     
                    print(" \n ")
                    print(" Combien pour ",k2," :")
                    k1 = input("")
                    if k1 == "":
                                    k1 = "0"
     
                    k1 = int(k1)
     
                    print("La valeur de ",k2," est de ",k1,".")
                    d += 1
                    liste3[k2] = k1
     
    print(liste3)
    Voilà. J’espère qu'il est lisible...

    Enfin voilà qui marche parfaitement et me permet malgré tout d'afficher la valeur que je viens de donner à a, b ou c sans avoir a faire je ne sais quelle manipe compliquée que je ne maîtrise pas encore en qualité de débutant en programmation.
    Ce que je voulais dire par "ligne qui affiche la valeur que je viens de donner à a, b ou c", c'est la ligne qui fait " print("La valeur de ",k2," est de ",k1,".")", et qui n'est pas affichable à mon niveau lorsque l'on a que les clés d'un dico ou juste une liste, étant donné qu'il y a deux éléments.

    Merci encore à tous(tes)!!!
    A bientôt!

    PS: l'affichage est correct?

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/11/2007, 15h25
  2. Réponses: 3
    Dernier message: 24/05/2007, 17h56
  3. problème avec une boucle For
    Par mademoizel dans le forum ASP
    Réponses: 3
    Dernier message: 24/03/2007, 13h20
  4. Réponses: 2
    Dernier message: 29/08/2006, 13h59
  5. Problème avec une boucle for
    Par cisse18 dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 29/03/2006, 16h50

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