Непонятная работа for с else

with open('film_list.txt', 'r', encoding='utf-8') as f:
    lines = f.readlines()
    list_films = [line.rstrip('\n') for line in lines]


def movie_search():
    search = input('Введите название фильма/режисёра/год или x для выхода: ')
    for i in range(len(list_films)):
        if search.lower() in list_films[i].lower():
            film = list_films[i].split(", ")
            print(f'Фильм: {film[0]}')
            print(f'Режисcёр: {film[1]}')
            print(f'Страна: {film[2]}')
            print(f'Год: {film[3]}')
        elif search.lower() == 'x':
            print('Спасибо за работу')
            return
    else:
        print('Не нашел данных по этом вводу!')

    return movie_search()


movie_search()

Если цикл for не нашел в списке нужного фильма, он должен отработать else с print('Не нашел данных по этом вводу!'), но почему этот else срабатывает всегда когда находит фильм, вроде бы решение лёгкое, но никак не могу понять что не так :(


Ответы (4 шт):

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

Кодовый блок в else выполняется после завершения цикла for, то есть после того, как все элементы итерируемого элемента были исчерпаны.

Вот если у вас в цикле сработает break, тогда код в else не будет выполнен

→ Ссылка
Автор решения: Zhihar
for i in range(2):
    print('x')
else:
    print('z')

вывод x, x, z

касательно else:

Когда элементы исчерпаны (например, исчерпана последовательность, либо итератор возбудил исключение StopIteration) выполняется часть инструкции, идущая после else (если эта часть присутствует) и цикл завершается.

в вашем случае вы просто неправильно используете else

сделай проверку if, а не else

→ Ссылка
Автор решения: Krovorgen

Верный ответ

with open('film_list.txt', 'r', encoding='utf-8') as f:
    lines = f.readlines()
    list_films = [line.rstrip('\n') for line in lines]


def movie_search():
    search = input('Введите название фильма | режиссера | страну | год или x для выхода: ')
    flag = False
    for i in range(len(list_films)):
        if search.lower() in list_films[i].lower():
            film = list_films[i].split(", ")
            print(f'Фильм: {film[0]}')
            print(f'Режиссер: {film[1]}')
            print(f'Страна: {film[2]}')
            print(f'Год: {film[3]}')
            flag = True
        elif search.lower() == 'x':
            print('Спасибо за работу')
            return
    if flag:
        return movie_search()
    else:
        print('Не нашел данных по этом вводу!')
        return movie_search()


movie_search()
→ Ссылка
Автор решения: vp_arth

else цикла срабатывает всегда, когда цикл дошёл до конца(не встретив break или return)

Соответственно, когда вы нашли фильм, нужно завершить цикл с помощью break или return

→ Ссылка