Tengo un bucle que desea ejecutar hasta el agotamiento o hasta que se alcanza el límite especificado por el usuario. Tengo un constructo que se ve mal, pero parece que no puedo encontrar una forma más elegante de expresarlo; hay uno?¿una forma más pitónica de expresar un bucle condicionalmente limitado?
def ello_bruce(limit=None):
for i in xrange(10**5):
if predicate(i):
if not limit is None:
limit -= 1
if limit <= 0:
break
def predicate(i):
# lengthy computation
return True
Holy nesting! Tiene que haber una mejor manera. Para propósitos de un ejemplo de trabajo, se usa xrange
donde normalmente tengo un iterador de longitud finita pero desconocida (y el predicado a veces devuelve False).
Al menos puede comprobar si es Ninguno límite antes del bucle y volver si es así en lugar de comprobar en cualquier momento que el predicado es cierto. Eso realmente no lo hace más pitónico, pero puede ahorrar una gran cantidad de cálculos innecesarios en su ciclo. –
Olvidó poner la acción real aquí, pero espero que el límite = Ninguna signifique "sin límite", no "no haga nada". –
Tenga en cuenta que la limpieza más simple que puede hacer aquí es invertir la condición: 'if not predicate (i): continue', que evita poner todo el resto del bloque en un nivel de anidación adicional. Esto se aplica a una gran cantidad de código, por lo que es bueno aprender en general. –