12

这个 C 结构最好的 Python 习语是什么?

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

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

更新:答案似乎是:

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

7 回答 7

14

@马克哈里森的回答:

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

这是Python 文档的摘录:

iter(o[, sentinel])

返回一个迭代器对象。 ...(snip)...如果给定第二个参数 , sentinel,则o必须是可调用对象。在这种情况下创建的迭代器将在o 每次调用其 next()方法时不带参数调用;如果返回的值等于sentinel, StopIteration将被提升,否则将返回该值。

于 2009-01-08T23:06:34.307 回答
5

这取决于你想做什么。为了尽可能匹配您的示例,我将制作下一个生成器并对其进行迭代:

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

for x in next():
   print x
于 2008-08-26T16:44:42.200 回答
4

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

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

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

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

显然,这有点丑陋。您也可以使用上面列出的“迭代器”方法之一,但同样,这可能并不理想。最后,您可以使用我在谷歌搜索时发现的“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

现在你可以这样做:

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

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

编辑:我想在信用到期的地方给予信用。在这里找到了“pita pocket”成语

于 2008-08-26T17:50:30.357 回答
2

也许这不是非常地道,但我倾向于使用

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

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

于 2008-08-26T16:42:27.760 回答
1

你想在这里做什么?如果您正在遍历列表,则可以使用for e in Lwhere e 是元素, L 是列表。如果您正在过滤列表,您可以使用列表推导(即[ e for e in L if e % 2 == 0 ]获取列表中的所有偶数)。

于 2008-08-26T16:42:49.473 回答
1

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

for x in iternext():
    do_something_with_x

whereiternext将使用类似的东西定义(显式优于隐式!):

def iternext():
    x = next()
    while x != END:
        yield x
        x = next()        
于 2008-08-26T16:49:52.623 回答
1

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

for x in everything():
    ...

并让 Everything 函数返回所有内容,而不是编写下一个函数一次只返回一件事。生成器甚至可以非常有效地做到这一点。

于 2008-08-26T18:18:42.443 回答