question en python (débutant)
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

question en python (débutant)



  1. #1
    JohannLiebert

    question en python (débutant)


    ------

    Bonjour,
    Je suis débutant en python, j'ai une petite question sur un endroit que je bloque. Dans le code suivant, je ne sais pas pourquoi le paramètre mapping dans la fonction compter_descendants_et_profond eur n'est pas considéré comme un dictionnaire alors que la fonction construire_mapping renvoie bien un dictionnaire. Je l'ai remarqué car le code me donne une erreur sur liste_enfants = mapping[nom]. Dans la variable nom je mets 'Nom1' et dans fichier je mets '[{"nom": "Nom1", "enfants": ["NomEnfant1", "NomEnfant2"]},{"nom": "Nom2", "enfants": ["NomEnfant3"]}]' .Pouvez-vous m'aider svp. Et dsl si le code et une peu long.
    Code:
    import ast
    
    def construire_mapping(personnes, fichier) :
        dico = {}
        for dictionnaire in fichier:
            if personnes in dictionnaire.values() :
                dico[personnes] = dictionnaire["enfants"]
                return dico
        return 'pas de personne en ce nom'
    
    def compter_descendants_et_profondeur(nom, mapping, cache_compte = 0) :
        liste_enfants = mapping[nom]
        cache_compte += len(liste_enfants)
    
        return cache_compte + compter_descendants_et_profondeur(mapping[nom][0], construire_mapping(mapping[nom][0], fichier), cache_compte)
    
    nom = input()
    
    fichier = ast.literal_eval(input())
    
    mapping = construire_mapping(nom, fichier)
    print(type(mapping ))
    print(compter_descendants_et_profondeur(nom, mapping))

    -----

  2. #2
    pm42

    Re : question en python (débutant)

    Ta fonction construire_mapping ne renvoie pas un dictionnaire. Elle peut mais elle peut également renvoyer la chaîne 'pas de personne en ce nom'.

    Comme tu ne vérifies pas après l'appel de construire_mapping, tu dois passer la dite chaine à compter_descendants_et_profond eur qui échoue logiquement.

    Il ne faut pas traiter les erreurs de cette façon en renvoyant des types différents.
    construire_mapping devrait toujours renvoyer un dictionnaire et dans le cas où il ne trouve rien :
    - renvoyer un dictionnaire vide
    - renvoyer None
    - lever une exception

    Le choix se fait suivant ce qui est le plus logique pour ceux qui l'appellent.
    Et il faut toujours vérifier les erreurs possibles quand on appelle une fonction qui peut en créer.

  3. #3
    JohannLiebert

    Re : question en python (débutant)

    Merci de votre réponse. J'ai remplacé 'pas de personne en ce nom' par None mais cela ne règle pas le problème. Pour le nom je mets toujours des nom qui existent pour vérifier si tout fonctionne or la même avec un nom qui existent, ca bloque. De plus après les deux input, j'ai mis 'print(type(mapping ))' et ca me dit bien que c'est un dict. Je vous ai mis un screenshot en pièce jointe de l'erreur.
    Images attachées Images attachées  

  4. #4
    pm42

    Re : question en python (débutant)

    Ligne 15, si nom n'est pas une clé de ton dictionnaire, mapping[nom] renvoie none et ton mapping[nom][0] échoue avec le message d'erreur indiqué.

    C'est la même erreur que plus haut :
    - tu commences par faire liste_enfants=mapping[nom]
    - tu ne vérifies pas si ce n'est pas vide
    - tu t'en sers ensuite sauf qu'en fait tu réécris mapping[nom] au lieu de réutiliser liste_enfants ce qui n'est pas la fin du monde mais pas optimal.
    Dernière modification par pm42 ; 30/10/2023 à 18h30.

  5. A voir en vidéo sur Futura
  6. #5
    pm42

    Re : question en python (débutant)

    Et puisque tu utilises un IDE, apparemment Pycharm, tu vas beaucoup progresser si tu utilises les breakpoints et le mode debug.

    Quand tu lances ton programme en debug avec le petite insecte au lieu de la flêche (ou en clic-droit), il s'arrête quand il y a une erreur et tu peux voir où tu es, quelles sont les valeurs des variables, remonter dans la fonction qui a appelé celle qui plante, là aussi voir les valeurs, etc.
    Et même taper des formules pour voir le résultat.

    Un breakpoint lui force un arrêt à un endroit. Là aussi, cela te permet de vérifier que ton programme fait bien ce que tu veux ou de trouver ce que tu as raté.

  7. #6
    JohannLiebert

    Re : question en python (débutant)

    Un grand merci à vous, j'ai vraiment été tête en l'air, ma fonction construite_mapping revoyait un str.

Discussions similaires

  1. Débutant en Python: la boucle For
    Par Jon83 dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 13/09/2022, 15h16
  2. debutant sur Python
    Par NonoFut dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 30/12/2016, 10h35
  3. Débutant en python à la recherche d'aide :)
    Par bibjuju dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 12/12/2015, 19h59
  4. Python (débutant)
    Par Meadowlark dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 06/12/2012, 13h28
  5. Python débutant
    Par Meadowlark dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 20/11/2012, 13h19