#python #validation #math #input #while-loop
#python #проверка #математика #ввод #во время цикла
Вопрос:
Я программирую версию игры countdown (из британского телешоу), и у меня возникла проблема при реализации правил для арифметического выражения, которое вводит игрок. У меня есть четыре правила, каждое из которых реализовано с помощью цикла while (т. Е.: Ввод должен быть выражением, а не просто числом, он может содержать только базовые математические вычисления ( — * /) и т.д.)
Это упрощенная форма того, что у меня есть:
while #rule 1 is not respected:
#ask for another input
#check again
while #rule 2 is not respected:
#ask for another input
#check again
while #rule 3 is not respected:
#ask for another input
#check again
while #rule 4 is not respected:
#ask for another input
#check again
Проблема с этим заключается в следующем: если игрок нарушает, скажем, правило 4 и при запросе другого ввода нарушает правило 2, второй ввод не проверяется (ни для правила 2, ни для любого из правил до правила 4). Как мне проверять все правила каждый раз, когда игрок вводит другой ввод?
Ответ №1:
Вы можете комбинировать четыре условия, используя любое из следующих:
not (.. and ... and ...)
;(not ...) or (not ...) or (not ...)
;any(not ...)
;not all(...)
.
Ниже я использовал not all(...)
:
def rule1(expr): # expression contains at least one operation
return any((op in expr) for op in ' -*/')
def rule2(expr): # expression contains only numbers and operations
return all(c in ' -*/0123456789 ' for c in expr)
def rule3(expr): # don't know the rules of Countdown but love 42
return ('42' in expr)
def rule4(expr): # addition is okay a little but not too much of it
return (expr.count(' ') < 7)
def input_expr():
expr = input('Enter your expression: ')
while not all(rule(expr) for rule in [rule1, rule2, rule3, rule4]):
expr = input('Expression was not okay. Enter again: ')
return expr
Ответ №2:
Исключения и try/except
блоки — хороший способ обработки подобных проверок на ошибки:
while True:
try:
expr = input("I can has an input? ")
assert "rule1" in expr, "Input needs to contain 'rule1'!"
assert len(expr) < 20, "Input must be less than 20 characters!"
assert len(expr.split) > 2, "Input must be at least 3 words!"
break # all done!
except AssertionError as e:
print(f"Bad input: {e}") # continue and try again