Partage
  • Partager sur Facebook
  • Partager sur Twitter

Code qui refuse de s’exécuter + coneil

Sujet résolu
    7 octobre 2012 à 21:27:49

    Bonjour,
    Je suis en Terminale S spé info, où nous étudions le langage python.
    J'ai un souci de code pour un "programme" qui ne s’exécute pas correctement, j'aurai aussi besoin d'aide pour un bout de code (je prescise en dessous)
    Le principe de cet exercice est de demander à l'utilisateur la tâche qu'il souhaite exécuter (Nouveau contact, chercher un numero, afficher la liste, quitter)
    La fonction de recherche de numéro est manquante.

    l=[['alice','023133313'],['Bob','222222']]
    l2=[]
    
    def nouveau(nom,num):
        """ pour entrer un nouveau contact dans le carnet d'adresse"""
        l2.append(nom)
        l2.append(num)
        l.append(l2)
        
    def afficher():
        print(l)
        
    def cherche_nom(recherche): #Ici, je cherche dans la liste un nom, et le programme doit retourner le numéro --Ne fonctionne pas--
       for i in range (0,len.l):
            if recherche in li[i]:
                print l[i]
            else:
                print ("Cette personne n'est pas dans votre répertoire") # Bien sur, tout ceci ne marche pas
    
        
    
    def carnet():
        print("1 : entrer un nouveau contact \n2 : chercher un numéro \n3 : afficher la liste \n4 : quitter")
        choix=input("votre choix : ")
        if choix == 1:
            nom = raw_input("Nouveau contact : ")
            num = raw_input("Numéro de téléphone :")
            nouveau(nom,num)
            carnet()
        elif choix == 2:
            recherche = raw_input("nom de la personne ?")
            cherche_nom(recherche)#recherche
            carnet()
        elif choix == 3:
            afficher()
            carnet()
        elif choix == 4:
            print('au revoir ...')
        else :
            carnet()
    
    #quand le programme se lance il va lancer la fonction carnet
            
    carnet()
    


    Mon principal souci est que le programme ne se lance plus avec mon ordi (j'ai fait une bonne partie du programme, fonctionnel, sur un autre PC), J'ai aussi un problème dans ma fonction "def cherche_nom()", je ne sais pas comment rechercher dans une liste et retourner une information correspondante.

    Merci de votre aide !!
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      7 octobre 2012 à 22:11:02

      Il y a un problème avec la fonction nouveau : étant donné que la variable l2 est globale, à chaque appel de la fonction, elle va grandir.
      si on fait
      nouveau("A", "0")
      nouveau("B", "1")
      

      ça donne:
      l2 = ["A", "0", "B", "1"]
      l = [[['alice','023133313'],['Bob','222222'], ["A", "0", "B", "1"], ["A", "0", "B", "1"]]

      Il faut donc que l2 soit déclarée dans la fonction nouveau (ainsi ce sera une variable locale).

      Dans cherche_nom, il y a une référence à li, or li n'existe pas.
      len.l n'existe pas non plus, il faut faire len(l)
      ...
      Pour corriger un problème, il faut voir ce qui ne va pas en fonction du message de Python : soit c'est un erreur de syntaxe, soit c'est une autre erreur et alors le type de l'erreur ainsi que le numéro de ligne sont indiqués. Cherche toutes les erreurs et reviens poster si tu ne comprends pas une erreur.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        7 octobre 2012 à 23:22:53

        +1 pour tout ce que dis Gaber,

        Mais, je vois bien les namedtuple pour ce genre d'exercice.

        Citation

        def afficher():
            print(l)
        


        C'est inutile!

        Il faudrait revoir la fonction carnet() pas belle du tout.

        Si tu utilises raw_input() c'est que ta version python est la 2.x, il est donc inutile d'utiliser print comme une fonction. Tu peux donc virer les parenthèses.

        Si tu as que le nom et le numéro de téléphone, on peut faciliter la recherche en construisant un dictionnaire du style donnees = {"nom1": "telephone1", "nom2": "telephone2", ...}

        Attention au nombre de caractères qui ne doit pas dépasser 79 sur une ligne.
        La ligne 23 en a 20 de trop.

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          8 octobre 2012 à 16:49:53

          Citation : fred1599


          Si tu utilises raw_input() c'est que ta version python est la 2.x, il est donc inutile d'utiliser print comme une fonction. Tu peux donc virer les parenthèses.


          Je suis pas d'accord là-dessus : si print peut être utilisée comme fonction, alors autant l'utiliser, ça facilite un éventuel passage à python3.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            8 octobre 2012 à 17:21:09

            Citation

            Je suis pas d'accord là-dessus : si print peut être utilisée comme fonction, alors autant l'utiliser, ça facilite un éventuel passage à python3



            Les fonctions existaient en 2.x ;)

            Il n'y a rien qui justifie les parenthèses pour print en version 2.x

            Surtout qu'il n'y pas grand chose de plus au niveau adaptation 2.x to 3.x, mais ça ne reste pas la seule adaptation tout de même.

            • Partager sur Facebook
            • Partager sur Twitter
              8 octobre 2012 à 17:34:27

              C'est bon, merci, j'ai fini par trouver !
              l=[['alice','023133313'],['bob','222222']]
              
              def nouveau(nom,num):
                  """ pour entrer un nouveau contact dans le carnet d'adresse"""
                  l2=[]                         # On crée une liste intermédiaire qui contiendra le nom et le numéro
                  l2.append(nom)                # On ajoute le nom à la liste 2
                  l2.append(num)                # On ajoute le numéro à la liste 2
                  l.append(l2)                  # On ajoute la liste 2 à la liste 1
                  l.sort()                      # On range la liste par ordre aplphabétique (c'est plus pratique 
              def afficher():
                  print(l)
                  
              def cherche_nom(recherche):
              
                 for i in range (0,len(l)):
                  l3=l[i]                        # La liste intermédiaire sert à sélectionner le nom et le numéro
                  if l3[0] == recherche:         # On regarde si le premier terme (le nom) correspond à celui demandé
                      print (l3)                 # On affiche Le nom et le numéro
                  else:
                      continue                   # Sinon, on relance le programme
                  
                  
              
              def carnet():
                  print("1 : entrer un nouveau contact \n2 : chercher un numéro")
                  print ("3 : afficher la liste \n4 : quitter")
                  choix=input("votre choix : ")
                  if choix == "1":
                      nom = input("Nouveau contact : ")
                      num = input("Numéro de téléphone :")
                      nouveau(nom,num)
                      carnet()
                  elif choix == "2":
                      recherche = input("Nom de la personne ? ")
                      cherche_nom(recherche)#recherche
                      carnet()
                  elif choix == "3":
                      afficher()
                      carnet()
                  elif choix == "4":
                      print('Au revoir ...')
                  else :
                      carnet()
                      
              carnet()
              


              Je vous remercie de votre aide ;)Et je met en résolu
              PS : J'utilise Python 3.3, c'était une erreur de ma part
              • Partager sur Facebook
              • Partager sur Twitter

              Code qui refuse de s’exécuter + coneil

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown