Цикл for в Python
Цикл for в Python перебирает элементы любой коллекции: списка, строки, словаря, файла. Здесь вы научитесь проходить по списку, генерировать последовательности чисел через range(), сочетать цикл с условиями и досрочно останавливать его оператором break.
Примеры проверены на Python 3.12 и 3.13. В новом разделе собраны приемы, которые делают циклы короче и надежнее: нумерация через enumerate(), параллельный обход через zip(), перебор словаря и блок else у цикла, который решает задачу поиска без лишних флагов и повторных сообщений.

Циклы являются неотъемлемой частью в любом языке программирования. Для чего нужны циклы? Представьте себе задачу в которой вам необходимо перебрать элементы в списке, определить какое то соответствие и вывести результат. Задача является простой, если у вас немного элементов, а что если у вас тысячу разных элементов? В данном случае, мы с вами можем организовать цикл, в котором будем перебирать элементы, проводить с каждым элементом нужные нам операции, и выводить результат, вся муторная работа будет выполнена за вас вашим скриптом. И так долой теорию, разберем принцип работы цикла на практике.
Представим себе, что у нас есть список, с именами животных.
animals = ['Кошка', 'Собака', 'Лошадь', 'Черепаха']
for animal in animals:
print("Привет " + animal)
Результат:
Привет Кошка
Привет Собака
Привет Лошадь
Привет Черепаха
Как видите у нас получилось в несколько строк реализовать перебор всех элементов внутри списка на автомате. То есть, вся логика в цикле for заключается в том, что мы перебираем значения внутри списка, словаря, кортежа или множества, проводим нужную операцию, и выводим результат. Для более четкого понимания, просмотрите анимацию, в которой довольно доступно, и просто показаны разные варианты цикла. Важно запомнить! После запуска цикла, не забывайте про отступы.

