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:])
确切的重构类型无疑需要根据您的确切目的进行调整,但迭代器(通常实际上只是简单的生成器)提供非常好的循环重构的一般观点仍然存在——所有循环逻辑都在生成器内部,并且应用程序级代码留下了简单的for
循环和对 for 循环中产生的项目的实际应用程序相关处理。