我正在学习 Python,我想从迭代器中使用项目。棘手的部分是在某些条件下,我想“取消迭代”。也就是说,在 I 循环之前将一个项目放回迭代器的前面。
例如,假设我正在从树上摘苹果。我的水果篮只能装 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 的解决方案是什么?
最佳答案
当 else 子句应该总是出现时,为什么还要麻烦 unshifting 呢?
for apple in tree:
if (apple.weight + basket.weight) > 10:
send(basket)
basket.clear()
basket.add(apple)
无论如何,我相当肯定 Python 没有您正在寻找的那种行为。
关于Pythonic 相当于 unshift 或 redo?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/418915/