Pythonic方式的等价写法:while ((x = next()) != END)

12 投票
7 回答
945 浏览
提问于 2025-04-10 23:28

这个C语言的写法在Python中最好的写法是什么呢?

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

我没有能力重新编写next()这个函数。

更新:看起来答案是:

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

7 个回答

5

这要看你想做什么。为了尽量符合你的例子,我会创建一个生成器,然后对它进行迭代:

def next():
   for num in range(10):
      yield num

for x in next():
   print x
14

@Mark Harrison的回答:

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

这里是来自Python文档的一段摘录:

iter(o[, sentinel])

返回一个迭代器对象。...(省略)... 如果提供了第二个参数sentinel,那么o必须是一个可调用的对象。这样创建的迭代器在每次调用它的next()方法时,会无参数地调用o;如果返回的值等于sentinel,就会引发StopIteration,否则就会返回这个值。

4

简单来说,在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__这个用法真的很有意思! :)

补充:我想给这个方法应有的认可。“皮塔口袋”这个用法是从这里找到的。

撰写回答