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