Как использовать цикл for в Python

О чём эта статья
- Что делает цикл for и как он работает в Python
- Практические примеры: списки, строки, range, словари
- Управление потоком: else, break, continue
- Вложенные циклы и их подходящие случаи
- Когда for не подходит и альтернативы
- Шпаргалка, тесты приёмки и чек-листы для команд
Важно: все примеры используют чистый Python 3. Код можно запускать в интерпретаторе или в Jupyter.
Как работает for в Python
Цикл for в Python последовательно перебирает элементы и выполняет тело цикла для каждого элемента. Он подходит для итерируемых объектов: списков, кортежей, строк, словарей, множеств и любых объектов, реализующих протокол итератора.
Ключевая идея: вы указываете переменную приёма значения и контейнер, а Python автоматически берёт по одному элементу за итерацию.
Простая формула:
for item in iterable:
# использовать itemПример ментальной модели: представьте очередь людей и табличку «обслуживают по одному». for — это поочерёдный вызов следующего человека из очереди.
Синтаксис и простые примеры
Вывод каждого элемента списка:
items = ["shoe", "bag", "shirts", "lamp"]
for i in items:
print(i)Фильтрация элементов (например, содержащих букву “a”):
items = ["shoe", "bag", "shirts", "lamp"]
for i in items:
if "a" in i:
print(i)Цикл с else: else выполнится, когда цикл завершится без break
b = [2, 3, 5, 6]
for i in b:
print(i)
else:
print("Loop has ended")break прерывает цикл досрочно:
b = [2, 3, 5, 6]
for i in b:
if i > 3:
break
print(i)continue пропускает текущую итерацию:
b = [2, 3, 5, 6]
for i in b:
if i > 3:
continue
print(i)range, числа и строки
Перебор чисел от 1 до 100:
for x in range(1, 101):
print(x)Вывод всех нечётных чисел:
for x in range(1, 101):
if x % 2 == 1:
print(x)Таблица умножения на 2 (только нечётные):
for x in range(1, 101):
if x % 2 == 1:
print(x, "x", 2, "=", x * 2)Итерация по строке — перебор символов:
a = "How to use a for loop in Python"
for ch in a:
print(ch)Подсчёт символов и слов. Обратите внимание: метод count рассчитывает количество вхождений подстроки.
a = ["How to use a for loop in Python"]
for i in a:
print(i.count('')) # число позиций между символами; не рекомендуем для длины
# Корректный способ получить длину строки
for i in a:
print(len(i)) # длина в символах
# Подсчёт слов (простейший способ)
for i in a:
print(len(i.split()))Важно: использование i.count(‘’) для поиска длины — неочевидный приём. Предпочитайте len() для количества символов и split() для простого подсчёта слов.
Работа со словарями и массивами объектов
Пример: нужно найти и вывести имена больных овец (healthy == “No”):
array = [
{"name": "Sheep1", "healthy": "Yes"},
{"name": "Sheep3", "healthy": "No"},
{"name": "Sheep4", "healthy": "Yes"},
{"name": "Sheep5", "healthy": "Yes"},
{"name": "Sheep8", "healthy": "No"},
{"name": "Sheep7", "healthy": "No"},
{"name": "Sheep9", "healthy": "No"}
]
for sheep in array:
if sheep["healthy"] == "No":
print("Quarantine", sheep["name"])Примечание: защищайте доступ к ключам, если данные могут быть неполными (use .get).
for sheep in array:
if sheep.get("healthy") == "No":
print("Quarantine", sheep.get("name", "Unknown"))Вложенные циклы
Вложенные for удобны при работе со сложными структурами (матрицы, список списков, комбинирование наборов):
nested_list = [[1, 2, 4, 5], {"name": "Python", "method": "write"}]
for container in nested_list:
for i in container:
print(i)Внимание: если в контейнере словарь, итерация даёт ключи по умолчанию. Для доступа к значениям используйте .items().
d = {"name": "Python", "method": "write"}
for k, v in d.items():
print(k, v)Когда for не подходит — контрпримеры
- Не знаете количества итераций заранее и ожидаете события: лучше while. Например, ждать сигнала от внешней системы.
- Нужно параллельное выполнение на уровне CPU — обычный for не даёт автоматической параллелизации; используйте multiprocessing или concurrent.futures.
- Большие ленивые последовательности или бесконечные потоки: используйте генераторы и итераторы, чтобы не загружать память.
Пример: бесконечный ввод пользователя
# while удобнее для «пока не ввёл q»
while True:
cmd = input('> ')
if cmd == 'q':
breakАльтернативы и идиомы
- Списковые включения (list comprehensions): компактно и часто быстрее
squares = [x*x for x in range(10)]- Генераторы: экономят память для больших последовательностей
def gen_squares(n):
for x in range(n):
yield x*x- map / filter — функциональные альтернативы, иногда удобны для цепочек преобразований
evens = list(filter(lambda x: x % 2 == 0, range(10)))- itertools для комбинирования, оконных функций, каруселей
Шпаргалка: часто используемые шаблоны
- Перебор с индексом: enumerate
for idx, val in enumerate(items, start=0):
print(idx, val)- Одновременный перебор нескольких списков: zip
for a, b in zip(list1, list2):
print(a, b)- Развернуть словарь по ключам и значениям
for k, v in my_dict.items():
print(k, v)- Итерация в обратном порядке: reversed()
for x in reversed(range(10)):
print(x)Производительность и зрелость решения (heuristic)
- Малые коллекции: прямой for отлично подходит.
- Большие коллекции: рассмотрите генераторы или map/filter.
- Ограничения по памяти: избегайте создания временных больших списков.
- Параллельность: используйте библиотеки для параллелизма, если операции CPU-bound.
Критерии приёмки (тесты) — что проверить
- Для заданного списка функция возвращает все элементы в ожидаемом порядке.
- При использовании break функция корректно прекращает итерацию.
- При использовании continue значения, попавшие под условие, пропускаются.
- Для словаря .items() возвращают все пары ключ-значение.
- Для пустого списка код не выбрасывает исключений (безопасная обработка).
Пример unit-теста (pytest-псевдо):
def test_filter_contains_a():
items = ["shoe", "bag", "shirts", "lamp"]
result = [i for i in items if "a" in i]
assert result == ["bag", "shirts", "lamp"]Чек-листы по ролям
Разработчик:
- Проверил поведение на пустых и граничных данных.
- Не создаёт лишних списков для больших данных.
- Использует .get для доступа к полям словаря.
Код-ревьювер:
- Проверил, что цикл не даёт побочных эффектов вне ожиданий.
- Убедился, что названия переменных читабельны (не i, j в сложной логике).
- Проверил обработку исключений и неполных данных.
Администратор/интегратор:
- Проверил нагрузку и потребление памяти при больших наборах данных.
Примеры приёмочных тестов (текст)
- TestCase 1: вход [1,2,3], ожидается вывод 1,2,3. — PASS
- TestCase 2: break при x>2 — цикл должен напечатать 1,2 только. — PASS
- TestCase 3: словарь с отсутствующим ключом healthy — не должно падать.
Решения для отладки и rollback-план
- Логи: вставьте логирование при каждой ключевой итерации (лог уровня DEBUG).
- Rollback: если новая версия потребляет слишком много памяти, откатите до реализации с ленивой итерацией (yield).
Глоссарий (одно предложение на термин)
- Итерируемый объект: объект, по которому можно пройтись в цикле (список, строка и т.д.).
- Итератор: объект, который возвращает следующие элементы по запросу (реализует next).
- Генератор: функция, которая отдаёт значения по одному и запоминает состояние (yield).
- List comprehension: компактная запись для построения списков из итераций.
Примеры «когда это не работает» и как обходить
- Очень длинные списки: вместо [f(x) for x in big_list] используйте (f(x) for x in big_list) и обработку по одному элементу.
- Порядок не важен: если нужен любой порядок и важна скорость проверки вхождения, рассмотрите множества (set).
Резюме
Цикл for — основной инструмент перебора в Python. Он прост и выразителен. Знайте связанные инструменты: range, enumerate, zip, list comprehensions и генераторы. Выбирайте while, генераторы или библиотеки параллелизма там, где for неэффективен.
Важно: тестируйте поведение на пустых и граничных данных и избегайте создания больших временных коллекций, когда требуется экономия памяти.
Примечание: используйте понятные имена переменных и стандартные идиомы Python — это упростит сопровождение кода.
Похожие материалы
Исправить время Windows при dual‑boot с Linux
Понижение напряжения CPU в игровом ноутбуке
Сброс сетевых настроек Windows 11 — инструкция
Как снизить напряжение GPU: undervolt с MSI Afterburner