Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Итерируемые объекты в Python: Полное руководство
Итерируемый объект — это объект, который может передавать элементы по одному в цикл или функцию, требующую итерации. Это фундаментальная концепция Python.
Определение и протокол
Что делает объект итерируемым?
Объект считается итерируемым, если он реализует метод __iter__(), который возвращает итератор — объект с методом __next__().
# Проверка, итерируемый ли объект
from collections.abc import Iterable
data = [1, 2, 3]
print(isinstance(data, Iterable)) # True
# Или через hasattr
print(hasattr(data, "__iter__")) # True
Цепочка выполнения
# Когда ты пишешь:
for item in collection:
print(item)
# Python делает:
iterator = collection.__iter__() # Получает итератор
while True:
try:
item = iterator.__next__() # Берёт следующий элемент
print(item)
except StopIteration:
break # Конец итерации
Встроенные итерируемые типы
1. Последовательности (sequences)
# list — список
for item in [1, 2, 3]:
print(item)
# tuple — кортеж
for item in (1, 2, 3):
print(item)
# str — строка (итерирует по символам!)
for char in "hello":
print(char) # h, e, l, l, o
# range — диапазон чисел
for i in range(5):
print(i) # 0, 1, 2, 3, 4
# bytes — байты
for byte in b"hello":
print(byte) # 104, 101, 108, 108, 111
# bytearray
for byte in bytearray(b"hello"):
print(byte)
2. Контейнеры (containers)
# dict — словарь (итерирует по ключам по умолчанию)
data = {"name": "John", "age": 30}
for key in data:
print(key) # name, age
# Итерация по значениям
for value in data.values():
print(value) # John, 30
# Итерация по парам
for key, value in data.items():
print(key, value) # name John, age 30
# set — множество
for item in {1, 2, 3}:
print(item) # 1, 2, 3 (порядок не гарантирован)
# frozenset — неизменяемое множество
for item in frozenset({1, 2, 3}):
print(item)
3. Файловые объекты
# Файл итерируется по строкам
with open("data.txt") as f:
for line in f:
print(line.strip()) # Каждая строка файла
# Это самый эффективный способ читать большие файлы
# Не загружает весь файл в память
4. Генераторы и генераторные выражения
# Генератор функция
def count_to_n(n):
for i in range(n):
yield i # Возвращает значение и сохраняет состояние
for num in count_to_n(5):
print(num) # 0, 1, 2, 3, 4
# Генераторное выражение (как list comprehension, но ленивое)
gen = (x**2 for x in range(5))
for value in gen:
print(value) # 0, 1, 4, 9, 16
# Отличие от list comprehension
list_comp = [x**2 for x in range(5)] # Создаёт весь список сразу
gen_exp = (x**2 for x in range(5)) # Создаёт элементы по требованию
Пользовательские итерируемые классы
Способ 1: С методом iter
class CountUp:
def __init__(self, max):
self.max = max
self.current = 0
def __iter__(self):
return self # Возвращает сам себя как итератор
def __next__(self):
if self.current < self.max:
self.current += 1
return self.current
else:
raise StopIteration # Сигнал конца итерации
for num in CountUp(3):
print(num) # 1, 2, 3
Способ 2: Отдельный итератор
class CountUp:
def __init__(self, max):
self.max = max
def __iter__(self):
return CountUpIterator(self.max) # Возвращает отдельный итератор
class CountUpIterator:
def __init__(self, max):
self.max = max
self.current = 0
def __iter__(self):
return self
def __next__(self):
if self.current < self.max:
self.current += 1
return self.current
raise StopIteration
for num in CountUp(3):
print(num) # 1, 2, 3
Способ 3: С помощью генератора (проще!)
class CountUp:
def __init__(self, max):
self.max = max
def __iter__(self):
for i in range(1, self.max + 1):
yield i # Автоматически становится итератором
for num in CountUp(3):
print(num) # 1, 2, 3
Функции, работающие с итерируемыми
# iter() — получить итератор
data = [1, 2, 3]
it = iter(data)
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3
# next(it) # Выкинет StopIteration
# enumerate() — индекс + значение
for idx, value in enumerate(["a", "b", "c"], start=1):
print(idx, value) # 1 a, 2 b, 3 c
# zip() — объединение итерируемых
for letter, number in zip(["a", "b", "c"], [1, 2, 3]):
print(letter, number) # a 1, b 2, c 3
# map() — применить функцию к каждому
for squared in map(lambda x: x**2, [1, 2, 3]):
print(squared) # 1, 4, 9
# filter() — отфильтровать
for even in filter(lambda x: x % 2 == 0, [1, 2, 3, 4, 5]):
print(even) # 2, 4
# reversed() — в обратном порядке
for item in reversed([1, 2, 3]):
print(item) # 3, 2, 1
# sorted() — отсортированный
for item in sorted([3, 1, 2]):
print(item) # 1, 2, 3
# any(), all() — проверки
if any(x > 5 for x in [1, 2, 10]):
print("Found element > 5")
Разница между итерируемым и итератором
# Итерируемый — объект с __iter__()
data = [1, 2, 3] # list итерируемый
print(hasattr(data, "__iter__")) # True
print(hasattr(data, "__next__")) # False — это НЕ итератор!
# Итератор — объект с __next__()
iterator = iter(data) # Получаем итератор
print(hasattr(iterator, "__iter__")) # True
print(hasattr(iterator, "__next__")) # True — это итератор!
# Итератор сам итерируемый!
for item in iterator:
print(item)
Ленивые вычисления (lazy evaluation)
# Список — все элементы сразу в памяти
big_list = [x**2 for x in range(1_000_000)] # Память: ~30 МБ
# Генератор — элементы по требованию
big_gen = (x**2 for x in range(1_000_000)) # Память: минимум
print(next(big_gen)) # 0
print(next(big_gen)) # 1
# itertools для ленивых вычислений
from itertools import count, islice
infinite_counter = count(0) # Бесконечный счётчик
first_five = islice(infinite_counter, 5)
for num in first_five:
print(num) # 0, 1, 2, 3, 4
Проверка итерируемости
from collections.abc import Iterable, Iterator
data = [1, 2, 3]
print(isinstance(data, Iterable)) # True
print(isinstance(data, Iterator)) # False
it = iter(data)
print(isinstance(it, Iterable)) # True
print(isinstance(it, Iterator)) # True
# Универсальная проверка
def is_iterable(obj):
try:
iter(obj)
return True
except TypeError:
return False
print(is_iterable([1, 2, 3])) # True
print(is_iterable(123)) # False
print(is_iterable("hello")) # True
Итоговая таблица
| Тип | Итерируемый? | Итератор? | Пример |
|---|---|---|---|
| list | ✅ | ❌ | [1, 2, 3] |
| tuple | ✅ | ❌ | (1, 2, 3) |
| dict | ✅ | ❌ | {"a": 1} |
| set | ✅ | ❌ | {1, 2, 3} |
| str | ✅ | ❌ | "hello" |
| range | ✅ | ❌ | range(5) |
| iter(list) | ✅ | ✅ | list_iterator |
| generator | ✅ | ✅ | yield функция |
| file | ✅ | ❌ | open() |
Понимание итерируемости — основа эффективного Python-кода.