这个 C 结构最好的 Python 习语是什么?
while ((x = next()) != END) {
....
}
我没有能力重新编码 next()。
更新:答案似乎是:
for x in iter(next, END):
....
@马克哈里森的回答:
for x in iter(next_, END):
....
这是Python 文档的摘录:
iter(o[, sentinel])
返回一个迭代器对象。 ...(snip)...如果给定第二个参数 ,
sentinel
,则o
必须是可调用对象。在这种情况下创建的迭代器将在o
每次调用其next()
方法时不带参数调用;如果返回的值等于sentinel
,StopIteration
将被提升,否则将返回该值。
这取决于你想做什么。为了尽可能匹配您的示例,我将制作下一个生成器并对其进行迭代:
def next():
for num in range(10):
yield num
for x in next():
print x
简短的回答:没有办法在 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”成语
也许这不是非常地道,但我倾向于使用
x = next()
while x != END:
do_something_with_x
x = next()
...但那是因为我发现那种东西很容易阅读
你想在这里做什么?如果您正在遍历列表,则可以使用for e in L
where e 是元素, L 是列表。如果您正在过滤列表,您可以使用列表推导(即[ e for e in L if e % 2 == 0 ]
获取列表中的所有偶数)。
如果您需要多次执行此操作,pythonic 方式将使用迭代器
for x in iternext():
do_something_with_x
whereiternext
将使用类似的东西定义(显式优于隐式!):
def iternext():
x = next()
while x != END:
yield x
x = next()
您能否提供有关您要完成的工作的更多信息?我不清楚为什么你不能直接说
for x in everything():
...
并让 Everything 函数返回所有内容,而不是编写下一个函数一次只返回一件事。生成器甚至可以非常有效地做到这一点。