Pythonic方式的等价写法:while ((x = next()) != END)
这个C语言的写法在Python中最好的写法是什么呢?
while ((x = next()) != END) {
....
}
我没有能力重新编写next()这个函数。
更新:看起来答案是:
for x in iter(next, END):
....
7 个回答
5
这要看你想做什么。为了尽量符合你的例子,我会创建一个生成器,然后对它进行迭代:
def next():
for num in range(10):
yield num
for x in next():
print x
14
@Mark Harrison的回答:
for x in iter(next_, END):
....
这里是来自Python文档的一段摘录:
iter(o[, sentinel])
返回一个迭代器对象。...(省略)... 如果提供了第二个参数
sentinel
,那么o
必须是一个可调用的对象。这样创建的迭代器在每次调用它的next()
方法时,会无参数地调用o
;如果返回的值等于sentinel
,就会引发StopIteration
,否则就会返回这个值。
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__
这个用法真的很有意思! :)
补充:我想给这个方法应有的认可。“皮塔口袋”这个用法是从这里找到的。