melhorando minha calculadora python simples
eu sou bastante novo em python e este é meu primeiro projeto que eu mesmo fiz. estou me perguntando se há alguma maneira de melhorar isso ou me dar conselhos sobre como fazer isso melhor. obrigada
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()
Respostas
Alguns comentários focaram menos em detalhes linha por linha e mais em como construir scripts de linha de comando melhores e em simplificar a lógica.
Como faço para usar este programa ? Suas input()ligações não me dizem o que está acontecendo. Ajuda por favor.
Os usuários não gostam de interações tediosas com computadores . Você prefere digitar um número, pressionar enter, digitar um operador, pressionar enter, digitar um número, pressionar enter ... OU apenas inserir a equação maldita? Por exemplo:
reply = input('Enter equation: INT OP INT: ')
Os usuários realmente não gostam de interações tediosas com computadores . Com raras exceções, os programas de linha de comando sensatos não usam input()nada - ou pelo menos não por padrão. Aprenda sobre sys.argve permita que seus usuários executem sua calculadora diretamente, sem forçá-los a se tornarem os melhores amigos de seus computadores. Esta é a aparência de um uso de linha de comando:
$ python simple-calculator.py 32 + 10
42
Aprenda sobre tratamento de exceções . Em vez de se atrapalhar na criação de uma estrutura de dados contendo todas as entradas incorretas possíveis (muito difícil, especialmente se você considerar todas as entradas UTF-8 concebíveis), apenas tente fazer o que deseja - com uma rede de segurança.
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')
Use estruturas de dados para simplificar a lógica . Não seria legal se livrar de uma pilha de if-elsecheques e, em vez disso, apenas fazer o que você deseja fazer diretamente? Em tais situações, uma estrutura de dados geralmente pode ajudar. O que precisamos é uma maneira de pegar um operador e usá-lo para obter uma função de 2 argumentos que fará a matemática de que precisamos. Em outras palavras, precisamos de um mapeamento entre os operadores e as funções matemáticas correspondentes. Aqui estão três maneiras de conseguir isso:
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)
Sugestão 1
Sua lista de caracteres e inverificações inválidos funcionará tão bem quanto uma string, mas será mais curta e mais legível.
invalid = 'abcdefghijklmnopqrstuvwxyz'
O mesmo se aplica à validmatriz de caracteres.
Sugestão 2
for banned in a:
bannedé um nome de variável muito confuso para este uso. Você não sabe se está banido até que você compare com a invalidlista de personagens. Você deve preferir usar characterou letterou um nome básico mais curto, como cou x.
Sugestão 3
a = input("").lower()
atambém é um nome ruim aqui, pois não nos diz o que é. Em vez disso, nomeie-o input1ou algo semelhante e, é claro, mude bpara input2ou algo mais descritivo.
Sugestão 4
for list in cal:
listnão é apenas um nome mal escolhido que engana o leitor, é também uma palavra-chave / função em Python e não deve ser usado como um nome de variável em qualquer situação. Eu sugiro operatorum nome melhor, já que você está contratando uma operadora para o seu cálculo.
Sugestão 5
Você está ligando start()após cada operação, exceto +. Isso parece um erro. Por que não +?
Sugestão 6
total = sum1 * sum2
print(total)
Para cada operação, você salva o total em uma nova variável e o imprime. Mas você não o usa para nada além de imprimir, então você também pode imprimir o resultado diretamente, sem armazená-lo em uma variável.
print(sum1 * sum2)