这个C构造的最佳Python成语是什么?
while ((x = next()) != END) {
....
}
Run Code Online (Sandbox Code Playgroud)
我没有能力重新编码next().
更新:答案似乎是:
for x in iter(next, END):
....
Run Code Online (Sandbox Code Playgroud)
jfs*_*jfs 14
@Mark Harrison的回答:
for x in iter(next_, END):
....
Run Code Online (Sandbox Code Playgroud)
以下是Python文档的摘录:
iter(o[, sentinel])
Run Code Online (Sandbox Code Playgroud)
返回一个迭代器对象. ...(snip)...如果给出了第二个参数
sentinel,,那么它o必须是一个可调用的对象.在这种情况下创建的迭代器将调用o每个对其next()方法的调用没有参数 ; 如果返回的值等于sentinel,StopIteration则会引发,否则返回该值.
这取决于你想做什么.为了尽可能地匹配您的示例,我将使下一个生成器并迭代它:
def next():
for num in range(10):
yield num
for x in next():
print x
Run Code Online (Sandbox Code Playgroud)
简短的回答:Python 中没有办法在 while 循环中进行内联变量赋值。这意味着我不能说:
while x=next():
// do something here!
Run Code Online (Sandbox Code Playgroud)
由于这是不可能的,因此有许多“惯用的正确”方法可以做到这一点:
while 1:
x = next()
if x != END:
// Blah
else:
break
Run Code Online (Sandbox Code Playgroud)
显然,这有点丑陋。您还可以使用上面列出的“迭代器”方法之一,但是,这可能并不理想。最后,您可以使用我在谷歌搜索时实际上刚刚发现的“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
Run Code Online (Sandbox Code Playgroud)
现在你可以这样做:
p = Pita()
while p( next() ) != END:
// do stuff with p.pocket!
Run Code Online (Sandbox Code Playgroud)
感谢您提出这个问题;学习这个__call__成语真的很酷!:)
编辑:我想在应得的信用处给予信用。“pita pocket”这个习语是在这里找到的
| 归档时间: |
|
| 查看次数: |
750 次 |
| 最近记录: |