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

Что такое итерация?

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

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Что такое итерация в Python

Итерация — это процесс последовательного обхода элементов какого-либо набора данных (списка, строки, словаря и т.д.) по одному.

Базовое определение

# Простой пример итерации
for item in [1, 2, 3, 4, 5]:
    print(item)
# Выведет: 1, 2, 3, 4, 5 по одному

Каждый проход цикла — это одна итерация. Всего здесь 5 итераций.

Итерируемые объекты (Iterables)

Итерируемый объект — это что-то, по чему можно пройтись в цикле.

# Встроенные итерируемые типы
list_obj = [1, 2, 3]          # Список
str_obj = "hello"             # Строка
dict_obj = {"a": 1, "b": 2}  # Словарь (по ключам)
set_obj = {1, 2, 3}           # Множество
tuple_obj = (1, 2, 3)         # Кортеж
range_obj = range(5)          # Range объект

# Все они итерируемы
for item in list_obj:   pass
for char in str_obj:    pass
for key in dict_obj:    pass
for num in set_obj:     pass
for num in range_obj:   pass

Итераторы (Iterators)

Итератор — это объект, который позволяет итерировать и имеет состояние (помнит, где сейчас).

# Функция iter() создаёт итератор из итерируемого объекта
my_list = [1, 2, 3]
iterator = iter(my_list)

# Функция next() получает следующий элемент
print(next(iterator))  # 1
print(next(iterator))  # 2
print(next(iterator))  # 3
print(next(iterator))  # StopIteration — конец

Под капотом for цикл делает ровно это:

# Что происходит в цикле for
for item in my_list:
    print(item)

# Эквивалентно
iterator = iter(my_list)    # 1. Создать итератор
while True:
    try:
        item = next(iterator)  # 2. Получить следующий элемент
        print(item)
    except StopIteration:       # 3. Когда конец — выход
        break

Отличие между Iterable и Iterator

# ITERABLE — есть метод __iter__
my_list = [1, 2, 3]
print(hasattr(my_list, '__iter__'))  # True — это итерируемый

# ITERATOR — есть оба метода: __iter__ и __next__
iterator = iter(my_list)
print(hasattr(iterator, '__iter__'))   # True
print(hasattr(iterator, '__next__'))   # True — это итератор

# Важный момент: итератор можно итерировать, но список нельзя итерировать дважды
iterator = iter([1, 2, 3])
print(next(iterator))  # 1
print(next(iterator))  # 2
print(next(iterator))  # 3
print(next(iterator))  # StopIteration — конец
print(next(iterator))  # StopIteration — всё равно конец

# А список можно
my_list = [1, 2, 3]
for x in my_list: print(x)  # Работает
for x in my_list: print(x)  # Работает снова

Создание собственного итератора

# Класс итератора должен иметь __iter__ и __next__
class CountUp:
    def __init__(self, max):
        self.current = 0
        self.max = max
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.current < self.max:
            self.current += 1
            return self.current
        else:
            raise StopIteration

counter = CountUp(3)
for num in counter:
    print(num)
# Выведет: 1, 2, 3

Создание собственного итерируемого объекта

# Итерируемый объект (но не итератор)
class CountUpIterable:
    def __init__(self, max):
        self.max = max
    
    def __iter__(self):
        # Возвращаем новый итератор каждый раз
        return CountUp(self.max)

counter = CountUpIterable(3)

# Можно итерировать несколько раз
for num in counter: print(num)  # 1, 2, 3
for num in counter: print(num)  # 1, 2, 3 (снова)

Генераторы (Generators)

Генератор — это специальный тип итератора, создаётся с помощью yield.

# Функция с yield — это генератор
def count_up(max):
    current = 0
    while current < max:
        current += 1
        yield current  # "Пауза" и вернуть значение

# Это генератор
gen = count_up(3)
print(type(gen))  # <class 'generator'>

# Итерируем его
for num in gen:
    print(num)
