Итераторы и генераторы Python, в частности, существуют, чтобы обеспечить хороший рефакторинг в противном случае сложных циклов. Конечно, трудно получить абстракцию из простого примера, но предполагая, что параметр 3
должен быть параметром (может быть, весь range(3)
должен быть?), А две функции, которые вы вызываете, нуждаются в некоторых параметрах, которые являются переменными цикла, вы могли бы реорганизовать код:
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)
в, например:
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:])
точный вид рефакторинга, без сомнения, должны быть переделаны для точных целей, но и общую точку, что итераторы (и, как правило на самом деле просто простые генераторы) дают очень приятные рефакторинги остатков петель - все петлевые логи c входит в генератор, а код уровня приложения оставлен с простыми петлями for
и фактической обработкой приложений, полученными в циклах for.
[См. Также.] (Http://stackoverflow.com/a/533917/1430829) –