#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 вы проверяете ошибку значения после каждого ввода, но в способе 2 вы проверяете любую ошибку (в данном случае это, скорее всего, ошибка значения) после вашего фрагмента кода.
-
Способ1 проверяет ошибку после каждого ввода, а способ2 проверяет ошибку в целом. В python, если он выдает какую-либо ошибку, компилятор останавливается и выдает ошибку.
Предположим, из-за человеческой ошибки вы получите ошибку атрибута, way2 напечатает:
«Ошибка, пожалуйста, введите числовой ввод»
Но, way1 выдаст вам ошибку, и код перестанет работать, вам придется повторно запустить его.
-
Теперь давайте поговорим о сложности пространства и времени, оба кода имеют одинаковую сложность
-
ЕСЛИ кто-то еще хочет понять ваш код, в ситуации, когда с вами невозможно связаться, он / она легко поймет фрагмент way2, потому что он чище и его легко читать.
Ответ №2:
Основное различие между этими подходами заключается в том, есть ли у вас блок try-catch для всего кода или только один для проверки ошибок. Во-первых, первый разбивает проверку ошибок на несколько блоков, исключающих попытки, тогда как второй помещает весь блок кода в один блок, исключающий попытку. Во-вторых, первый пропускает вычислительную часть кода с помощью функций quit(), тогда как второй пропускает ее, помещая ее внутри блока try.
Я бы сказал, что второй подход чище и его легче читать. Во-первых, у вас есть только один блок, исключающий попытку, что уменьшает объем имеющегося у вас избыточного кода. Во-вторых, легче увидеть, что происходит, когда вы пропускаете код, имея все это в блоке try-except, а не завершая работу программы. Наконец, вторая часть кода просто короче и менее запутанна и для меня больше похожа на стандартную практику.
Ответ №3:
В инструкции first Try повторяется код. Есть две попытки и исключения, обрабатывающие каждый пользовательский ввод на предмет ошибок, тогда как во втором блоке кода есть только один. Не повторяйтесь (DRY) принцип гласит, что дублирование в логике должно быть устранено с помощью абстракции. Добавление дополнительного, ненужного кода в кодовую базу увеличивает объем работы, необходимый для расширения и поддержки программного обеспечения в будущем. Оператор second Try выглядит чище, его легче читать, и он является предпочтительным логическим методом.