python利用生成器终止两层for循环
两层循环过程中,如果想通过break终止循环,是一件简单,但却很麻烦的事情,例如下面的这段代码
lst1 = [1, 2, 4, 5, 6]
lst2 = [1, 5, 6, 8, 9]
stop = False
for i in lst1:
for j in lst2:
if i + j == 10:
stop = True
break
if stop:
break
两层for循环的目的非常简单,从两个列表中各找出一个数,使得他们的和等于10,而且只需找出一个组合即可。
找到满足要求的组合后,为避免不必要的循环,需要终止循环,而此时,if条件语句在for循环的最里层,此处执行break,只能跳出最里层的for循环,想要终止最外层的for循环,就必须传递终止信号给它,代码里,通过stop=True,告知外层for循环可以终止了。
这样的代码写起来,显然有些繁琐,最后的if stop判断总显得多余,面对这种情况,可以巧妙的利用生成器来避免这种复杂的写法。
lst1 = [1, 2, 4, 5, 6]
lst2 = [1, 5, 6, 8, 9]
def num_generator(lst1, lst2):
for i in lst1:
for j in lst2:
yield i, j
for i, j in num_generator(lst1, lst2):
if i + j == 10:
print(i, j)
break
生成器num_generator里通过两层for循环对数据进行遍历,真正的业务逻辑使用一个for循环,这里就避免了跳出两层for循环的困境,这一次break,结束了for循环对num_generator的使用。