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__.
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 для чтения до определенного байта.
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'
Кастомный итератор с модификацией поведения.
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
Итератор для бесконечной числовой последовательности.
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