Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Как работает оператор for в Python
Оператор for в Python — это один из самых мощных инструментов языка. Под капотом он работает с итераторами и генераторами, что делает его гибким и универсальным.
Основной механизм
Цикл for под капотом
Этот код:
for item in sequence:
print(item)
Эквивалентен:
iterator = iter(sequence) # Получаем итератор
while True:
try:
item = next(iterator) # Получаем следующий элемент
print(item)
except StopIteration:
break # Конец итерации
Два важных протокола
1. Итерируемый объект (Iterable)
Объект с методом __iter__(), который возвращает итератор:
class CountUp:
def __init__(self, max):
self.max = max
def __iter__(self):
# Возвращает новый итератор
return CountUpIterator(self.max)
class CountUpIterator:
def __init__(self, max):
self.current = 1
self.max = max
def __iter__(self):
return self # Итератор сам себя итерирует
def __next__(self):
if self.current <= self.max:
result = self.current
self.current += 1
return result
else:
raise StopIteration
counter = CountUp(3)
for num in counter:
print(num) # 1, 2, 3
2. Итератор (Iterator)
Объект с методами __iter__() и __next__():
class SimpleIterator:
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
result = self.data[self.index]
self.index += 1
return result
it = SimpleIterator([1, 2, 3])
for value in it:
print(value) # 1, 2, 3
Встроенные итерируемые объекты
Список
for item in [1, 2, 3]:
print(item)
# Python вызывает iter() на списке
it = iter([1, 2, 3])
print(next(it)) # 1
print(next(it)) # 2
Строка
for char in "hello":
print(char) # h, e, l, l, o
# Строка итерируется по символам
it = iter("hi")
print(next(it)) # 'h'
print(next(it)) # 'i'
Словарь
data = {"a": 1, "b": 2, "c": 3}
# По умолчанию итерирует по ключам
for key in data:
print(key) # a, b, c
# По ключам явно
for key in data.keys():
print(key)
# По значениям
for value in data.values():
print(value) # 1, 2, 3
# По парам
for key, value in data.items():
print(f"{key}: {value}")
Диапазон
for i in range(5):
print(i) # 0, 1, 2, 3, 4
# range — это объект-итератор
for i in range(2, 8, 2):
print(i) # 2, 4, 6
Генераторы
Мощный способ создания итераторов с помощью yield:
def count_up(max):
current = 1
while current <= max:
yield current # Возвращает значение и приостанавливает функцию
current += 1
for num in count_up(5):
print(num) # 1, 2, 3, 4, 5
# Генератор экономит память — вычисляет значения по требованию
def infinite_counter():
count = 0
while True:
yield count
count += 1
for num in infinite_counter():
if num > 5:
break
print(num)
Распаковка в цикле
pairs = [(1, 'a'), (2, 'b'), (3, 'c')]
# Распаковка кортежей
for num, letter in pairs:
print(f"{num}: {letter}")
# Распаковка списков
for a, b, c in [[1, 2, 3], [4, 5, 6]]:
print(a + b + c)
# С пропусками переменных
for i, _ in enumerate([10, 20, 30]):
print(i) # 0, 1, 2
Функции, работающие с итерациями
enumerate()
colors = ['red', 'green', 'blue']
for index, color in enumerate(colors):
print(f"{index}: {color}")
# 0: red
# 1: green
# 2: blue
# Начать нумерацию с 1
for index, color in enumerate(colors, start=1):
print(f"{index}: {color}")
zip()
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
for name, age in zip(names, ages):
print(f"{name} is {age}")
# Alice is 25
# Bob is 30
# Charlie is 35
map()
numbers = [1, 2, 3, 4]
for squared in map(lambda x: x**2, numbers):
print(squared) # 1, 4, 9, 16
filter()
numbers = [1, 2, 3, 4, 5, 6]
for even in filter(lambda x: x % 2 == 0, numbers):
print(even) # 2, 4, 6
Break и Continue
# break: выход из цикла
for i in range(10):
if i == 5:
break # Выход
print(i) # 0, 1, 2, 3, 4
# continue: перейти к следующей итерации
for i in range(5):
if i == 2:
continue # Пропустить
print(i) # 0, 1, 3, 4
# else: выполнится если цикл НЕ был прерван break
for i in range(3):
print(i)
else:
print("Цикл завершён нормально") # Выполнится
for i in range(10):
if i == 5:
break
else:
print("Не выполнится") # break прерывает else
Практические примеры
# Итерация по файлам
with open('data.txt') as f:
for line in f:
print(line.strip())
# Вложенные циклы
matrix = [[1, 2], [3, 4]]
for row in matrix:
for value in row:
print(value)
# List comprehension (краткий синтаксис)
squares = [x**2 for x in range(5)] # [0, 1, 4, 9, 16]
# Generator expression (экономит память)
large_squares = (x**2 for x in range(1000000))
for square in large_squares:
print(square)
Резюме
forработает с итерируемыми объектами через протоколы__iter__()и__next__()- Итератор — объект с методами
__iter__()и__next__() - Генераторы — удобный способ создания итераторов через
yield StopIteration— сигнал конца итерации- Используйте
enumerate(),zip(),map(),filter()для элегантного кода