Я изучаю 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);
}
}
Что было бы наиболее питоническим решением для такого рода проблем?