首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘`iter(callable,sentinel)’仍然是Pythonic语言吗?

‘`iter(callable,sentinel)’仍然是Pythonic语言吗?
EN

Stack Overflow用户
提问于 2020-01-27 03:27:02
回答 1查看 126关注 0票数 1

iter函数的第二个参数对于looping over objects that don't define themselves as iterable非常有用,例如二进制文件:

代码语言:javascript
复制
response = b''
for block in iter(partial(f.read, 256), b''):
    response += block

然而,在Python3.8中,我们现在有了“海象运算符”,在What's new in Python 3.8文章中提到它是为了解决上面的问题:

代码语言:javascript
复制
# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)

我想知道后者现在是否被认为是“正确的方法”?如果是这样,如果需要iter的第二个参数,因为表单上的任何代码

代码语言:javascript
复制
for x in iter(f, y):
    g(x)

不妨现在就写成:

代码语言:javascript
复制
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通常对这类事情有非常精确的指导方针,但我还找不到针对这一特定问题的指导方针。你能帮帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-27 03:34:31

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59921927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档