一、位置参数

def calc(a, b, c):
    print(a*a + 2*b +c)
calc(3, 5, 8)  #27

位置参数适合参数少的情况,当参数较多时,位置容易存错。

二、关键词参数

def calc(a, b, c):
    print(a*a + 2*b +c)
calc(3, 5, 8)        #27 位置参数
calc(c=8, a=3, b=5)  #27 关键词参数

关键词参数适合参数较多时,通过指定关键词来存。

三、混搭

def calc(a, b, c):
    print(a*a + 2*b +c)
calc(3, b=5, c=8)    #27 混搭
calc(a=3, b=5, 8)    #出错,语法错误

混搭时应注意先放位置参数后放关键词参数,否则会出现语法错误。语法上允许混搭,但尽量不要采用。

四、强制关键词参数

def c2(d, *, a, b, c):
    print(a*a + 2*b +c -d)
c2(6, a=3, b=5, c=8)   #21
c2(6, 3, b=5, c=8)     #出错,只接受一个不带关键词的

d在*的前面,可以作为位置参数,不用指定关键词,*后面必须指定关键词,可以混搭。

五、默认参数

def c3(a, b, c=0):
    print(a * a + 2 * b + c)
c3(3,5)   #19

def c3(a, b=5, c=8):
    print(a * a + 2 * b + c)
c3(3,5,9)    #28

def c3(a=3, b, c=8):
    print(a * a + 2 * b + c)
c3(3,5,9)    #出错,非默认参数放在了默认参数之后

一旦设置默认值,可以不传它;但也可以继续传入,传了多少就是多少。默认参数需要注意,现房非默认参数再放默认参数。

六、可变参数(位置)

def hello(msg, name1, name2):
    print('Hello',name1,name2,msg)
hello('新年好','zhang','li')   #Hello zhang li 新年好

def hello(msg, *names):
    print('Hello',names,msg)
hello('新年好','zhang','li')   #Hello ('zhang', 'li') 新年好
hello('新年好')   #Hello () 新年好

def hello(msg, *names):
    print('Hello',*names,msg)
hello('新年好','zhang','li')  #Hello zhang li 新年好

当参数是多个时,可以在变量前面加*,表示零到无穷多个位置参数,传入的参数会被合并为一个元组,若需要破开元组,只需要在元组前面加上*。注意要先固定参数再可变参数。

七、可变参数(关键词)

def hello(msg,**names):
    print('老大是:',names['Boss'],msg)
    print('老二是:', names['Boss2'], msg)
hello('新年好',Boss='张',Boss2='李',Guard='王')    # 老大是: 张 新年好 老二是: 李 新年好

在变量前加**,表示可变参数是关键词参数,在调用时必须用键值对来调用。

八、进一步混搭

def f(a,b,c,d,*args,e,f,**kwargs):
    print(a,b,c,d,e,f)
    print(args)
    print(kwargs)
f(1,2,3,4,5,99,e=6,f=7,x=8,y=9)
#1 2 3 4 6 7
(5, 99)
{'x': 8, 'y': 9}

顺序必须是:必选参数、默认参数、可变位置参数、命名关键字参数和可变关键字参数。

九、强制位置参数

def f(a,b,/,c,d,*,e,f,**kwargs):
    print(a,b,c,d,e,f)
f(3,4,5,6,e=7,f=8,z=9,w=10)   #3,4,5,6,7,8

/ 前面一定为位置参数

十、函数调用--开包列表和元组

def hello(msg, *names):
    print('Hello', *names, msg)
names_param = ['张','李','王']
hello('您好',*names_param)  #Hello 张 李 王 您好

十一、函数调用--开包字典

#传统方法
def hello(msg,**names):
    print('老大是:',names['Boss'],msg)
    print('老二是:', names['Boss2'], msg)
data = {'Boss':'张','Boss2':'李','Guard':'王'}
hello('新年好',Boss=data['Boss'],Boss2=data['Boss2'],Guard=data['Guard'])
#老大是: 张 新年好
#老二是: 李 新年好

#简单方法
hello('新年好',**data)
#老大是: 张 新年好
#老二是: 李 新年好