首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >大多数Pythonic方式相当于:while((x = next())!= END)

大多数Pythonic方式相当于:while((x = next())!= END)
EN

Stack Overflow用户
提问于 2018-09-21 05:59:31
回答 2查看 0关注 0票数 0

这个C构造的最佳Python成语是什么?

while ((x = next()) != END) {
    ....
}

我没有能力重新编码next()。

更新:答案似乎是:

for x in iter(next, END):
    ....
EN

回答 2

Stack Overflow用户

发布于 2018-09-21 14:29:13

简短回答:在Python中的while循环中无法进行内联变量赋值。意思是我不能说:

while x=next():
    // do something here!

由于这是不可能的,因此有许多“惯用正确”的方法:

while 1:
    x = next()
    if x != END:
        // Blah
    else:
        break

显然,这有点难看。您也可以使用上面列出的“迭代器”方法之一,但同样,这可能并不理想。最后,您可以使用我在谷歌搜索时实际找到的“皮塔口袋”方法:

class Pita( object ):
    __slots__ = ('pocket',)
    marker = object()
    def __init__(self, v=marker):
        if v is not self.marker:
            self.pocket = v
    def __call__(self, v=marker):
        if v is not self.marker:
            self.pocket = v
        return self.pocket

现在你可以这样做:

p = Pita()
while p( next() ) != END:
    // do stuff with p.pocket!

谢谢你提出这个问题; 学习__call__成语真的很酷!:)

编辑:我想在信用到期时给予信任。在这里找到 “皮塔口袋”的成语

票数 0
EN

Stack Overflow用户

发布于 2018-09-21 15:13:56

for x in iter(next_, END):
    ....

以下是Python文档的摘录:

iter(o[, sentinel])

返回一个迭代器对象。 ...(snip)...如果sentinel给出第二个参数,则o必须是可调用对象。在这种情况下创建的迭代器将调用o 每个对其next()方法的调用没有参数 ; 如果返回的值等于sentinelStopIteration则会引发,否则返回该值。

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

https://stackoverflow.com/questions/-100000790

复制
相关文章

相似问题

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