# Выведет: 1, 2, 3

# Генератор работает как итератор
print(next(gen))  # StopIteration — генератор уже исчерпан

Генераторы экономят память, т.к. не создают всё сразу:

# Список (всё в памяти сразу)
numbers_list = [x for x in range(1000000)]
# Использует 1 млн элементов в памяти

# Генератор (ленивое вычисление)
def number_gen():
    for x in range(1000000):
        yield x

gen = number_gen()
# Использует почти 0 памяти, значения генерируются по требованию
first = next(gen)  # Только при запросе

Функции для работы с итерацией

1. enumerate() — итерация с индексом

for index, item in enumerate(['a', 'b', 'c']):
    print(f"{index}: {item}")
# Выведет:
# 0: a
# 1: b
# 2: c

2. zip() — объединение нескольких итерируемых

names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]

for name, age in zip(names, ages):
    print(f"{name}: {age}")
# Выведет:
# Alice: 25
# Bob: 30
# Charlie: 35

3. map() — применение функции к каждому элементу

numbers = [1, 2, 3, 4, 5]
squares = map(lambda x: x ** 2, numbers)
# map возвращает итератор
for square in squares:
    print(square)
# Выведет: 1, 4, 9, 16, 25

4. filter() — фильтрация элементов

numbers = [1, 2, 3, 4, 5, 6]
evens = filter(lambda x: x % 2 == 0, numbers)
for num in evens:
    print(num)
# Выведет: 2, 4, 6

Itertools — модуль для работы с итераторами

from itertools import count, cycle, repeat, chain

# count() — бесконечный счётчик
for i in count(1):
    if i > 3:
        break
    print(i)  # 1, 2, 3

# cycle() — повторение элементов циклически
for item in cycle(['A', 'B', 'C']):
    print(item)
    # Выведет: A, B, C, A, B, C, A, B, C, ... (бесконечно)

# repeat() — повторение значения N раз
for item in repeat('X', 3):
    print(item)  # X, X, X

# chain() — объединение нескольких итерируемых
for item in chain([1, 2], ['a', 'b'], range(2)):
    print(item)  # 1, 2, a, b, 0, 1

List/Dict/Set comprehensions

Это синтаксический сахар над итерацией:

# Вместо
result = []
for x in range(5):
    result.append(x ** 2)

# Пиши
result = [x ** 2 for x in range(5)]

# С фильтром
evens_squared = [x ** 2 for x in range(10) if x % 2 == 0]

# Dict comprehension
word_lengths = {word: len(word) for word in ['hello', 'world', 'python']}
# {'hello': 5, 'world': 5, 'python': 6}

Бесконечные итераторы

# Будьте осторожны с бесконечными итераторами
from itertools import count

for num in count():  # Никогда не кончится
    print(num)
    if num > 100:
        break  # Нужно явно выходить

Практические примеры

Пример 1: Потоковая обработка больших файлов

def read_file_lines(filename):
    with open(filename) as f:
        for line in f:  # f — итератор
            yield line.strip()  # Не загружает весь файл в память

for line in read_file_lines('huge_file.txt'):
    process(line)  # Обрабатываем строку за строкой

Пример 2: Ленивый парсинг JSON

import json

def parse_json_lines(filename):
    with open(filename) as f:
        for line in f:
            if line.strip():
                yield json.loads(line)

for record in parse_json_lines('data.jsonl'):
    print(record)  # Обрабатываем по одной строке

Ключевые понятия

  • Итерируемый объект — есть метод __iter__(), возвращает итератор
  • Итератор — есть методы __iter__() и __next__(), хранит состояние
  • Итерация — процесс обхода элементов
  • Генератор — функция с yield, это итератор с памятью эффективностью
  • StopIteration — исключение, сигнализирующее конец итерации

Итерация — один из столпов Python, используется везде: от простых циклов до асинхронного кода.

Что такое итерация? | PrepBro