Простой калькулятор для начинающих

Что вы думаете об этом простом калькуляторе?

while True:
    print('Options:')
    print('Enter \'a\' to add two numbers')
    print('Enter \'s\' to subtract two numbers')
    print('Enter \'m\' to multiply two numbers')
    print('Enter \'d\' to divide two numbers')
    print('Enter \'q\' to quit the program')
    response=str(input(':')).lower()
    if response=='q':
        break
    elif response=='a':
        while True:
           try:
               num1=float(input('Enter a number:'))
               break
           except(TypeError,ValueError):
               print('*(Input Error) Enter valid number*')
               continue
        while True:
            try:
                num2=float(input('Enter another number:'))
                break
            except(TypeError,ValueError):
                print('*(Input Error) Enter valid number*')
                continue
        result=num1+num2
        print('The answer is '+str(result))
        print()
    elif response=='s':
        while True:
            try:
                num1=float(input('Enter a number:'))
                break
            except(TypeError,ValueError):
                print('*(Input Error) Enter valid number*')
                continue
        while True:
            try:
                num2=float(input('Enter another number:'))
                break
            except(TypeError,ValueError):
                print('*(Input Error) Enter valid number*')
                continue
        result=num1-num2
        print('The answer is '+str(result))
        print()
    elif response=='m':
        while True:
            try:
                num1=float(input('Enter a number:'))
                break
            except(TypeError,ValueError):
                print('*(Input Error) Enter valid number*')
                continue
        while True:
            try:
                num2=float(input('Enter another number:'))
                break
            except(TypeError,ValueError):
                print('*(Input Error) Enter valid number*')
                continue
        result=num1*num2
        print('The answer is '+str(result))
        print()
    elif response=='d':
        while True:
            try:
                num1=float(input('Enter a number:'))
                break
            except(TypeError,ValueError):
                print('*(Input Error) Enter valid number*')
                continue
        while True:
            try:
                num2=float(input('Enter another number:'))
                break
            except(TypeError,ValueError):
                print('*(Input Error) Enter valid number*')
                continue
        result=num1/num2
        print('The answer is '+str(result))
        print()
    else:
        print('*Unknown input*')
    continue
8 голосов | спросил DaveyH-cks 14 WedEurope/Moscow2016-12-14T00:08:35+03:00Europe/Moscow12bEurope/MoscowWed, 14 Dec 2016 00:08:35 +0300 2016, 00:08:35

1 ответ


12

Добро пожаловать в мир начинающих программистов на Python и программирование в целом! Python - отличный язык для изучения и начинайте с!

Позвольте мне дать вам несколько советов и указателей, надеясь, что вы сможете немного научиться у них.

Кроме того, позвольте мне заранее извиниться за эту массивную стену текста. В моем обзоре и анализе я, возможно, немного заблудился, но я хотел убедиться, что вы поймете мои изменения и некоторые из кода, который я добавил, в том случае, если вы не знакомы с функциональностью, которую я реализую и использую в пересмотренный и пересмотренный код.


Добавить пробел для читаемости и подчиняться правилам PEP8 для пробелов вокруг операторов присваивания и равенства

Python чрезвычайно основан на отступе. Это означает, что отступ обычно указывает блок кода, который должен выполняться под другим (например, ваши утверждения if и т. Д.).

Тем не менее, Python также выигрывает от добавления пробела в логических местах для удобства чтения. Я обычно определяю эти местоположения как между циклами и другими разделами кода, между функциональными операторами (сложение, вычитание и т. Д.) И выводами, между окончанием оператора if и началом его elif или else, после окончания всего if и т. Д.

Существует также правило для стиля кода Python, называемое PEP8 , который диктует пробелы вокруг операторов присваивания, операторов равенства (например, ==), а также арифметических операторов (+, -, *, / и другие), заявив, что вокруг них необходимо пространство.

Это ваш код с пробелами по моим рекомендациям и рекомендациям PEP8. Мои дальнейшие обзоры здесь будут использовать это в качестве базы.

