Calculatrice en python
Résolu
Gravity
-
Phil_1857 Messages postés 1872 Date d'inscription Statut Membre Dernière intervention -
Phil_1857 Messages postés 1872 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je débute en python et je voudrais savoir si au niveau du code c'est propre ou si cela fait trop débutant ?
def operation(op,a,b): if choice == 1: op = a + b return(op) elif choice == 2: op = a - b return(op) elif choice == 3: op = a * b return(op) elif choice == 4: if b != 0: op = a / b return (op) print("Bienvenue dans la calculette !") first_num = int(input("Entrer votre premier nombre : ")) second_num = int(input("Entrer votre second nombre : ")) op = 0 print("Quelle opération voulez-vous faire ?") print("1 - Addition") print("2 - Soustraction") print("3 - Multiplication") print("4 - Division") choice = int(input("Entrer votre choix : ")) if choice < 4: print("Le résultat vaut",operation(op,first_num,second_num)) else: if second_num == 0: print("Division par 0 impossible") else: print("Le résultat vaut", operation(op, first_num, second_num))
A voir également:
- Calculatrice en python
- Citizen code python avis - Accueil - Outils
- Calculatrice gratuit - Télécharger - Calcul & Conversion
- Installation calculatrice - Télécharger - Calcul & Conversion
- Ma-calculatrice - Télécharger - Calcul & Conversion
- Calculatrice windows 7 - Télécharger - Calcul & Conversion
4 réponses
Bonjour,
Quelques recommandations :
- Dans l'absolu, tu pourrais directement utiliser la fonction eval, mais ça tue un peu l'exercice, donc ignorons cette remarque.
- Soigne l'indentation : idéalement, chaque niveau d'indentation doit faire un multiple de 4 espaces. Veille également à mettre une espace derrière chaque virgule. Toutes ces conventions font partie de la norme PEP-8.
- Comme souligné par yg_be (message #2), tu pourrais avoir un seul return op en fin de fonction. Par ailleurs, return n'est pas une fonction, donc il n'y a pas de raison d'entourer op par des parenthèses.
- Dans la fonction opération, il serait plus naturel de recevoir le caractère qui correspond à l'opération, quitte à changer l'entier saisi par l'utilisateur en amont de cette fonction. Note qu'en python, tu peux aussi directement passer une opération, ce qui permet de factoriser le code (voir ce lien).
- Le test sur choice n'est pas assez rigoureux, car il ne traite pas les valeurs négatives, flottantes, et non entières. Si la valeur saisie n'est pas transformable sous forme d'entier, le programme plante.
- Tu peux rattraper les divisions par 0 avec un try ... except.
- Les erreurs devraient être écrites sur la sortie d'erreur standard (sys.stderr)
- Plutôt que de faire pleins de print, tu peux n'en faire qu'un, mais bon c'est un détail, car le gain en performance est négligeable.
- Généralement un programme python commence par une ligne qui indique l'interpréteur à utiliser (shebang) et il est recommandé en python d'indiquer l'encodage (ce qui permet d'utiliser des chaînes accentuées sans problème dans le code, les commentaire, etc.
- Tu peux en python3 indiquer le type des arguments et de la type de retour pour améliorer la lisibilité de ton code. Idéalement, tu peux même les documenter avec une docstring.
- Quand une variable doit être initialisé par une valeur invalide, on utilise plutôt None en python.
Voici à quoi ça pourrait ressembler :
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import operator import sys def error(message: str): print(message, file=sys.stderr) def prompt_int(label: str) -> int: i = None while i is None: try: return int(input(label)) except ValueError: error("Saisie invalide") print("Bienvenue dans la calculette !") a = prompt_int("Entrer votre premier nombre : ") b = prompt_int("Entrer votre second nombre : ") print( "Quelle opération voulez-vous faire ?\n" "1 - Addition\n" "2 - Soustraction\n" "3 - Multiplication\n" "4 - Division\n" ) map_index_op = { 1: operator.add, 2: operator.sub, 3: operator.mul, 4: operator.truediv, } op = None while op is None: choice = prompt_int("Entrer votre choix : ") op = map_index_op.get(choice) if not op: error("Saisie invalide") else: try: print("Le résultat vaut", op(a, b)) except ZeroDivisionError as e: error("Division par 0 impossible") except Exception as e: error(e) break
Bonne chance
Bonjour,
Sur la logique de ton code on pourrait imaginer quelque chose de plus pratique :
- saisir un nombre
- saisir un opérateur (+,-,*,/) plutôt qu'un menu correspondant aux opérations possibles
- saisir un second nombre
- tu lances le calcul de l'opération
Et on pourrait continuer, tu affiches le résultat, et tu saisis un nouvel opérateur, si l'utilisateur répond rien, vide, c'est fini, s'il donne un opérateur valide, tu saisis un nouveau nombre et tu réalises l'opération, et tu boucles sur ce processus
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour,
tu peux retirer le return(op) de chaque if, et le mettre ensuite.
pour le test de la division par 0, tu peux faire une seul if.