Каково использование iter(callable, Sentinel)?Python

Программы на Python
Anonymous
Каково использование iter(callable, Sentinel)?

Сообщение Anonymous »

Итак, я смотрел доклад Рэймонда Хеттингера «Преобразование кода в красивый, идиоматический Python», и он упоминает об этой форме iter, о которой я никогда не знал. Его пример следующий:

Вместо:

Код: Выделить всё

blocks = []
while True:
block = f.read(32)
if block == '':
break
blocks.append(block)
Использование:

Код: Выделить всё

blocks = []
read_block = partial(f.read, 32)
for block in iter(read_block, ''):
blocks.append(block)
После проверки документации iter я нашел аналогичный пример:

Код: Выделить всё

with open('mydata.txt') as fp:
for line in iter(fp.readline, ''):
process_line(line)
Мне это кажется довольно полезным, но мне интересно, знаете ли вы, питонисты, какие-нибудь примеры этой конструкции, которая не использует циклы ввода-вывода? Возможно, в Стандартной библиотеке?

Я могу вспомнить очень надуманные примеры, например следующие:

Код: Выделить всё

>>> def f():
...     f.count += 1
...     return f.count
...
>>> f.count = 0
>>> list(iter(f,20))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>>
Но очевидно, что это не более полезно, чем встроенные итерации. Кроме того, мне кажется, что код пахнет, когда вы присваиваете состояние функции. На этом этапе мне, скорее всего, придется работать с классом, но если я собираюсь написать класс, я мог бы также реализовать протокол итератора для всего, чего хочу.

Вернуться в «Python»