while True:
    print('Options:')
    print('Enter \'a\' to add two numbers')
    print('Enter \'s\' to subtract two numbers')
    print('Enter \'m\' to multiply two numbers')
    print('Enter \'d\' to divide two numbers')
    print('Enter \'q\' to quit the program')

    response = str(input(':')).lower()

    if response == 'q':
        break

    elif response == 'a':
        while True:
            try:
                num1 = float(input('Enter a number:'))
                break
            except(TypeError, ValueError):
                print('*(Input Error) Enter valid number*')
                continue

        while True:
            try:
                num2 = float(input('Enter another number:'))
                break
            except(TypeError, ValueError):
                print('*(Input Error) Enter valid number*')
                continue

        result = num1 + num2

        print('The answer is ' + str(result))
        print()

    elif response == 's':
        while True:
            try:
                num1 = float(input('Enter a number:'))
                break
            except(TypeError, ValueError):
                print('*(Input Error) Enter valid number*')
                continue

        while True:
            try:
                num2 = float(input('Enter another number:'))
                break
            except(TypeError, ValueError):
                print('*(Input Error) Enter valid number*')
                continue

        result = num1 - num2

        print('The answer is ' + str(result))
        print()

    elif response == 'm':
        while True:
            try:
                num1 = float(input('Enter a number:'))
                break
            except(TypeError, ValueError):
                print('*(Input Error) Enter valid number*')
                continue

        while True:
            try:
                num2 = float(input('Enter another number:'))
                break
            except(TypeError, ValueError):
                print('*(Input Error) Enter valid number*')
                continue

        result = num1 * num2

        print('The answer is ' + str(result))
        print()

    elif response == 'd':
        while True:
            try:
                num1 = float(input('Enter a number:'))
                break
            except(TypeError, ValueError):
                print('*(Input Error) Enter valid number*')
                continue

        while True:
            try:
                num2 = float(input('Enter another number:'))
                break
            except(TypeError, ValueError):
                print('*(Input Error) Enter valid number*')
                continue

        result = num1 / num2

        print('The answer is ' + str(result))
        print()

    else:
        print('*Unknown input*')

    continue

Переместить ответы без ответа на отдельный блок if, чтобы мы могли выполнять некоторые задачи без повторения кода.

Одним из основных принципов программирования является то, что если вы делаете что-то, что требует, чтобы вы все время копировали и вставляли код, чтобы сделать то же самое, скорее всего, есть лучшая реализация.

В настоящее время вы делаете это в каждом отдельном блоке кода при каждой условной проверке для введенного ответа, за исключением отказов и недействительных ответов:

while True:
    try:
        num1 = float(input('Enter a number:'))
        break
    except(TypeError, ValueError):
        print('*(Input Error) Enter valid number*')
        continue

while True:
    try:
        num2 = float(input('Enter another number:'))
        break
    except(TypeError, ValueError):
        print('*(Input Error) Enter valid number*')
        continue

Мы можем легко переместить это за пределы блока if, если мы разделим a, s, m и d проверяет в другом месте, поэтому нам не нужно повторять весь код, который на самом деле сэкономит вам много строк кода. Это новый набор if /elif с проверкой ответа «quit», прежде чем мы даже начнем рассматривать другие ответы, и удаление предложения «else», которое у вас было там:

if response == 'q':
    break

while True:
    try:
        num1 = float(input('Enter a number:'))
        break
    except(TypeError, ValueError):
        print('*(Input Error) Enter valid number*')
        continue

while True:
    try:
        num2 = float(input('Enter another number:'))
        break
    except(TypeError, ValueError):
        print('*(Input Error) Enter valid number*')
        continue

if response == 'a':
    result = num1 + num2

elif response == 's':
    result = num1 - num2

elif response == 'm':
    result = num1 * num2

elif response == 'd':
    result = num1 / num2

Обратите внимание, что, когда я отбрасываю проверку «Неизвестный вход» (это выражение else), мы собираемся добавить он вернулся в другом месте кода в моей следующей рекомендации.


Переместите флажок «Недопустимый вход» во вторую вещь, отмеченную в if /elif для проверки «Выход»

Эта рекомендация основана на предыдущей рекомендации выше этой; он не должен быть реализован без предыдущей рекомендации, поскольку он основывается на предыдущей рекомендации

Вы заметите, что я удалил блок else, который обрабатывал «Неизвестный вход» в моей предыдущей рекомендации. Это потому, что мы можем реализовать его в лучшем месте,и ранее в коде, и обрабатывать вещи как «Проверить, является ли вход действительным до всего остального», что мы рассмотрим в этом разделе.

В принципе, нам не нужно вводить проверку «Invalid Input» внизу. Вместо этого мы можем проверить это в начале!

Это код, который будет делать это:

if response == 'q':
    break
elif response not in 'asmd':
    print('*Unknown input*')
    continue

Поскольку вы новичок, позвольте мне разбить здесь elif. В основном это говорит: «Является ли значение response, содержащимся в этой строке допустимых символов ответа?», А если это не так, то это будет напечатайте ошибку «Неизвестный вход» и перейдите к следующей итерации цикла - пропустите все остальные коды ниже.


Необязательный continue оператор в конце цикла

В исходном коде у вас есть оператор continue в конце кода под while. Это необязательно - когда конец кода в цикле будет достигнут, он автоматически перейдет к следующей итерации, и вам не понадобится continue.

Вы можете просто удалить этот оператор continue.


Неверная проверка длины ответа

Это сводит мои предыдущие рекомендации по изменению вашего кода if и elif для «Блокировать» и «Недействительный ответ» в их собственный блок в начале, а затем иметь отдельный if /elif только для проверки ответа.

