【发布时间】:2010-09-29 22:54:34
【问题描述】:
我正在学习 Python,我遇到了一种情况,我想使用迭代器中的项目。棘手的部分是在某些条件下,我想“取消迭代”。也就是说,在循环之前将一个项目放回迭代器的前面。
例如,假设我正在从树上摘苹果。我的水果篮只能装 10 公斤,才需要清空。但是我必须先把每个苹果都摘下来,然后才能称重,并确定这个苹果是否会超过篮子的容量。
在像 Perl 这样的语言中,我可以unshift() 苹果回到树上,然后让循环表达式重新挑选苹果:
while ($apple = shift(@tree)) {
$wt = weight($apple);
if ($wt + weight(@basket) > 10) {
send(@basket);
@basket = ();
unshift(@tree, $apple);
} else {
push(@basket, $element);
}
}
否则我也可以使用redo,它会在块顶部恢复处理,而不需要评估循环表达式。所以同一个苹果可以在篮子被清空后重新加工。
while ($apple = shift(@tree)) {
$wt = weight($apple);
if ($wt + weight(@basket) > 10) {
send(@basket);
@basket = ();
redo;
} else {
push(@basket, $apple);
}
}
对于这类问题,最pythonic的解决方案是什么?
【问题讨论】:
-
如果 $wt > 10 则有一个无限循环(第一个示例吃掉所有内存,第二个示例永远不会停止)。
-
@J.F.:你是对的,但在这种情况下,可以假设没有一个苹果会超过 10 公斤。