Entrer un calcul dans input

redetob -  
mamiemando Messages postés 34220 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

En python, je souhaite demander à l'utilisateur d'entrer une valeur pour a :

a = int(input("Enter a value for a: "))
print(a)


Là, si je rentre
6
, ça marche !

Mais si je rentre
3*2
, ça ne marche pas
Y a t il un moyen que la valeur affectée à a puisse être entrée sous la forme d'un calcul par l'utilisateur ?

Merci d'avance
A voir également:

3 réponses

yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 586
 
bonjour,
moi j'essaierais avec eval().
0
Phil_1857 Messages postés 1956 Statut Membre 168
 
Bonjour,

Et même, eval étant considéré comme dangereux pour des raisons de sécurité (l'utilisateur pourrait entrer un bout de code malveillant), on peut s'amuser à tester l'entrée avec les expressions régulières pour s'assurer que l'on entre bien une formule correcte

Ca n'est pas forcément obligé dans ton cas, mais ça peut faire un bon exercice ...

Par contre, pour entrer une formule de calcul, il faut supprimer le int() :

a = input("Enter a value for a: ")
0
mamiemando Messages postés 34220 Date d'inscription   Statut Modérateur Dernière intervention   7 896
 
Bonjour,

Phil a raison, qui dit
eval
dit prendre un minimum de précaution. Le point qu'il souligne est une faille classique dans les langages qui proposent ce genre de possibilité (python, php, shell).

Point culture

Cependant, attention. Une expression rationnelle ne permet pas de vérifier si une expression mathématique est bien parenthésée. Si l'on se réfère à la hiérarchie de Chomsky, le langage des expressions mathématiques est un langage algébrique (qui requiert à un automate à pile) et non d'un logiciel régulier (ce que gère les expressions régulières, qui reposent sur des automates déterministes).

Si on voulait vraiment faire les choses de manières très rigoureuses, la validation de l'expression devrait plutôt être réalisée avec l'algorithme de Shunting Yard, qui peut-être notamment utilisé pour analyser une expression algébrique, en particulière impliquant des parenthèse. Ceci dit, cet algorithme requiert quelques adaptations pour faire une bonne "tokenization", notamment gérer des nombres (composés de plusieurs chiffres) ou pour gérer les caractères "-" qui sont ambigus (soit l'opérateur unaire, soit l'opérateur binaire). Bref, c'est assez laborieux, mais la fonction
shunting_yard_compute
implémentée dans ce projet gère tout ceci.

Retour à ton problème

Donc, personnellement, je propose une approche beaucoup plus simple et plus lisible :
1) On contrôle que la chaîne saisie ne contient que des caractères pouvant être impliqué dans une expression algébrique : des espaces ou des opérations arithmétiques, des points.
2) comme l'expression n'est pas forcément bien . Ensuite un
try ... catch
permettra de rattraper les erreurs restantes.

#!/usr/bin/env python3

s = input("Entrer un calcul: ")
x = None
if set(s) <= set(" .+*/1234567890"):
    try:
        x = eval(s)
    except:
        pass

print(f"Résultat: {x}")
0