iter函数的第二个参数对于looping over objects that don't define themselves as iterable非常有用,例如二进制文件:
response = b''
for block in iter(partial(f.read, 256), b''):
response += block然而,在Python3.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只在示例while h(x := f()): g(x)中提到了2-arg iter,它说这不能简单地转换为iter。
Python通常对这类事情有非常精确的指导方针,但我还找不到针对这一特定问题的指导方针。你能帮帮我吗?
发布于 2020-01-27 03:34:31
如果您主要对在迭代器上立即迭代感兴趣,则赋值表达式很有用,但它不能帮助您定义要在其他地方使用的迭代器。
例如,您可能希望创建一个迭代器,该迭代器首先包装在map、filter或itertools.islice中,然后使用for循环对最终结果进行迭代。
https://stackoverflow.com/questions/59921927
复制相似问题