Непонятная работа 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 шт):
Кодовый блок в else выполняется после завершения цикла for, то есть после того, как все элементы итерируемого элемента были исчерпаны.
Вот если у вас в цикле сработает break, тогда код в else не будет выполнен
for i in range(2):
print('x')
else:
print('z')
вывод x, x, z
касательно else:
Когда элементы исчерпаны (например, исчерпана последовательность, либо итератор возбудил исключение StopIteration) выполняется часть инструкции, идущая после else (если эта часть присутствует) и цикл завершается.
в вашем случае вы просто неправильно используете else
сделай проверку if, а не 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 для выхода: ')
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()
else цикла срабатывает всегда, когда цикл дошёл до конца(не встретив break или return)
Соответственно, когда вы нашли фильм, нужно завершить цикл с помощью break или return