函数def
'''
python 函数
def 函数名(参数列表):
函数体
如果参数要指定数据类型,
参数名:数据类型
num : int
str1 : str
list1 : list
dict1 : dict
set1 : set
'''
def addNum(a: int, b: int, c: int):
return a + b + c
def addNum2(a: int, b: int, c: int):
total = a + b + c
return
num = addNum(1, 2, 3)
num2 = addNum2(1, 2, 3)
print(num) # 6
print(num2) # None
如果没有return就没有返回值,只写return,返回None
'''
函数参数列表,可以设置不定长参数
def 函数名(arg1,*args) *args: 函数用元组接收参数
def 函数名(arg1,**args) **args: 函数用字典接收参数
* 和 ** 可以同时出现,不过*只能在**前面,不然会报错
def 函数名(arg1,*,arg2,arg3,arg4) 表示: * 号之后的参数必须用字典类型传入
'''
def para(arg1,*args):
print(arg1)
print(args)
def para1(arg1,**kwargs):
print(arg1)
print(kwargs)
def para2(arg1,*args,**kwargs):
print(arg1)
print(args)
print(kwargs)
def para3(arg1,*,arg2,arg3):
print(arg1)
print(arg2)
print(arg3)
para(1,2,3,4)
para1(1,a=2,b=3,c=4)
para2(1,11,111,a=2,b=3,c=4)
para3(1,arg2=2,arg3=3)
'''
1
(2, 3, 4)
1
{'a': 2, 'b': 3, 'c': 4}
1
(11, 111)
{'a': 2, 'b': 3, 'c': 4}
1
2
3
'''
类class
'''
类用class标识
class 类名:
...
class 类名(继承类名): # python支持多继承,
...
有几个名词:
1. 方法解析顺序(Method Resolution Order),简称 MRO
python 刚开始的时候多继承方法解析顺序采用了深度优先搜索算法(DFS),在python2.2版本,引入了
新式类,新式类在深度优先搜索算法的基础上做了优化,但是类的解析顺序不是单调性的,所以在python2.3版本,对新式类采用了C3算法
class.mro(): 此方法可以被一个元类来重载,用来解析类实例的解析顺序,会在类实例化的时候调用,结果存储于__mro__之中
class.__mro__: 此属性是由类组成的元组,在方法解析期间会基于它来查找基类
2. 新式类和旧式类
旧式类(经典类): python2.2之前的类都是经典类,声明类的时候不用显式的继承object,采用的算法是深度优先搜索算法
python2.2引入新式类,声明类的时候显式的继承object,MRO算法采用C3算法,在python2中,经典类MRO
算法还是深度优先,新式类则采用C3算法
新式类: python3中,支持新式类,所以不论是否显式的继承了object,都是新式类,MRO算法都采用了C3算法,广度优先
'''
class A:
def getName(self):
print('A')
class B(A):
# def getName(self):
# print('B')
pass
class C(A):
def getName(self):
print('C')
class D(B, C, A):
pass
'''
A
/ | \
B | C
\ | /
D
'''
print(D.mro())
d = D()
d.getName()
'''
广度搜索: 先在D中找,如果没有,搜索B,如果没有,不会深入B的父类A,而是依次找C
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
B
注释掉B的getName之后,结果如下:
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
C
'''