Почему текст выводится даже когда условие не выполняется?

Я написал функцию 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 шт):

Автор решения: vlados155

Я столкнулся с данной проблемой при разработке одного проекта, хотел задать вопрос на 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...')
→ Ссылка
Автор решения: nomnoms12

Можно использовать и оператор in, но проверять вхождение строки в список:

if val in ['да', 'yes']:
    return True
→ Ссылка
Автор решения: Эникейщик

Можно еще просто поменять местами:

    if val == '':
        return False
    elif val in 'даyes': # и в данном случае логично использовать elif,
        return True
→ Ссылка
Автор решения: CrazyElf

Так, небольшая ремарка: пустое значение обычно проверяют в питоне так:

if not val:
    return False

Это просто единообразный стиль - так проверяют на пустую строку, пустой словарь и т.п.

И да, в данном случае лучше проверять это первым делом.

→ Ссылка