Sujet : Re: Saisie de 2 nombres ...
De : ram (at) *nospam* zedat.fu-berlin.de (Stefan Ram)
Groupes : fr.comp.lang.pythonDate : 20. Oct 2024, 19:12:51
Autres entêtes
Organisation : Stefan Ram
Message-ID : <fonction-20241020191019@ram.dialup.fu-berlin.de>
References : 1 2 3
yves <
yves@free.invalid> a écrit ou cité :
Le Fri, 18 Oct 2024 19:42:23 +0200, Olivier Miakinen a écrit:
txt = input("Entrez vos 2 nombres :") n1, n2 =
list(map(int,txt.split(',')))
ou encore :
n1,n2 = [int(elt) for elt in input("Entrez vos 2 nombres : ").split(',')]
Mais il faut mieux être le seul utilisateur, ou alors avoir une grande
confiance en ses utilisateurs.
On peut aussi se faire une petite fonction qui renvoie un message
d'erreur en français à balancer à l'utilisateur
from typing import Union, Tuple
def analyser_chaine(s: str) -> Union[Tuple[int, int], str]:
"""
Analyse une chaîne selon la grammaire L définie par l'expression régulière "\d+,\d+".
Args:
s (str): La chaîne à analyser.
Returns:
Union[Tuple[int, int], str]: Un tuple contenant les deux nombres trouvés,
ou une chaîne d'erreur si la grammaire n'est pas respectée.
"""
if not s:
return "La chaîne ne peut pas être vide."
position: int = 0
premier_nombre: str = ""
deuxieme_nombre: str = ""
etat: int = 0
for caractere in s:
if etat == 0:
if caractere.isdigit():
premier_nombre += caractere
elif caractere == ',':
if not premier_nombre:
return f"Erreur à la position {position}: Nombre manquant avant la virgule."
etat = 1
else:
return f"Erreur à la position {position}: Caractère inattendu '{caractere}'."
elif etat == 1:
if caractere.isdigit():
deuxieme_nombre += caractere
else:
return f"Erreur à la position {position}: Caractère inattendu '{caractere}'."
position += 1
if etat == 0:
return "Erreur: Virgule manquante."
elif not deuxieme_nombre:
return f"Erreur à la position {position}: Nombre manquant après la virgule."
return int(premier_nombre), int(deuxieme_nombre)
print(analyser_chaine("123,456")) # Sortie: (123, 456)
print(analyser_chaine("0,789")) # Sortie: (0, 789)
print(analyser_chaine("123,")) # Sortie: "Erreur à la position 4: Nombre manquant après la virgule."
print(analyser_chaine("123")) # Sortie: "Erreur: Virgule manquante."
print(analyser_chaine(",456")) # Sortie: "Erreur à la position 0: Nombre manquant avant la virgule."
print(analyser_chaine("12a,456")) # Sortie: "Erreur à la position 2: Caractère inattendu 'a'."
print(analyser_chaine("")) # Lève une ValueError avec le message "La chaîne ne peut pas être vide."