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

时间:2020-03-05 18:43:24  来源:igfitidea点击:

此C构造的最佳Python习惯用法是什么?

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

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

更新:和答案似乎是:

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

解决方案

回答

也许这不是很惯用,但我倾向于

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

...但是那是因为我觉得这种东西很容易读

回答

我们想在这里做什么?
如果要遍历列表,则可以在L中使用`for e',其中e是元素,L是列表。如果要过滤列表,则可以使用列表推导(即[[e表示L中的e,如果e%2 == 0]则得到列表中的所有偶数)。

回答

这取决于我们要做什么。为了尽可能匹配示例,接下来我将生成一个生成器并对其进行迭代:

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

for x in next():
   print x

回答

如果我们需要多次执行此操作,则pythonic方法将使用迭代器

for x in iternext():
    do_something_with_x

其中的" iternext"将使用类似的定义
(显式优于隐式!):

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

回答

简短的答案:在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"这一习语真的很棒! :)

编辑:我想在信用到期的地方给予信用。在这里找到了"皮塔袋"成语

回答

我们能否提供有关我们要完成的目标的更多信息?我不清楚,为什么你不能只说

for x in everything():
    ...

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

回答

@马克·哈里森的答案:

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

以下是Python文档的摘录:

iter(o[, sentinel])
Return an iterator object.
  ...(snip)... If the second argument, sentinel, is given, then o must be
  a callable object. The iterator
  created in this case will call o
  with no arguments for each call to its
  next() method; if the value returned
  is equal to sentinel,
  StopIteration will be raised,
  otherwise the value will be returned.