Calculatrice en python

Résolu/Fermé
Gravity - Modifié le 11 août 2022 à 14:37
Phil_1857 Messages postés 1766 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 17 septembre 2023 - 13 août 2022 à 17:42

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:

4 réponses

mamiemando Messages postés 32638 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 septembre 2023 7 656
Modifié le 11 août 2022 à 15:17

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

1
jee pee Messages postés 38357 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 20 septembre 2023 9 083
Modifié le 10 août 2022 à 18:40

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


0
jee pee Messages postés 38357 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 20 septembre 2023 9 083
10 août 2022 à 18:48

Accessoirement sur ton code, tu ne testes pas que la réponse sur le choix de l'opération est bien seulement 1,2,3,4

0
Gravity > jee pee Messages postés 38357 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 20 septembre 2023
10 août 2022 à 20:31

Je ne comprend pas ?

0
yg_be Messages postés 21789 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 septembre 2023 1 379
10 août 2022 à 18:45

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.

0

Merci de l’info avec le return(op) cependant je ne comprend  pas l’information que tu me dit à propos de la division par 0 ?

0
Phil_1857 Messages postés 1766 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 17 septembre 2023 169
13 août 2022 à 17:42

Bonjour,

Tu peux aussi faire ça en 2 lignes:

calcul = input('Entrer un calcul (ex: 3+2/5) : ')
print('{} = {}'.format(calcul, eval(calcul)))

En fait, un peu plus de 2 lignes car l'idéal serait de tester l'entrée avec une expression régulière (import re)

avant d'imprimer le résultat

0