Таким образом, в моих рекомендациях я не правильно проверяю длину предоставленного ответа. Это означает, что я могу ввести обрыв, где он указан как «неизвестный ввод». Итак, давайте сделаем это как часть проверок «Недействительный ввод», проверив, превышает ли длина ответа более одного, или если она не находится в «действительных ответах» 'мы определили. Код ниже делает это.

if response == 'q':
    break
elif len(response) > 1 or response not in 'asmd':
    print('*Unknown input*')
    continue

Сделать вывод и параметры Подскажите немного чище

Это больше или меньше для каждого программиста, но я считаю, что вывод и подсказки, которые вы используете, немного ... загромождены и труднее читать. Я также считаю, что ввод может быть лучше обработан с точки зрения предоставления пользователям приглашения.

Начнем сначала с подсказки параметров. Мы можем реорганизовать и пересмотреть их, чтобы сделать вывод немного приятнее, и возьмите опцию лучше, чем просто двоеточие и подсказку:

print('Enter \'a\' to add two numbers')
print('Enter \'s\' to subtract two numbers')
print('Enter \'m\' to multiply two numbers')
print('Enter \'d\' to divide two numbers')
print('Enter \'q\' to quit the program')

response = str(input('Select an option: ')).lower()

Обратите внимание, что мы избавились от этого первого элемента print("Options:"). Вы можете добавить его обратно, если хотите.

Далее, давайте поработаем над подсказками для двух чисел, с которыми работает, и вывода. Я думаю, что это выиграет от некоторых разрывов строк, чтобы отчасти «разделить» содержимое, чтобы сделать его более читаемым.

Я хотел бы представить вам последовательность экранированных символов: \n. В строке \n интерпретируется как разрыв строки, который генерирует пустую строку в обычаях, которые я использую здесь, когда на самом деле отображается пользователю.

Соответственно должны быть изменены следующие строки, чтобы сделать ваш вывод немного приятнее:

  • num1 = float(input('Enter a number:')) должен стать num1 = float(input('\nEnter a number: '))
  • num2 = float(input('Enter another number:')) должен стать num2 = float(input('\nEnter another number: '))
  • print('The answer is ' + str(result)) должен стать print('\nThe answer is ' + str(result) + '\n')
  • print() должен стать print('------------------\n').

Это приводит к выходу программы немного как это, затем (используя a, 1 и 1):

 Enter 'a' to add two numbers
Enter 's' to subtract two numbers
Enter 'm' to multiply two numbers
Enter 'd' to divide two numbers
Enter 'q' to quit the program
Select an option: a

Enter a number: 1

Enter another number: 1

The answer is 2.0

------------------

Enter 'a' to add two numbers
Enter 's' to subtract two numbers
Enter 'm' to multiply two numbers
Enter 'd' to divide two numbers
Enter 'q' to quit the program
Select an option: q

Избегайте экранирования', используя " вокруг строки, содержащие их

Это было первоначально указано в комментариях Dex'ter .

В ваших операторах печати, где вы распечатываете список доступных параметров для пользователя, вы можете избежать использования \', чтобы избежать ' s, используя кавычки вокруг всей строки вместо апострофов. Например:

print("Enter 'a' to add two numbers")
print("Enter 's' to subtract two numbers")
print("Enter 'm' to multiply two numbers")
print("Enter 'd' to divide two numbers")
print("Enter 'q' to quit the program")


Полный код, после рекомендаций

Это код, после того как все мои рекомендации сверху реализованы полностью:

while True:
    print("Enter 'a' to add two numbers")
    print("Enter 's' to subtract two numbers")
    print("Enter 'm' to multiply two numbers")
    print("Enter 'd' to divide two numbers")
    print("Enter 'q' to quit the program")

    response = str(input('Select an option: ')).lower()

    if response == 'q':
        break
    elif len(response) > 1 or response not in 'asmd':
        print('*Unknown input*\n')
        continue

    while True:
        try:
            num1 = float(input('\nEnter a number: '))
            break
        except(TypeError, ValueError):
            print('*(Input Error) Enter valid number*')
            continue

    while True:
        try:
            num2 = float(input('\nEnter another number: '))
            break
        except(TypeError, ValueError):
            print('*(Input Error) Enter valid number*')
            continue

    if response == 'a':
        result = num1 + num2

    elif response == 's':
        result = num1 - num2

    elif response == 'm':
        result = num1 * num2

    elif response == 'd':
        result = num1 / num2

    print('\nThe answer is ' + str(result) + '\n')
    print('------------------\n')
ответил Thomas Ward 14 WedEurope/Moscow2016-12-14T00:52:06+03:00Europe/Moscow12bEurope/MoscowWed, 14 Dec 2016 00:52:06 +0300 2016, 00:52:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132