Функция range
В целом мы с вами разобрались с тем, как работает цикл for, вместе с ней довольно часто используется функция range. С помощью данной функции, мы можем генерировать числа, например:
print (list(range(10))) # Сгенерирует нам числа от 0 до 9(10 чисел)
Функция range(), позволяет нам генерировать числа не только в строгой последовательности, мы можем задать начало, конец, и шаг генерации, выглядит это так:
print(list(range(2,50, 4))) # от 2-х до 50 с шагом 4
Результат:
[2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46]
Если мы не задаем шаг, то в Python этот шаг по умолчанию равен 1. Так же мы можем конечно использовать данную функцию вместе с циклом for. Пример:
for i in range(20): # При каждой итерации цикла, в переменную i попадает сгенерированное числа от 0 до 19.
if i >= 10: # При каждой итерации сравнивание наше в i с нашим условием
print(i) # Если число находящееся в данной итерации соответствует нашему условию, отправляем его в печать
"""
То есть, при первом проходе цикла, переменная i равна 0, соответственно 0 не является большим или равным 10
поэтому он не печатается. При втором проходе цикла, i равен уже 1, но 1 тоже не подходит под наше условие, поэтому
его тоже пропускаем. Через некоторое время, цикл доходит например до 11ой итерации, и в этом проходе, наша переменная
уже равно 10 что подходит нашему условию, и соответственно мы его пропускаем дальше.
"""
Результат:
10
11
12
13
14
15
16
17
18
19
В цикле выше, мы свами рассмотрели сразу два момента, это использование функции range(), и условие if, думаю вам уже понятно, что внутри цикла мы можем создавать уже знакомые нам конструкции с условиями. Рассмотрим пример, в котором мы скомбинируем цикл for, список, и конструкцию if...else.
student_name = 'Тимур' # Имя студента
student_list = ['Саша','Таня','Настя','Тимур', 'Вадим'] # Список студентов
for student in student_list: # Перебираем список студентов, и на каждом проходе цикла поочередно заносим всех студентов в переменную student
if student == student_name: # если значение student == student_name
print(f' Студент {student_name} найден.') # Условие выполнено
break # Остановка цикла
else:
print(f' Студент {student_name} не найден.') # Результат, если условие не выполнено
Результат:
Студент Тимур найден.
Как вы уже могли заметить, мы использовали оператор break, данный оператор позволяет нам остановить цикл, если например выполнено условие нашего цикла. В данном примере, мы нашли нужного студента, и нам незачем продолжать его поиск, поэтому мы просто останавливаем цикл, выходим из него, и выводим результат.
Следующий урок: Цикл while
Приемы с for: enumerate, zip, словари и for-else
Раздел включает: поиск элемента с for-else, номер элемента через enumerate, параллельный обход через zip, перебор словаря, частые ошибки.
Поиск элемента с for-else
Блок else можно поставить на одном уровне с for. Он выполнится, только если цикл дошел до конца и не был прерван break. Это идеальный инструмент для поиска: сообщение об отсутствии выводится один раз, а не на каждом шаге.
student_name = "Тимур"
students = ["Саша", "Таня", "Настя", "Тимур", "Вадим"]
for student in students:
if student == student_name:
print(f"Студент {student_name} найден.")
break
else:
print(f"Студент {student_name} не найден.")
# -> Студент Тимур найден.
Для простой проверки наличия цикл вообще не нужен: if student_name in students:.
Номер элемента через enumerate
for num, animal in enumerate(["Кошка", "Собака"], start=1):
print(num, animal)
# -> 1 Кошка
# -> 2 Собака
Конструкция for i in range(len(items)) с обращением items[i] работает, но читается хуже и чаще приводит к ошибкам с индексами.
Параллельный обход через zip
names = ["Аня", "Борис"]
scores = [91, 78]
for name, score in zip(names, scores, strict=True):
print(f"{name}: {score}")
Параметр strict=True (Python 3.10 и новее) выбросит ValueError, если списки разной длины. Без него zip() молча остановится на самом коротком.
Перебор словаря
prices = {"хлеб": 55, "сыр": 390}
for product, price in prices.items():
print(product, price)
Обычный for key in prices перебирает только ключи, и для получения значения приходится писать prices[key]. Метод items() сразу отдает пары, values() только значения. Менять размер словаря во время обхода нельзя: добавление или удаление ключа внутри цикла вызовет RuntimeError. Если нужно удалить часть ключей, перебирайте копию списка ключей, for key in list(prices):, или соберите новый словарь генератором.
Частые ошибки
| Ошибка | Что происходит | Как правильно |
|---|---|---|
| Удаление из списка во время обхода | элементы пропускаются | items = [x for x in items if x > 0] |
range(1, 10) для чисел от 1 до 10 | 10 не входит | range(1, 11) |
| Изменение переменной цикла внутри тела | на следующем шаге значение перезапишется | используйте while или отдельную переменную |
else на уровне if вместо for | сообщение выводится на каждой итерации | выровняйте else по for |
Подробнее о нумерации читайте в статье enumerate python.
Частые вопросы
Короткие ответы на вопросы, которые чаще всего возникают по этой теме.
Как пройти по списку в обратном порядке?
Используйте for x in reversed(items): функция не копирует список. Для чисел подойдет range(10, 0, -1), он выдаст значения от 10 до 1.
Чем break отличается от continue?
break полностью завершает цикл, выполнение переходит к коду после него. continue пропускает остаток текущей итерации и сразу переходит к следующему элементу.
Можно ли использовать переменную цикла после его окончания?
Да, после цикла она хранит последнее значение. Но если коллекция была пустой, переменная не будет создана, и обращение к ней вызовет NameError, поэтому на это поведение лучше не полагаться.
Как выйти сразу из двух вложенных циклов?
break прерывает только внутренний цикл. Вынесите вложенные циклы в функцию и используйте return, это самый чистый способ. Альтернатива - флаг, который проверяется во внешнем цикле.