améliorer ma simple calculatrice python
Je suis plutôt nouveau chez python et c'est mon tout premier projet que j'ai réalisé moi-même. Je me demande s'il y a de toute façon je peux améliorer ceci ou me donner des conseils pour l'améliorer. Merci
import sys
valid = ["+", "-", "*", "/"]
invalid = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
def start():
while True:
a = input("").lower()
for banned in a:
if banned in invalid:
print("error")
else:
sum1 = int(a)
cal = input("")
b = input("").lower()
for banned in b:
if banned in invalid:
print("Error")
start()
else:
sum2 = int(b)
break;
for list in cal:
if list in valid:
if list == "+":
total = sum1 + sum2
print("=" + total)
if list == "-":
total = sum1 - sum2
print(total)
start()
if list == "*":
total = sum1 * sum2
print(total)
start()
if list == "/":
total = sum1 / sum2
print(total)
start()
else:
print("Wrong Format")
start()
start()
Réponses
Quelques commentaires portaient moins sur les détails ligne par ligne et plus sur la façon de créer de meilleurs scripts de ligne de commande et sur la simplification de la logique.
Comment utiliser ce programme ? Vos input()appels ne me disent pas ce qui se passe. Aidez-moi, s'il vous plaît.
Les utilisateurs n'aiment pas les interactions fastidieuses avec les ordinateurs . Préférez-vous taper un nombre, appuyer sur Entrée, taper un opérateur, appuyer sur Entrée, taper un nombre, appuyer sur Entrée ... OU simplement entrer la sacrée équation? Par example:
reply = input('Enter equation: INT OP INT: ')
Les utilisateurs n'aiment vraiment pas les interactions fastidieuses avec les ordinateurs . À de rares exceptions près, les programmes de ligne de commande sensés n'utilisent pas input()du tout - ou du moins pas par défaut. Découvrez sys.argvet laissez vos utilisateurs exécuter votre calculatrice directement, sans les forcer à devenir les meilleurs amis avec leur ordinateur. Voici à quoi pourrait ressembler une utilisation en ligne de commande:
$ python simple-calculator.py 32 + 10
42
En savoir plus sur la gestion des exceptions . Plutôt que de vous enliser dans la création d'une structure de données contenant toutes les mauvaises entrées possibles (très difficile, surtout si vous considérez toutes les entrées UTF-8 imaginables), essayez simplement de faire ce que vous voulez faire - avec un filet de sécurité.
while True:
try:
# Each of these lines could fail. That's OK. Be optimistic!
s1, op, s2 = reply.split()
a = int(s1)
b = int(s2)
assert op in '+-*/'
break # Success.
except Exception as e:
# The safety net.
print('Invalid input')
Utilisez des structures de données pour simplifier la logique . Ne serait-il pas cool de se débarrasser d'une pile de if-elsechèques et de faire ce que vous voulez faire directement? Dans de telles situations, une structure de données peut souvent aider. Ce dont nous avons besoin, c'est d'un moyen de prendre un opérateur, puis de l'utiliser pour obtenir une fonction à 2 arguments qui effectuera les calculs dont nous avons besoin. En d'autres termes, nous avons besoin d'un mappage entre les opérateurs et les fonctions mathématiques correspondantes. Voici 3 façons d'y parvenir:
import operator
def add(a, b):
return a + b
ops = {
'+': add, # Define your own functions.
'-': lambda a, b: a - b, # Or lambdas.
'*': operator.mul, # Or get them from a library.
'/': operator.truediv,
}
# With that data structure, our code would reduce to this.
answer = ops[op](a, b) # Wrap in try-except to catch divide by 0.
print(answer)
Suggestion 1
Votre liste de caractères invalides et de inchèques fonctionnera aussi bien qu'une chaîne, mais sera plus courte et plus lisible.
invalid = 'abcdefghijklmnopqrstuvwxyz'
Il en va de même pour le validtableau de caractères.
Suggestion 2
for banned in a:
bannedest un nom de variable très déroutant pour cette utilisation. Vous ne savez pas s'il est interdit tant que vous ne l'avez pas comparé à la invalidliste des personnages. Vous devriez plutôt utiliser characterou letterou un nom de base plus court comme cou x.
Suggestion 3
a = input("").lower()
aest également un mauvais nom ici car il ne nous dit pas ce que c'est. Nommez-le plutôt input1ou quelque chose de similaire, et bien sûr changez ben input2ou quelque chose d'autre qui est descriptif.
Suggestion 4
for list in cal:
listn'est pas seulement un nom mal choisi qui induit le lecteur en erreur, c'est aussi un mot-clé / une fonction en Python et ne doit pas être utilisé comme nom de variable dans aucune situation. Je suggère operatorun meilleur nom puisque vous prenez un opérateur pour votre calcul.
Suggestion 5
Vous appelez start()après chaque opération sauf +. Cela ressemble à une erreur. Pourquoi pas pour +?
Suggestion 6
total = sum1 * sum2
print(total)
Pour chaque opération, vous enregistrez le total dans une nouvelle variable, puis vous l'imprimez. Mais vous ne l'utilisez pas pour autre chose que l'impression, vous pouvez donc aussi bien imprimer le résultat directement sans le stocker dans une variable.
print(sum1 * sum2)