Los iteradores de Python, y los generadores en particular, existen exactamente para permitir la agradable refactorización de bucles que de otro modo serían complicados. Por supuesto, es difícil extraer una abstracción de un ejemplo simple, pero suponiendo que el 3
necesita ser un parámetro (¿quizás debería ser el total range(3)
?), Y las dos funciones a las que llama necesitan algunos parámetros que sean variables de bucle, usted podría refactorizar el código:
for y in range(3):
for x in range(3):
do_something(x, y)
for y1 in range(3):
for x1 in range(3):
do_something_else(x, y, x1, y1)
en, por ejemplo:
def nestloop(n, *funcs):
head = funcs[0]
tail = funcs[1:]
for y in range(n):
for x in range(n):
yield head, x, y
if tail:
for subtup in nestloop(n, *tail):
yield subtup[:1] + (x, y) + subtup[1:]
for funcandargs in nestloop(3, do_something, do_something_else):
funcandargs[0](*funcandargs[1:])
necesitarán sin duda el tipo exacto de refactorización que ser ajustado para sus propósitos exactos, pero el punto general de que los iteradores (y por lo general de hecho solo generadores simples) permiten refactorizaciones muy agradables de bucles permanece - todos los logi de bucle c va dentro del generador, y el código del nivel de la aplicación se deja con los bucles for
simples y el procesamiento real relevante de la aplicación de los elementos producidos en los bucles for.
[Ver también.] (Http://stackoverflow.com/a/533917/1430829) –