我正在学习 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/

10-12 23:43