`iter(callable, sentinel)` 还是 Pythonic 的吗?
Is `iter(callable, sentinel)` still Pythonic?
iter
函数的第二个参数对很有用,比如二进制文件:
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)
不知后者现在算不算"the right approach"?如果是这样,如果需要 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 for walrus 在示例 while h(x := f()): g(x)
中只提到了 2-arg iter
,它说不能平凡地翻译成 iter
.
Python 通常对这类事情有非常精确的指导方针,但我还没有找到任何关于这个特定问题的指导方针。你能帮帮我吗?
如果您主要对立即迭代迭代器感兴趣,则赋值表达式很有用,但它无法帮助您定义要在别处使用的迭代器。
例如,在使用for
循环。
iter
函数的第二个参数对
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)
不知后者现在算不算"the right approach"?如果是这样,如果需要 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 for walrus 在示例 while h(x := f()): g(x)
中只提到了 2-arg iter
,它说不能平凡地翻译成 iter
.
Python 通常对这类事情有非常精确的指导方针,但我还没有找到任何关于这个特定问题的指导方针。你能帮帮我吗?
如果您主要对立即迭代迭代器感兴趣,则赋值表达式很有用,但它无法帮助您定义要在别处使用的迭代器。
例如,在使用for
循环。