Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Как работает цикл for в Python
Цикл for в Python — это не традиционный цикл с индексом, как в C, а итератор. Это одна из самых мощных и элегантных особенностей языка.
Базовый синтаксис
for item in iterable:
# выполнить действие с item
pass
Что происходит под капотом
Когда интерпретатор видит for item in iterable:, он выполняет примерно следующее:
# Шаг 1: Получить итератор из iterable
iterator = iter(iterable)
# Шаг 2: Бесконечный цикл (концептуально)
while True:
try:
# Шаг 3: Получить следующий элемент
item = next(iterator)
# Шаг 4: Выполнить тело цикла
# выполнить действие с item
except StopIteration:
# Шаг 5: Итератор исчерпан, выход из цикла
break
Это очень важно для понимания!
Итерируемые объекты (Iterable)
Итерируемый объект — это объект, который реализует метод __iter__(), возвращающий итератор.
# Примеры встроенных итерируемых объектов:
list_obj = [1, 2, 3] # список
str_obj = "abc" # строка
dict_obj = {"a": 1} # словарь (итерирует ключи)
set_obj = {1, 2, 3} # множество
range_obj = range(5) # диапазон
tuple_obj = (1, 2, 3) # кортеж
# Пользовательский итерируемый класс
class MyIterable:
def __init__(self, data):
self.data = data
def __iter__(self):
return MyIterator(self.data)
Итераторы (Iterator)
Итератор — это объект, который реализует два метода:
__iter__()— возвращает сам себя__next__()— возвращает следующий элемент или raises StopIteration
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.data):
raise StopIteration
value = self.data[self.index]
self.index += 1
return value
# Использование
my_iter = MyIterator([10, 20, 30])
print(next(my_iter)) # 10
print(next(my_iter)) # 20
print(next(my_iter)) # 30
print(next(my_iter)) # StopIteration ошибка
Примеры с циклом for
# Итерирование по списку
for num in [1, 2, 3]:
print(num) # 1, затем 2, затем 3
# Итерирование по строке (посимвольно)
for char in "abc":
print(char) # a, затем b, затем c
# Итерирование по диапазону
for i in range(3):
print(i) # 0, затем 1, затем 2
# Итерирование по словарю (ключи)
for key in {"a": 1, "b": 2}:
print(key) # a, затем b
# С распаковкой
for key, value in {"a": 1, "b": 2}.items():
print(f"{key}={value}") # a=1, затем b=2
# С индексом через enumerate
for i, item in enumerate(["x", "y", "z"]):
print(f"{i}: {item}") # 0: x, затем 1: y, затем 2: z
Генераторы (Generators)
Генератор — это ленивый итератор, который генерирует значения по требованию. Он использует ключевое слово yield:
def my_generator():
yield 1
yield 2
yield 3
# Генератор не выполняется до первого next()
gen = my_generator()
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
# Использование в цикле
for num in my_generator():
print(num) # 1, 2, 3
# Бесконечный генератор
def infinite_counter():
n = 0
while True:
yield n
n += 1
for num in infinite_counter():
if num > 2:
break
print(num) # 0, 1, 2
Выражения-генераторы (Generator Expressions)
Компактный синтаксис для создания генераторов:
# Генератор чисел в квадрате
squares = (x**2 for x in range(5))
print(next(squares)) # 0
print(next(squares)) # 1
# List comprehension (аналог)
squares_list = [x**2 for x in range(5)] # [0, 1, 4, 9, 16]
Производительность
Генераторы очень эффективны, когда нужна ленивая обработка:
# Список — загружает всё в памяти
all_numbers = [x for x in range(1_000_000)]
# Генератор — генерирует по требованию
gen = (x for x in range(1_000_000))
# Для work_with_number в цикле, генератор используетиет значительно меньше памяти
Контроль цикла
# break — выход из цикла
for num in range(10):
if num == 3:
break
print(num) # 0, 1, 2
# continue — пропуск итерации
for num in range(5):
if num == 2:
continue
print(num) # 0, 1, 3, 4
# else — выполняется, если цикл завершился нормально (без break)
for num in range(3):
if num == 5:
break
else:
print("Цикл завершился") # выведется
for num in range(3):
if num == 1:
break
else:
print("Цикл завершился") # не выведется
Итоговая схема
for item in iterable:
↓
iterable.__iter__() → iterator
↓
iterator.__next__() → item (повторяется пока не будет StopIteration)
↓
выполнить тело цикла с item
↓
проверить break/continue
↓
перейти к следующей итерации