Iter: примеры (PYTHON)

Создание итераторов при помощи функции iter в языке Python
Раздел: Встроенные функции, Итерации
iter(object: object, sentinel: Any = None): iterator

Основы функции iter

Функция iter() возвращает объект итератора для переданного аргумента. Она является фундаментальной для реализации протокола итерации в Python.

Функция применяется для получения итератора из итерируемого объекта или создания итератора из вызываемого объекта с использованием сторожевого значения.

Аргументы функции

  • object (обязательный): Объект, для которого необходимо создать итератор. Должен быть либо итерируемым (реализует метод __iter__()), либо вызываемым (callable) при использовании второго аргумента.
  • sentinel (опциональный): Значение, которое сигнализирует о завершении итерации. Если указан, первый аргумент должен быть вызываемым объектом.

Возвращаемое значение

  • Объект итератора, который реализует метод __next__().
  • Если передан только один аргумент и он не является итерируемым объектом, возникает исключение TypeError.
  • При передаче двух аргументов итератор вызывает вызываемый объект до тех пор, пока возвращаемое значение не станет равным сторожевому значению (sentinel).

Базовые примеры применения

Пример работы с итерируемым объектом.

lst = [10, 20, 30]
iterator = iter(lst)
print(next(iterator))
print(next(iterator))
10
20

Пример с использованием сторожевого значения.

import random
def random_number():
    return random.randint(1, 5)

iterator = iter(random_number, 4)
for num in iterator:
    print(num)
2
1
3

Пример с файлом и sentinel.

with open('test.txt', 'w') as f:
    f.write('Первая\nВторая\nТретья')

with open('test.txt', 'r') as f:
    for line in iter(f.readline, ''):
        print(line.strip())
Первая
Вторая
Третья

Похожие функции и конструкции Python

  • enumerate(): Возвращает итератор, который генерирует кортежи (индекс, элемент) для последовательности. Удобна при необходимости отслеживания индекса в цикле.
  • range(): Генерирует последовательность чисел. Экономит память, так как не создает список целиком.
  • Цикл for: Неявно использует iter() для обхода итерируемых объектов. Прямое использование iter() требуется для нестандартных сценариев итерации.
  • Генераторы: Функции с ключевым словом yield. Создают итератор автоматически, предоставляя более удобный синтаксис для сложных итераций.

Аналоги функции в других языках

JavaScript: Метод Symbol.iterator.

const arr = [1, 2, 3];
const iterator = arr[Symbol.iterator]();
console.log(iterator.next().value);
1

Java: Метод iterator() для коллекций.

import java.util.*;
List list = Arrays.asList("a", "b");
Iterator it = list.iterator();
System.out.println(it.next());
a

Golang: Использование каналов или ключевого слова range для циклов.

arr := []int{1, 2}
for i, v := range arr {
    fmt.Println(i, v)
}
0 1
1 2

Kotlin: Функция iterator() для коллекций.

val list = listOf("x", "y")
val it = list.iterator()
println(it.next())
x

Распространенные ошибки

Передача неитерируемого объекта без sentinel.

num = 42
iterator = iter(num)
TypeError: 'int' object is not iterable

Использование невызываемого объекта с sentinel.

iterator = iter([1,2,3], 2)
TypeError: iter(v, w): v must be callable

Неопределенность sentinel в потоке данных.

def gen():
    yield 1
    yield 2
    yield 1
iterator = iter(gen, 1)
print(list(iterator))
[]

История изменений функции

Функция iter() присутствует с ранних версий Python. В Python 3.8 была уточнена документация по использованию sentinel. Спецификация самой функции оставалась стабильной в последних основных релизах.

Расширенные примеры использования

Создание итератора из класса с использованием метода __iter__.

Пример python
class CountDown:
    def __init__(self, start):
        self.current = start
    def __iter__(self):
        return self
    def __next__(self):
        if self.current <= 0:
            raise StopIteration
        num = self.current
        self.current -= 1
        return num

cd = CountDown(3)
iterator = iter(cd)
for val in iterator:
    print(val)
3
2
1

Использование sentinel для чтения до определенного байта.

Пример python
import io
stream = io.BytesIO(b'Hello\nWorld\nEnd')
for chunk in iter(lambda: stream.read(4), b''):
    print(chunk)
b'Hell'
b'o\nWo'
b'rld\n'
b'End'

Кастомный итератор с модификацией поведения.

Пример python
class CyclicIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0
    def __iter__(self):
        return self
    def __next__(self):
        result = self.data[self.index]
        self.index = (self.index + 1) % len(self.data)
        return result

cyclic = CyclicIterator(['A', 'B', 'C'])
iterator = iter(cyclic)
for _ in range(5):
    print(next(iterator))
A
B
C
A
B

Итератор для бесконечной числовой последовательности.

Пример python
def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1

inf_iter = iter(infinite_sequence())
print(next(inf_iter))
print(next(inf_iter))
0
1

питон iter function comments

En
Iter Return an iterator object