相当于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.