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

时间:2008-08-26 16:37:52

标签: c python

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

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

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

更新:答案似乎是:

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

7 个答案:

答案 0 :(得分:14)

@Mark Harrison的回答:

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

以下摘自Python's documentation

iter(o[, sentinel])
  

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

答案 1 :(得分:5)

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

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

for x in next():
   print x

答案 2 :(得分: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__成语非常酷! :)

编辑:我想在信用到期时给予信任。找到了'pita pocket'成语here

答案 3 :(得分:2)

也许这不是非常惯用,但我倾向于选择

x = next()
while x != END:
    do_something_with_x
    x = next()

...但那是因为我发现那种容易阅读的东西

答案 4 :(得分:1)

你想在这做什么? 如果您在列表上进行迭代,则可以使用for e in L,其中e是元素,L是列表。如果您要过滤列表,则可以使用列表推导(即[ e for e in L if e % 2 == 0 ]来获取列表中的所有偶数)。

答案 5 :(得分:1)

如果您需要多次执行此操作,pythonic方式将使用迭代器

for x in iternext():
    do_something_with_x

其中iternext将使用类似的内容定义 (explicit is better than implicit!):

def iternext():
    x = next()
    while x != END:
        yield x
        x = next()        

答案 6 :(得分:1)

您能否提供有关您要完成的工作的更多信息?我不清楚为什么你不能只说

for x in everything():
    ...

并让所有函数返回所有内容,而不是编写下一个函数来一次返回一个东西。发电机甚至可以非常有效地完成这项工作。