Les itérateurs Python, et en particulier les générateurs, existent exactement pour permettre le refactoring de boucles complexes. Bien sûr, il est difficile d'extraire une abstraction d'un exemple simple, mais en supposant que le 3
doit être un paramètre (peut-être que le range(3)
devrait l'être?), Et les deux fonctions que vous appelez ont besoin de paramètres qui sont des variables de boucle, vous pouvez factoriser le code:
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)
dans, par exemple:
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:])
le genre exact de refactoring ne doute besoin d'être peaufiné pour vos besoins exacts, mais le point de vue général que itérateurs (et le plus souvent en fait juste des générateurs simples) offrent de très beaux refactorings de boucles de restes - tous les logi en boucle c passe à l'intérieur du générateur, et le code au niveau de l'application est laissé avec for
boucles simples et le traitement réel de l'application pertinente des éléments fournis dans les boucles for.
[Voir aussi.] (Http://stackoverflow.com/a/533917/1430829) –