gpt4 book ai didi

python - `iter(callable, sentinel)` 仍然是 Pythonic 吗?

转载 作者:行者123 更新时间:2023-12-01 06:30:49 28 4
gpt4 key购买 nike

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对于海象只提到 2-arg iter在示例中while h(x := f()): g(x) ,它说不能简单地翻译为 iter .

Python 通常对这类事情有非常精确的指导方针,但我还没有找到针对这个特定问题的任何指导方针。你能帮我吗?

最佳答案

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

例如,您可能想要创建一个迭代器,该迭代器首先包装在 mapfilteritertools.islice 中,最后使用 for 循环迭代最终结果。

关于python - `iter(callable, sentinel)` 仍然是 Pythonic 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59921927/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com