Сообщить об ошибке.

Функция iter() в Python, создает итератор

Функция iter() создает итератор из последовательности

Синтаксис:

iter(object, sentinel)

Параметры:

  • object - последовательность или итератор,
  • sentinel - значение с которым будет вызываться каждый элемент из object (если элементы object - это вызываемые объекты).

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

  • iterator - объект итератора.

Описание:

Функция iter() возвращает объект итератора. Первый аргумент object интерпретируется по-разному, в зависимости от наличия второго аргумента sentinel.

Если НЕТ аргумента sentinel, то первый аргумент object должен быть объектом-коллекцией, которая поддерживает протокол итераций метод __iter__() или он должен поддерживать протокол последовательности метод __getitem__() с целыми аргументами, начиная с 0. Если он не поддерживает любой из этих протоколов, бросается исключение TypeError.

Если передается аргумент sentinel, то ожидается, что первый аргумент object, поддерживает вызов __call__(). В этом случае, созданный итератор будет вызывать указанный объект с каждым обращением к своему __next__() и проверять полученное значение на равенство со значением, переданным в аргумент sentinel. Если полученное значение равно sentinel, то бросается исключение StopIteration, иначе возвращается полученное значение.

Примеры создания итератора из последовательностей.

x = iter(["apple", "banana", "cherry"])
print(next(x))
print(next(x))
print(next(x))

Одно из применений второго аргумента sentinel это чтение строк файла, пока не будет достигнута, переданная в sentinel. Следующий пример считывает файл, пока метод readline() не вернёт пустую строку:

with open('mydata.txt') as fp:
    # читаем, пока не попадется пустая строка
    for line in iter(fp.readline, sentinel=''): 
        # Делаем что-то с line.

Пользовательский тип, определивший __call__():

class MyIterable(object):
    def __init__(self):
        self.index = 0
        self.items = [1, 2, 3, 4]

    def __call__(self):
        value = self.items[self.index]
        self.index += 1
        return value


x = iter(MyIterable(), 3)

print(next(x))  # 1
print(next(x))  # 2
print(next(x))  # StopIteration