Bonjour, je voudrais entrer une exception ValueError seulement si l'entier est un nombre mais je n'y arrive pas. Voici le bout de code en question :
try: choix_de_la_lettre = input("Quel sera votre choix de lettre n°{}: ".format(i)) test = str(choix_de_la_lettre) except ValueError: "Je peux vous garantir qu'il n'y a pas de chiffre dans les mots proposés." continue
Je pense que au final même quand je rentre un chiffre l'input le converti en "str" ce qui fait que mon test est vrai quoiqu'il arrive, si je tente test = int(choix_de_la_lettre) cela sera vrai également, idem pour float ... comment faire?
Pour vérifier que saisie ne comporte pas de nombre :
def contiens_nombre(saisie: str) -> bool:
return any([char.isdigit() for char in saisie])
# explications:
# on utilise str.isdigit
"e".isdigit() # = False
"8".isdigit() # = True
# on utilise les compréhensions de liste
saisie = "hey5u"
chars = [char.isdigit() for char in saisie]
# chars = [False, False, False, True, False]
# on utilise any qui renvoie True si au moins un élément de l’itérable que l’on lui passe en paramètre est True
À partir de ça tu devrais pouvoir te débrouiller.
Autre chose :
int("34") # ok
int("salut") # lève ValueError
Je ne sais pas si ça aide, car je ne suis pas sûr de comprendre le problème.
Je pense que au final même quand je rentre un chiffre l'input le converti en "str" ce qui fait que mon test est vrai quoiqu'il arrive
La fonction input ne converti rien, c'est justement pour ça que tu récupères une chaine de caractères. Au contraire quand tu veux récupérer un entier, il faut regarder si les caractères entrés par l'utilisateurs correspondent à un nombre ou pas.
Paulad a écrit:
si je tente test = int(choix_de_la_lettre) cela sera vrai également, idem pour float ... comment faire?
C'est pas un test que tu fais, c'est une conversion, ça ne renvoie pas de booléen. Si tu veux un test toutes les infos sont dans le post de digammaF.
Voici l'énoncé de mon problème formulé de manière littérale :
Dans le cadre du jeu du pendu, l'utilisateur est invité a rentrer une lettre. Si la lettre est un chiffre je voudrais afficher (lever une exception?) pour informer l'utilisateur qu'il n'y a pas de chiffres dans les mots proposés pour le jeu.
LoupSolitaire -> je suis conscient que ce n'est pas un test mais de cette manière, si la convertion n'était pas possible cela devrait lever une erreur non ? Et c'est la mon blocage c'est que je ne sais pas comment lever une erreur de cette façon.
Le truc c'est que je ne comprends pas tres bien la solution de digammaF vu les connaissances que j'ai acquis jusqu'ici. Je comprends le isdigit mais pas la définition de la fonction...
Pour le moment je suis au boulot et ne peut malheureusement faire des tests supplémentaires.
En tous cas je vous remercie d'avoir pris le temps de me repondre malgré un énoncé du probleme qui n'était effectivement pas tres clair.
choix = input('Lettre n°{}: '.format(i))
# On vérifie que choix existe et qu'il n'est pas un nombre.
if choix and not choix[0].isdigit():
# On ne prend que la première lettre de la saisie utilisateur.
lettre = choix[0]
else:
print('Entrée invalide')
Tu n'as besoin d'exercer un controle que sur la première lettre de la saisie puisque l'utilisateur entre les lettres une par une.
Donc tu dois vérifier que l'utilisateur a saisi quelque chose et que ce quelque chose commence par une lettre.
def entrer_lettre(question: str) -> str:
saisie = inout(question)
if len(saisie)!=1:
print(‘UNE lettre !’)
return entrer_lettre(question)
if saisie.isdigit():
print(‘Pas un nombre, une LETTRE !’)
return entrer_lettre(question)
return saisie # on est sûrs que saisie comporte une lettre et n’est pas un nombre. Ça pourrait être, par exemple ( ou €.
EDIT : Finalement le problème n'est pas résolu parce que mon test est dans une boucle while et avec un if la boucle continue son chemin hors je voudrais réinviter l'utilisateur à refaire son input avant que le tour de boucle s'effectue.
EDIT : Finalement le problème n'est pas résolu parce que mon test est dans une boucle while et avec un if la boucle continue son chemin hors je voudrais réinviter l'utilisateur à refaire son input avant que le tour de boucle s'effectue.
Voici la partie du code concerné :
i = 1
while i <= 8:
try:
choix_de_lettre = (input("Veuillez choisir la lettre n°{}".format(i)))
if choix_de_lettre.isdigit():
raise ValueError
except ValueError:
print("Il n'y a pas de nombre dans les mots utilisés")
i += 1
Ici, quand je tape un chiffre, à la lettre n°2, je souhaiterais que la boucle ne fasse pas un tour et réaffiche donc "Veuillez choisir la lettre n°2"
J'ai essayé vos méthodes mais le problème reste le même, la boucle fait quand même un tour..
Merci beaucoup j'ai enfin compris... Vieux motard que jamais !
Lever une exception si l'input est un nombre
× 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.
typage structurel ftw
Blond, bouclé, toujours le sourire aux lèvres...
typage structurel ftw
Blond, bouclé, toujours le sourire aux lèvres...