iter(callable,sentinel)`还是Pythonic吗?

问题描述 投票:1回答:1

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'' '):...

python python-3.x loops iterator pep
1个回答
1
投票

如果主要对立即迭代迭代器感兴趣,但是赋值表达式很有用,但是它不能帮助您定义要在其他地方使用的迭代器。

© www.soinside.com 2019 - 2024. All rights reserved.