Estoy aprendiendo Python, y tengo una situación en la que deseo consumir elementos de un iterador. La parte difícil es que bajo ciertas condiciones, quiero "iterar". Es decir, coloque un elemento de nuevo en la parte frontal del iterador antes de hacer un ciclo.equivalente pitónico de unshift o rehacer?
Por ejemplo, supongamos que estoy recogiendo manzanas de un árbol. Mi cesta de fruta solo puede contener 10 kg antes de que deba vaciarse. Pero tengo que recoger cada manzana antes de poder pesarla y determinar si esta manzana excederá la capacidad de la canasta.
En un lenguaje como Perl, que podría unshift()
la manzana de nuevo en el árbol, y luego dejar que la expresión bucle de re-elegir la manzana:
while ($apple = shift(@tree)) {
$wt = weight($apple);
if ($wt + weight(@basket) > 10) {
send(@basket);
@basket =();
unshift(@tree, $apple);
} else {
push(@basket, $element);
}
}
O si no también se puede utilizar redo
, que reanuda el procesamiento en la parte superior del bloque, sin evaluar la expresión de bucle. Entonces, la misma manzana puede volver a procesarse, una vez que la canasta se haya vaciado.
while ($apple = shift(@tree)) {
$wt = weight($apple);
if ($wt + weight(@basket) > 10) {
send(@basket);
@basket =();
redo;
} else {
push(@basket, $apple);
}
}
¿Cuál sería la solución más Pythonic para este tipo de problema?
si $ en peso> 10 entonces hay un bucle infinito (el primer ejemplo come toda la memoria, el segundo simplemente nunca se detiene). – jfs
@ J.F .: Tiene razón, pero en este caso es seguro suponer que ninguna manzana superará los 10 kg. –