Python中断多重循环的几种思路事实上,Python的标准语法是不支持跳出多重循环的 , 所以只能利用一些技巧,大概的思路有:写成函数、利用笛卡尔积、利用调试 。
写成函数
在Python中,函数运行到return这一句就会停止,因此可以利用这一特性 , 将功能写成函数,终止多重循环,例如
def work():for i in range(10):for j in range(10):if i+j5:return i,jprint work()
利用笛卡尔积
这种方法的思路就是 , 既然可以跳出单循环,我就将多重循环改写为单循环,这可以利用itertools中的笛卡尔积函数product,例如
from itertools import productfor i,j in product(range(10), range(10)):if i+j5:print i,jbreak
利用调试模式
笛卡尔积的方式很巧妙,也很简洁,但它只能用于每次循环的集合都是独立的情形 , 假如每层循环都与前一层紧密相关,就不能用这种技巧了 。这时候可以用第一种方法,将它写成函数,另外,还可以利用调试模式 。这个利用了调试模式中,只要出现报错就退出的原理 , 它伪装了一个错误出来 。
class Found(Exception):passtry:for i in range(10):for j in range(i): #第二重循环跟第一重有关if i + j5:raise Foundexcept Found:print i, j
Python类的多重继承问题深入分析Python类的多重继承问题深入分析
首先得说明的是,Python的类分为经典类 和 新式类
经典类是python2.2之前的东西,但是在2.7还在兼容,但是在3之后的版本就只承认新式类了
新式类在python2.2之后的版本中都可以使用
经典类和新式类的区别在于:
经典类是默认没有派生自某个基类的,而新式类是默认派生自object这个基类的:
代码如下:
# old style
class A():pass
# new style
class A(obejct):pass
2.经典类在类多重继承的时候是采用从左到右深度优先原则匹配方法的..而新式类是采用C3算法(不同于广度优先)进行匹配的
3.经典类是没有__MRO__和instance.mro()调用的,而新式类是有的.
为什么不用经典类 , 要更换到新式类
因为在经典类中的多重继承会有些问题...可能导致在继承树中的方法查询绕过后面的父类:
代码如下:
class A():
def foo1(self):
print "A"
class B(A):
def foo2(self):
pass
class C(A):
def foo1(self):
print "C"
class D(B, C):
pass
d = D()
d.foo1()
按照经典类的查找顺序从左到右深度优先的规则,在访问d.foo1()的时候,D这个类是没有的..那么往上查找,先找到B,里面没有,深度优先,访问A,找到了foo1(),所以这时候调用的是A的foo1(),从而导致C重写的foo1()被绕过.
所以python引入了新式类的概念,每个基类都继承自object并且,他的匹配规则也从深度优先换到了C3
C3算法
C3算法是怎么做匹配的呢..在问答版块上面讨论之后,归结如下:
C3算法的一个核心是merge.
在merge列表中,如果第一个序列mro的第一个类是出现在其它序列,并且也是第一个 , 或者不出现其它序列 , 那么这个类就会从这些序列中删除,并合到访问顺序列表中
比如:(引用问题中zhuangzebo的回答@zhuangzebo)
代码如下:
class A(O):pass
class B(O):pass
class C(O):pass
class D(A,B):pass
class E(C,D):pass
首先需要知道 O(object)的mro(method resolution order)列表是[O,]
那么接下来是:
代码如下:
mro(A) = [A, O]
mro(B) = [B, O]
mro(C) = [C, O]
mro(D) = [D] + merge(mro(A), mro(B), [A, B])
= [D] + merge([A, O], [B, O], [A, B])
= [D, A] + merge([O], [B, O], [B])
= [D, A, B] + merge([O], [O])
推荐阅读
- 我要做网络手机游戏,我要做网络手机游戏怎么做
- 通过js设置div的css,js如何设置css
- 怎么关掉手机视频亮光,手机亮屏出现视频怎么关闭
- 直播服装收纳技巧,直播间服装货品如何陈列
- 得到当前时间java代码 获得当前时间java
- 什么是网易云音频直播平台,网易云空间音频有什么用
- 微星gs65显卡怎么样,微星gs65什么时候上市的
- 什么浏览器能直接录屏直播,哪个浏览器可以录屏有声音
- linux空闲端口命令 linux 空闲端口