← Назад к вопросам

Какие объекты являются итерируемыми?

1.2 Junior🔥 151 комментариев
#Python Core

Комментарии (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"
rangerange(5)
iter(list)list_iterator
generatoryield функция
fileopen()

Понимание итерируемости — основа эффективного Python-кода.