iter
函数的第二个参数对于looping over objects that don't define themselves as iterable有用,例如二进制文件:
response = b''
for block in iter(partial(f.read, 256), b''):
response += block
但是在Python 3.8中,我们现在有了“海象运算符”,在What's new in Python 3.8文章中提到了“海象运算符”是解决上述确切问题的方法:
# Loop over fixed length blocks
while (block := f.read(256)) != '':
process(block)
我不知道现在是否将后者视为“正确方法”?如果是这样,那么是否需要iter
的第二个参数,因为表单上的任何代码
for x in iter(f, y):
g(x)
现在也可以写成:
while (x := f()) != y:
g(x)
[我猜也许在某些情况下,我们不想立即循环可迭代对象,例如b''.join(iter(partial(f.read, 256), b''))
或某些代码(尽管很快就会变得很毛茸茸)。同样,像for i, x in enumerate(iter(f, y)):
这样的循环可能很难转换为新语法(?)
海象的[The PEP仅在示例iter
中提及2-arg while h(x := f()): g(x)
,它说不能轻易地翻译为iter
。]]
Python通常在这类事情上有相当精确的指导原则,但我无法针对此特定问题找到任何指南。你能帮我吗?
iter函数的第二个参数可用于循环遍历未将自身定义为可迭代的对象,例如二进制文件:iter(partial(f.read,256),b'中块的response = b'' '):...
如果主要对立即迭代迭代器感兴趣,但是赋值表达式很有用,但是它不能帮助您定义要在其他地方使用的迭代器。