Sabach
Вопрос, по большей части к py.user.next: насколько мой алгоритм близок к рекомендованной ранее модульности и что не так?
Надо вычисление формулы перенести ближе к циклу.
Алгоритм для решения задачи:
1. Вывести на экран информацию о программе.
2. Инициализировать переменные.
2.1. Вычислить результат выражения 4 * 100 - 54.
2.2. Сохранить результат вычисления выражения в переменной.
3. Принять ввод от пользователя.
3.1. Принять ввод в виде строки от пользователя.
3.2. Преобразовать ввод от пользователя из строки в число.
4. Сравнить числовой результат выражения с числовым пользовательским вводом.
5. Вывести результат сравнения на экран.
Sabach
Среди ответов других пользователей понравился своей компактностью такой
Он не столько компактный, сколько правильный по последовательности шагов. Где-то шаги склеены в один, но на начальных этапах их надо разделять, потому что в голове ты всегда раздельно думаешь, а склеивание шагов появляется только в коде и оно не всегда является правильным действием.
Но, хоть код у него и выглядит красиво, но он всё равно далеко не идеальный. Эта красота обманчива.
Вот он сделал так
user_answer = int(input("input your answer here: "))
А где гарантия, что ему введут число, а не буквы или точки? Он слил воедино раздельные вещи и потерял из-за этого возможность вставить проверку введённой строки, которая должна находиться между int( и input(. Он сам себя лишил этой возможности, добавив в код красоты.
Другое дело, если бы он записал вот так
user_answer = input("input your answer here: ")
user_answer_number = int(user_answer)
Вроде бы тоже можно буквы или точки ввести и всё упадёт (программа выдаст отказ = программа откажет).
Но тут можно вставить проверку между input и int.
Мы видим место, где нужна проверка, и мы просто
добавляем эту проверку
user_answer = input("input your answer here: ")
if not user_answer.isdigit():
print("Error: not a number")
sys.exit(1)
user_answer_number = int(user_answer)
То есть две строки, которые были до внесённого изменения в код, остались на своих местах и остались неизменными. Но при этом проверка появилась и не допустит теперь неправильного ввода от пользователя.
Код надо писать так, чтобы в него изменения возможно было только
добавлять. То есть если код написан так, что для его изменений необходимо его переделывать, то это некачественно оформленный код. Если переделываешь код, то вот тот код, который ты переделываешь, а не просто добавляешь к нему, написан некачественно. Он может правильно работать, он может быть красивейшим, но в деле он оказывается затратным при дальнейшей работе с ним.
Если же твой код анализировать, то у тебя в оператор try … except … else занесено всё, что не относится к этому оператору try … except … else .
В try у тебя должна происходит только проверка ввода, проверка его на ошибку, а у тебя в try занесено и сравнение, и вывод результата на экран, которые никакого отношения к этому try не имеют. Это нарушение модульности, нужно вынести сравнение и вывод результата за пределы try … except … else , чтобы внутри остался только ввод строки и преобразование её в число. А вообще там должно остаться только преобразование в число, потому что try только к этому относится. Но так как ты слил шаги ввода строки и преобразования строки в число воедино, то чтобы в try оставить только преобразование строки в число, тебе придётся код
переделывать, ты не можешь к этому коду просто
добавить что-то и получить нужный результат.
Так ещё и try есть не во всех языках программирования. И в питоне тоже try работает медленнее, чем if, поэтому его избегают довольно часто.
Так что полностью замени try на if у себя в программе. Волшебный оператор try или другой какой-нибудь в другой какой-нибудь ситуации тебе не поможет. Тебе помогут только собственные мозги. В собственных мозгах надо формировать правила, которые и будут впоследствии делать твоё мастерство в программировании.
Твой код после моих исправлений
>>> def f():
... print('Решите задачу:\n4 * 100 - 54 = ?')
... a = 4 * 100 - 54
... b = None
... while True:
... s = input('Введите Ваш ответ:\n')
... try:
... b = float(s)
... break
... except ValueError:
... print('Введите числовое значение!')
... if a == b:
... print('Поздравляю! Ответ правильный.')
... else:
... print('К сожалению, Вы ошиблись.')
... print('Правильный ответ:', a)
...
>>> f()
Решите задачу:
4 * 100 - 54 = ?
Введите Ваш ответ:
abc
Введите числовое значение!
Введите Ваш ответ:
def
Введите числовое значение!
Введите Ваш ответ:
12
К сожалению, Вы ошиблись.
Правильный ответ: 346
>>>
>>>
>>> f()
Решите задачу:
4 * 100 - 54 = ?
Введите Ваш ответ:
346
Поздравляю! Ответ правильный.
>>>