Итак, я смотрел, как Реймонд Хеттингер говорил Преобразование кода в красивый, идиоматический 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)
Это выглядит очень полезно для меня, но мне было интересно, знаете ли вы, что Pythonistas знает какие-либо примеры этой конструкции, которые не связаны с циклами ввода-вывода? Возможно, в стандартной библиотеке?
Я могу придумать очень надуманные примеры, например следующее:
>>> 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]
>>>
Но, очевидно, это не более полезно, чем встроенные итерации. Кроме того, мне кажется, что у меня запах кода, когда вы назначаете состояние функции. В этот момент я, скорее всего, буду работать с классом, но если я собираюсь написать класс, я мог бы также реализовать протокол итератора для чего бы я ни хотел.