Какой из них был бы лучше для расчета оплаты сверхурочных?

#python #python-3.x

#python #python-3.x

Вопрос:

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

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

 Enter Hours: 20
Enter Rate : nine
Error, please enter numeric input

Enter Hours: forty
Error, please enter numeric input
  
 input_hours = input('Enter Hours: ')
try:
    hours = float(input_hours)              
except ValueError:
    print('Error, please enter numeric input')
    quit()
input_rate = input('Enter Rate: ')
try:
    rate = float(input_rate)                
except ValueError:
    print('Error, please enter numeric input')
    quit()
if hours < 40:
    pay = rate * hours                      
else:
    overtime = hours - 40                   
    pay = (rate * 40.0)   (1.5 * rate * overtime)
print(pay)
  

или

 try:
    hrs = input('Enter Hours: ')
    hr = float(hrs)
    rate = input('Enter Rate: ')
    rt = float(rate)
    if float(hr) <= 40:
        print(hr * rt)
    else:
        hrr = hr - 40
        rr = hrr * 1.5 * rt
        print(40 * rt   rr)
except:
    print('Error, please enter numeric input')
  

Комментарии:

1. Этот вопрос может лучше подойти для codereview.stackexchange.com .

Ответ №1:

Давайте назовем их way1 и way2 соответственно.

  1. В способе 1 вы проверяете ошибку значения после каждого ввода, но в способе 2 вы проверяете любую ошибку (в данном случае это, скорее всего, ошибка значения) после вашего фрагмента кода.

  2. Способ1 проверяет ошибку после каждого ввода, а способ2 проверяет ошибку в целом. В python, если он выдает какую-либо ошибку, компилятор останавливается и выдает ошибку.

Предположим, из-за человеческой ошибки вы получите ошибку атрибута, way2 напечатает:

«Ошибка, пожалуйста, введите числовой ввод»

Но, way1 выдаст вам ошибку, и код перестанет работать, вам придется повторно запустить его.

  1. Теперь давайте поговорим о сложности пространства и времени, оба кода имеют одинаковую сложность

  2. ЕСЛИ кто-то еще хочет понять ваш код, в ситуации, когда с вами невозможно связаться, он / она легко поймет фрагмент way2, потому что он чище и его легко читать.

Ответ №2:

Основное различие между этими подходами заключается в том, есть ли у вас блок try-catch для всего кода или только один для проверки ошибок. Во-первых, первый разбивает проверку ошибок на несколько блоков, исключающих попытки, тогда как второй помещает весь блок кода в один блок, исключающий попытку. Во-вторых, первый пропускает вычислительную часть кода с помощью функций quit(), тогда как второй пропускает ее, помещая ее внутри блока try.

Я бы сказал, что второй подход чище и его легче читать. Во-первых, у вас есть только один блок, исключающий попытку, что уменьшает объем имеющегося у вас избыточного кода. Во-вторых, легче увидеть, что происходит, когда вы пропускаете код, имея все это в блоке try-except, а не завершая работу программы. Наконец, вторая часть кода просто короче и менее запутанна и для меня больше похожа на стандартную практику.

Ответ №3:

В инструкции first Try повторяется код. Есть две попытки и исключения, обрабатывающие каждый пользовательский ввод на предмет ошибок, тогда как во втором блоке кода есть только один. Не повторяйтесь (DRY) принцип гласит, что дублирование в логике должно быть устранено с помощью абстракции. Добавление дополнительного, ненужного кода в кодовую базу увеличивает объем работы, необходимый для расширения и поддержки программного обеспечения в будущем. Оператор second Try выглядит чище, его легче читать, и он является предпочтительным логическим методом.