Partage
  • Partager sur Facebook
  • Partager sur Twitter

'str' objet is not callable

    15 novembre 2018 à 10:19:56

    Salutations!

    J'ai un souci avec un petit programme python, je précise d'ors et déjà que je suis débutant, et je fais de petits exercices pour progresser doucement.

    Je sais également que plusieurs posts traitent de cette erreur, mais je n'y ai pas trouvé de réponse à ma problématique, c'est pourquoi je me tourne vers vous.

    Voici mon code:

    def ecrir():
        print("que voulez-vous écrir?")
        aTaper=input()
        for chaine in aTaper:
            for i in range (1,8):
                chaine(i)
            print ("\n", end='')

    Bon, j'ai compris le problème, il ne veut pas utiliser les lettres de la chaine entrée dans le "input" pour appeler la fonction correspondante (un peu plus haut dans mon code: Par exemple, si je met un A dans ma chaîne, je veux qu'il aille interroger la fonction "A()".)

    Comme je l'ai dit, je débute, mais je sèche complètement sur le problème et les autres postes sur ce sujet sont d'un niveau bien au delà du mien, si quelqu'un a une idée de ce que je fais mal, je le remercie d'avance!

    Bonne journée!

    • Partager sur Facebook
    • Partager sur Twitter
      15 novembre 2018 à 10:50:52

      ligne 6, chaine[i], les parenthèses sont utilisées pour appeler une fonction, hors pour accéder aux caractères par rapport à un index, on utilise le crochet.
      • Partager sur Facebook
      • Partager sur Twitter

      Bonne journée...

        15 novembre 2018 à 11:03:47

        Fredo54 a écrit:

        ligne 6, chaine[i], les parenthèses sont utilisées pour appeler une fonction, hors pour accéder aux caractères par rapport à un index, on utilise le crochet.


        Salut, Fredo! Déjà, merci pour ta réponse!

        En suite, pour le coup, je n'ai jamais été embêté avec les parenthèses/crochets sur le "i" qui rapporte à des int. (j'ai néanmoins essayé avec les crochets, cela ne fonctionne pas non plus, le message d'erreur reste le même...)

         J'ai plus l'impression ici que le problème vient de "chaine", qui rapporte à une chaine de caractères de type "str". On dirait qu'il refuse d'utiliser les caractères entrés pour appeler la fonction:

        Si je rentre "BONJOUR", il refuse de me faire "B(i)", puis "O(i)".......

        Alors que si j'entre manuellement "B(i)", puis "O(i)"......., cela fonctionne parfaitement.

        Merci d'avance!

        -
        Edité par Te-Tienne 15 novembre 2018 à 11:04:35

        • Partager sur Facebook
        • Partager sur Twitter
          15 novembre 2018 à 11:15:09

          Oui c'est normal, tu utilises un caractère et non une chaîne avec l'index.

          Par rapport à tes variables ça serait,

          for char in aTaper:
              print(char)
          
          # ou
          
          for i in range(1, 8):
              print(aTaper[i])



          • Partager sur Facebook
          • Partager sur Twitter

          Bonne journée...

            15 novembre 2018 à 11:33:53

            Fredo54 a écrit:

            [...] tu utilises un caractère et non une chaîne avec l'index.

            for i in range(1, 8):
                print(aTaper[i])




            Alors, justement, l'index... J'ai gardé cette formule-ci, mais j'ai droit à

            "IndexError: string index out of range"

            J'ai pas entré de limitations pour ma chaine de caractères, et je ne suis pas sur que cette erreur-ci vienne des fonctions que j'appelle... 

            • Partager sur Facebook
            • Partager sur Twitter
              15 novembre 2018 à 11:53:25

              L'erreur vient du fait que ta chaîne est trop courte par rapport à l'index demandé, tu dépasses la taille de la chaîne.
              • Partager sur Facebook
              • Partager sur Twitter

              Bonne journée...

                15 novembre 2018 à 12:00:39

                Fredo54 a écrit:

                L'erreur vient du fait que ta chaîne est trop courte par rapport à l'index demandé, tu dépasses la taille de la chaîne.


                "ma chaine est trop courte", tu parles de ma chaine "chaine", qui prend successivement les valeurs de "aTaper"?
                • Partager sur Facebook
                • Partager sur Twitter
                  15 novembre 2018 à 12:06:30

                  Tu as rentré une chaîne d'au moins 8 caractères ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 novembre 2018 à 12:14:18

                    En fait, mon "1-8" se rapporte aux 7 lignes (de & à 8non compris) de la fonction que j'appelle, c'est pour ça que je met mon "i" dans la fonction appelée...
                    En gros, l'exercice est de dessiner des lettres en étoiles, et en suite de se débrouiller pour les afficher les unes à côté des autres, donc j'ai dû découper les fonctions de mes lettres ligne par ligne pour que le "print" me les imprime les unes à côté des autres.
                    Et avec cette fonction, ça fonctionne:
                    def bonjour():
                        for i in range (1,8):
                            B(i)
                            O(i)
                            N(i)
                            J(i)
                            O(i)
                            U(i)
                            R(i)
                            print ("\n", end='')
                    j'ai le droit à un magnifique
                    >>> bonjour()
                                                       
                    ####   ###  #   # #####  ###  #   # ####  
                    #   # #   # ##  #    #  #   # #   # #   #
                    ####  #   # # # #    #  #   # #   # ####  
                    #   # #   # #  ## #  #  #   # #   # #  #  
                    ####   ###  #   #  ##    ###   ###  #   # 
                    (oui, sept lignes, une ligne vide, 5 lignes d'étoiles, et une autre ligne vide)
                    Mais du coup, je souhaiterais pouvoir imprimer n'importe quoi pourvu que je le tape...
                    Donc je doute que le problème vienne de mon "i"...

                    -
                    Edité par Te-Tienne 15 novembre 2018 à 12:18:42

                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 novembre 2018 à 16:45:07

                      Je propose quelque chose de ce genre :

                      # On suppose qu'il existe des fonctions A(), B(), C()... Z()
                      
                      def chfonction(c) : # retourne la fonction associée à un caractère c (majuscule)
                         if c == 'A' :
                            return A
                         elif c == 'B' :
                            return B
                         # etc.
                         # etc.
                         elif c == 'Z' :
                            return Z
                         else :
                            # à gérer
                       
                      # ... ... ...
                      # ... ... ...
                      # ... ... ...
                       
                      # Affichage de aTaper :
                      for i in range(1, 8) :
                         for c in aTaper.upper() :
                            affichelettre = chfonction(c)
                            affichelettre(i)
                         print("\n", end='')
                      

                      Je n'ai pas essayé, mais je sais qu'on peut retourner des fonctions.

                      ----------

                      Je pense à un truc : il faudrait créer un dictionnaire qui fasse les correspondances entre un caractère et une fonction, genre :

                      dict = {'A' : A, 'B' : B, 'C' : C, ... ... ... , 'Z' : Z}
                      

                      et alors on n'aurait pas besoin de la fonction 'chfonction', on ferait juste :

                         affichelettre = dict[c]

                      Là encore, je n'ai pas utilisé, mais ça m'a l'air d'une idée prometteuse.

                      -
                      Edité par robun 15 novembre 2018 à 17:14:26

                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 novembre 2018 à 17:09:58

                        Il faut pas faire une fonction par caractère dans un cas comme ça, il faut utiliser une structure de données comme un dictionnaire, avec éventuellement une liste ou un tuple qui contiendrait chaque ligne composant la lettre.

                        Ce sera beaucoup plus simple.

                        -
                        Edité par LoupSolitaire 15 novembre 2018 à 17:10:27

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Blond, bouclé, toujours le sourire aux lèvres...

                          15 novembre 2018 à 17:15:25

                          Ah, j'ai justement eu l'idée du dictionnaire pendant que tu tapais ton message !

                          (Je n'ai pas l'habitude du Python et de ses structures de données modernes, moi qui vient du Fortran et du C, mais ça rentre peu à peu...)

                          -
                          Edité par robun 15 novembre 2018 à 17:16:24

                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 novembre 2018 à 9:06:51

                            Okayy, je vais aller me renseigner là-dessus, comme je disais, je débute, j'y vais au fur et à mesure ^^

                            Mais ça veut dire qu'il n'est simplement pas possible d'appeler une fonction à la manière que j'essayais?

                            Je vous tiens au courant, et encore merci à tous pour vos réponses! ;)

                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 novembre 2018 à 16:59:13

                              C'est sans doute possible, mais on évite de faire ça parce que ça n'a pas tellement d'avantages, c'est moins sécurisé et le code est plus compliqué. Perso j'ai jamais eu besoin de faire ça.

                              En plus c'est pas logique dans le sens ou tu mets des données (la forme des caractères) dans une fonction, alors qu'une fonction, c'est fait pour y mettre du code. Les données doivent aller dans une structure de données.

                              Mais bon, ce genre de truc viendra avec la pratique et en suivant des bons cours. Malheureusement il y a trop peu de cours pour débutants qui abordent ces sujets, alors que c'est important.

                              J'ai googlé vite fait avant de poster, et c'est possible avec la fonction locals() qui renvoie un dictionnaire avec les fonctions et variables globales déclarées dans le module courant :

                              def foo():
                                  print("abcd")
                              
                              # pour appeler la fonction à partir de son nom sous forme de chaine de caractères
                              fonction = "foo"
                              locals()[fonction]()

                              Mais évidemment c'est pour l'exemple, il faut pas utiliser ça.

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Blond, bouclé, toujours le sourire aux lèvres...

                              'str' objet is not callable

                              × 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