所以,我在观看Raymond Hettinger的演讲“将代码转换为美丽,惯用的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)
这对我来说看起来非常有用,但我想知道你们中的 Pythonista 是否知道任何不涉及 I/O 读取循环的此结构的示例?或许在标准库中能找到?
我可以想到一些非常牵强的例子,比如下面这个:
>>> 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]
>>>
但显然,这并不比内置的可迭代对象更有用。而且,当您将状态分配给函数时,这似乎对我来说是一种代码异味。此时,我可能应该使用类,但如果我要编写一个类,我也可以为我想要完成的任何事情实现迭代器协议。