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

Mar*_*son 10 c python

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

while ((x = next()) != END) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

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

更新:答案似乎是:

for x in iter(next, END):
    ....
Run Code Online (Sandbox Code Playgroud)

jfs*_*jfs 14

@Mark Harrison的回答:

for x in iter(next_, END):
    ....
Run Code Online (Sandbox Code Playgroud)

以下是Python文档的摘录:

iter(o[, sentinel])
Run Code Online (Sandbox Code Playgroud)

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


Joh*_*off 5

这取决于你想做什么.为了尽可能地匹配您的示例,我将使下一个生成器并迭代它:

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

for x in next():
   print x
Run Code Online (Sandbox Code Playgroud)


Fre*_*ory 4

简短的回答:Python 中没有办法在 while 循环中进行内联变量赋值。这意味着我不能说:

while x=next():
    // do something here!
Run Code Online (Sandbox Code Playgroud)

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

while 1:
    x = next()
    if x != END:
        // Blah
    else:
        break
Run Code Online (Sandbox Code Playgroud)

显然,这有点丑陋。您还可以使用上面列出的“迭代器”方法之一,但是,这可能并不理想。最后,您可以使用我在谷歌搜索时实际上刚刚发现的“pita pocket”方法:

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
Run Code Online (Sandbox Code Playgroud)

现在你可以这样做:

p = Pita()
while p( next() ) != END:
    // do stuff with p.pocket!
Run Code Online (Sandbox Code Playgroud)

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

编辑:我想在应得的信用处给予信用。“pita pocket”这个习语是在这里找到的