结果:
3 3
5 6
why?
一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。
而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。
所以如果添加了@classmethod方法,则不会调用父类的构造函数,直接读取了静态变量。
如果实例化了对象,那么子类继承父类,如果子类不复写父类的init()方法,创建子类对象的时候自动调用父类init()方法
子类继承父类,如果子类复写了父类的init()方法,创建子类对象的时候不会自动调用父类init()方法
注意:Python要求复写父类的init()方法时,要调用父类的init()。因为存在隐患,例如父类的初始化方法有参数,子类初始化无参数,子类在调用父类的参数的时候就会报错
def divide(a,b):
try:
return a/b
except:
return "0"
finally:
return "-1"
print(divide(3,1),divide(2,0))
不论try
语句块中发生了什么异常,finally
语句块中的代码都会被执行。所以我们通常在finally
语句块中做清理工作,例如关闭文件等等。
try和except中return语句设定的返回值,可以在finally块中被修改;
实践中不要在finally中使用return,这是一种不好的代码,容易让人产生疑惑。finally块主要用于进行清理工作。
集合的计算:
1.交集
In [1]: a = {1,2,3,4}
In [2]: b = {3,4,5,6}
In [3]: a & b
Out[3]: {3, 4}
In [4]: a.intersection(b)
Out[4]: {3, 4}
2.并集
In [5]: a | b
Out[5]: {1, 2, 3, 4, 5, 6}
In [6]: a.union(b)
Out[6]: {1, 2, 3, 4, 5, 6}
3.差集
In [9]: a-b
Out[9]: {1, 2}
In [10]: b-a
Out[10]: {5, 6}
In [11]: a.difference(b)
Out[11]: {1, 2}
In [12]: b.difference(a)
Out[12]: {5, 6}
4.对称差集
In [13]: a^b
Out[13]: {1, 2, 5, 6}
In [14]: a.symmetric_difference(b)
Out[14]: {1, 2, 5, 6}
5.集合的子集和超集
In [15]: x = {1,2,3,4}
In [16]: y = {1,2,3}
In [17]: y.issubset(x)
Out[17]: True
In [18]: x.issuperset(y)
Out[18]: True
①节点:包含一个数据元素及若干指向子树分支的信息 [5] 。
②节点的度:一个节点拥有子树的数目称为节点的度 [5] 。
③叶子节点:也称为终端节点,没有子树的节点或者度为零的节点 [5] 。
④分支节点:也称为非终端节点,度不为零的节点称为非终端节点 [5] 。
⑤树的度:树中所有节点的度的最大值 [5] 。
⑥节点的层次:从根节点开始,假设根节点为第1层,根节点的子节点为第2层,依此类推,如果某一个节点位于第L层,则其子节点位于第L+1层 [5] 。
⑦树的深度:也称为树的高度,树中所有节点的层次最大值称为树的深度 [5] 。
⑧有序树:如果树中各棵子树的次序是有先后次序,则称该树为有序树 [5] 。
⑨无序树:如果树中各棵子树的次序没有先后次序,则称该树为无序树 [5] 。
⑩森林:由m(m≥0)棵互不相交的树构成一片森林。如果把一棵非空的树的根节点删除,则该树就变成了一片森林,森林中的树由原来根节点的各棵子树构成 [5]
二叉树是一个结点的集合,其中每个结点最多与两个后继结点相关联,分别称为左侧子结点和右侧子结点。二叉树中的每个结点并不是全都有两个子结点,也可能只有一个结点或两个结点都可能被省略。在二叉树中,没有子结点的结点称为叶结点。
包含子结点的结点称为其子结点的父结点。对于一个定义为二叉树的非空的结点集合,每个结点必须至多有一个父结点,并且必须有一个结点是没有父结点的。这个没有父结点的结点称为二叉树的根结点。一个空的结点集合可以构成一个空的二叉树。
链表和二叉树有一些相似之处。二叉树的根对应于链表的头部,二叉树结点的子结点对应于链表中的后继结点,二叉树结点的父结点对应于链表中结点的前驱结点。当然,空链表的模拟是空的二叉树。