melhorando minha calculadora python simples

Sep 11 2020

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

3 FMc Sep 11 2020 at 05:48

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)
1 user985366 Sep 11 2020 at 00:55

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)