mejorando mi calculadora de Python simple
Soy bastante nuevo en Python y este es mi primer proyecto que hice yo mismo. Me pregunto si hay alguna forma en la que pueda mejorar esto o darme un consejo para hacerlo mejor. gracias
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()
Respuestas
Algunos comentarios se centraron menos en los detalles línea por línea y más en cómo crear mejores scripts de línea de comandos y en simplificar la lógica.
¿Cómo utilizo este programa ? Tus input()llamadas no me dicen qué está pasando. Ayuda por favor.
Los usuarios no disfrutan de las tediosas interacciones con las computadoras . ¿Prefieres escribir un número, presionar enter, escribir un operador, presionar enter, escribir un número, presionar enter ... O simplemente ingresar la maldita ecuación? Por ejemplo:
reply = input('Enter equation: INT OP INT: ')
Los usuarios realmente no disfrutan de las tediosas interacciones con las computadoras . Con raras excepciones, los programas de línea de comandos sensibles no se utilizan input()en absoluto, o al menos no de forma predeterminada. Conozca sys.argvy permita que sus usuarios ejecuten su calculadora directamente, sin obligarlos a convertirse en los mejores amigos de su computadora. Así es como podría verse el uso de una línea de comandos:
$ python simple-calculator.py 32 + 10
42
Obtenga más información sobre el manejo de excepciones . En lugar de atascarse en la creación de una estructura de datos que contenga todas las posibles entradas incorrectas (muy difícil, especialmente si considera todas las entradas UTF-8 concebibles), simplemente intente hacer lo que desea hacer, con una red de seguridad.
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')
Utilice estructuras de datos para simplificar la lógica . ¿No sería genial deshacerse de un montón de if-elsecheques y, en su lugar, hacer lo que quiere hacer directamente? En tales situaciones, una estructura de datos a menudo puede ayudar. Lo que necesitamos es una forma de tomar un operador y luego usarlo para obtener una función de 2 argumentos que realice las matemáticas que necesitamos. En otras palabras, necesitamos un mapeo entre los operadores y las funciones matemáticas correspondientes. Aquí hay 3 formas de lograrlo:
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)
Sugerencia 1
Su lista de caracteres y incontroles no válidos funcionará tan bien como una cadena, pero será más corta y más legible.
invalid = 'abcdefghijklmnopqrstuvwxyz'
Lo mismo se aplica a la validmatriz de caracteres.
Sugerencia 2
for banned in a:
bannedes un nombre de variable muy confuso para este uso. No sabes si está prohibido hasta que lo comparas con la invalidlista de personajes. Debería utilizar charactero lettero un nombre básico más corto como co x.
Sugerencia 3
a = input("").lower()
atambién es un nombre pobre aquí, ya que no nos dice cuál es. En lugar de eso, input1nómbrelo o algo similar y, por supuesto, cámbielo ba input2otra cosa que sea descriptiva.
Sugerencia 4
for list in cal:
listno es solo un nombre mal elegido que confunde al lector, también es una palabra clave / función en Python y no debe usarse como un nombre de variable en ninguna situación. Sugiero operatorun nombre mejor ya que está tomando un operador para su cálculo.
Sugerencia 5
Llamas start()después de cada operación excepto +. Parece un error. ¿Por qué no para +?
Sugerencia 6
total = sum1 * sum2
print(total)
Para cada operación, está guardando el total en una nueva variable y luego imprimiéndola. Pero no lo usa para nada más que imprimir, por lo que también puede imprimir el resultado directamente sin almacenarlo en una variable.
print(sum1 * sum2)