【备忘】Python中断多重循环的几种思路
By 苏剑林 | 2016-12-19 | 61525位读者 |跳出单循环 #
不管是什么编程语言,都有可能会有跳出循环的需求,比如枚举时,找到一个满足条件的数就终止。跳出单循环是很简单的,比如
for i in range(10):
if i > 5:
print i
break
然而,我们有时候会需要跳出多重循环,而break只能够跳出一层循环,比如
for i in range(10):
for j in range(10):
if i+j > 5:
print i,j
break
这样的代码并非说找到一组i+j > 5就停止,而是连续找到10组,因为break只跳出了for j in range(10)这一重循环。那么,怎么才能跳出多重呢?在此记录备忘一下。
跳出多重循环 #
事实上,Python的标准语法是不支持跳出多重循环的,所以只能利用一些技巧,大概的思路有:写成函数、利用笛卡尔积、利用调试。
写成函数 #
在Python中,函数运行到return这一句就会停止,因此可以利用这一特性,将功能写成函数,终止多重循环,例如
def work():
for i in range(10):
for j in range(10):
if i+j > 5:
return i,j
print work()
利用笛卡尔积 #
这种方法的思路就是,既然可以跳出单循环,我就将多重循环改写为单循环,这可以利用itertools中的笛卡尔积函数product,例如
from itertools import product
for i,j in product(range(10), range(10)):
if i+j > 5:
print i,j
break
利用调试模式 #
笛卡尔积的方式很巧妙,也很简洁,但它只能用于每次循环的集合都是独立的情形,假如每层循环都与前一层紧密相关,就不能用这种技巧了。这时候可以用第一种方法,将它写成函数,另外,还可以利用调试模式。这个利用了调试模式中,只要出现报错就退出的原理,它伪装了一个错误出来。
class Found(Exception):
pass
try:
for i in range(10):
for j in range(i): #第二重循环跟第一重有关
if i + j > 5:
raise Found
except Found:
print i, j
转载到请包括本文地址:https://www.spaces.ac.cn/archives/4159
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Dec. 19, 2016). 《【备忘】Python中断多重循环的几种思路 》[Blog post]. Retrieved from https://www.spaces.ac.cn/archives/4159
@online{kexuefm-4159,
title={【备忘】Python中断多重循环的几种思路},
author={苏剑林},
year={2016},
month={Dec},
url={\url{https://www.spaces.ac.cn/archives/4159}},
}
December 20th, 2016
分享的不错,谢谢
December 21st, 2016
sumOverTen = false;
for i in range(10):
if sumOverTen:
break
for j in range(10):
if i+j > 5:
print i,j
break
python语法不太懂,不过就是这个意思,也可以
手机回复,格式乱了…
if后面还有一句,sumOverTen = true
December 27th, 2016
进来看看
February 7th, 2017
从来没考虑过这种需求,:),想了下,基本上都是要么在上游设计扼杀了这种多重循环需要条件退出的可能性,要么在coding上使用函数的return关键词。
这种需求挺常见的吧~比如你要枚举验证“每个正整数均可表示为4个整数的平方和”,这就是一个三重循环呀,但理论上只要找到一组解就行,所以就有终止多重循环的需求了。
我是说我在实际项目的开发中,这种开发需求并不常见。这个是由实际问题到开发需求的转变。(先定问题,后提炼出多重循环的开发需求)
但是,我们现在反过来,我们从多重循环的开发需求,还是很容易找出很多应用例子的。(先定多重循环的需求,后找用例)。 :)
哈哈哈....
其实,我想说我是来较真的....
October 5th, 2017
[...]原文地址:http://spaces.ac.cn/archives/4159/[...]