Почему текст выводится даже когда условие не выполняется?
Я написал функцию yes_no для проверки введённого значения, но при вводе пустой строки она возвращает значение True, и текст выводится. Как исправить ошибку?
def yes_no():
while True:
val = input().strip().lower()
if val in 'даyes':
return True
if val == '':
return False
else:
print('Введено некорректное значение. Введите "да", "yes", или оставьте поле ввода пустым.')
print('Если хотите увидеть текст, введите "да" или "yes", если хотите продолжить, оставьте поле ввода пустым.')
if yes_no():
print('qwerty...')
Ответы (4 шт):
Я столкнулся с данной проблемой при разработке одного проекта, хотел задать вопрос на StackOverflow, однако после детального изучения кода решил проблему сам. Тем не менее посчитал нужным выложить его вместе с ответом, возможно, кому-нибудь пригодится.
А проблема в том, что строка, не содержащая ни одного символа, является подстрокой любой строки. И строка 'даyes' не исключение. Функция, как мы знаем, прерывается после возврата значения. Можно использовать логический оператор or, чтобы решить проблему:
def yes_no():
while True:
val = input().strip().lower()
if val == 'да' or val == 'yes':
return True
if val == '':
return False
else:
print('Введено некорректное значение. Введите "да", "yes", или оставьте поле ввода пустым.')
print('Если хотите увидеть текст, введите "да" или "yes", если хотите продолжить, оставьте поле ввода пустым.')
if yes_no():
print('qwerty...')
Можно использовать и оператор in, но проверять вхождение строки в список:
if val in ['да', 'yes']:
return True
Можно еще просто поменять местами:
if val == '':
return False
elif val in 'даyes': # и в данном случае логично использовать elif,
return True
Так, небольшая ремарка: пустое значение обычно проверяют в питоне так:
if not val:
return False
Это просто единообразный стиль - так проверяют на пустую строку, пустой словарь и т.п.
И да, в данном случае лучше проверять это первым делом.