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!
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.
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.
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='')
# 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 :
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
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.
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.
Bonne journée...
Bonne journée...
Bonne journée...
Blond, bouclé, toujours le sourire aux lèvres...
Blond, bouclé, toujours le sourire aux lèvres...