这个C构造的最佳Python成语是什么?
while ((x = next()) != END) {
....
}
我没有能力重新编码next()。
更新:答案似乎是:
for x in iter(next, END):
....
答案 0 :(得分:14)
@Mark Harrison的回答:
for x in iter(next_, END):
....
iter(o[, sentinel])
返回一个迭代器对象。 ...(剪辑)... 如果给出了第二个参数
sentinel
,那么o
必须是 一个可调用的对象。迭代器 在这种情况下创建的将调用o
每次调用都没有参数next()
方法;如果返回值 等于sentinel
,StopIteration
将被提出, 否则将返回该值。
答案 1 :(得分:5)
这取决于你想要做什么。为了尽可能地匹配您的示例,我将使下一个生成器并迭代它:
def next():
for num in range(10):
yield num
for x in next():
print x
答案 2 :(得分: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__
成语非常酷! :)
答案 3 :(得分:2)
也许这不是非常惯用,但我倾向于选择
x = next()
while x != END:
do_something_with_x
x = next()
...但那是因为我发现那种容易阅读的东西
答案 4 :(得分:1)
你想在这做什么?
如果您在列表上进行迭代,则可以使用for e in L
,其中e是元素,L是列表。如果您要过滤列表,则可以使用列表推导(即[ e for e in L if e % 2 == 0 ]
来获取列表中的所有偶数)。
答案 5 :(得分:1)
如果您需要多次执行此操作,pythonic方式将使用迭代器
for x in iternext():
do_something_with_x
其中iternext
将使用类似的内容定义
(explicit is better than implicit!):
def iternext():
x = next()
while x != END:
yield x
x = next()
答案 6 :(得分:1)
您能否提供有关您要完成的工作的更多信息?我不清楚为什么你不能只说
for x in everything():
...
并让所有函数返回所有内容,而不是编写下一个函数来一次返回一个东西。发电机甚至可以非常有效地完成这项工作。