python 函数参数

#不可变参数"通过值"进行传递
def f(a):
    a=99
    print(a)   
    
b=88
f(b)    #99
print(b)    #88

#可变对象是通过"指针"进行传递的,如列表,字典
def changer(a,b):
    a=2
    b[0]='spam'
x=1
l=[1,2]
changer(x,l)
print(x,l)    #1 ['spam',2]

#避免可变参数的修改
import copy
def changer2(b):
    b=copy.deepcopy(b)
    b[0]='spam'
l=[1,2]
changer2(l)

print(l)    #[1,2]


位置:从左到右进行匹配
关键字茶树:通过参数名进行匹配
默认参数:为没有传入值的参数定义参数值
可变参数:收集任意多基于位置或关键字的参数:*形参,用于函数头
可变参数解包:传递任意多基于位置和关键字的参数:*实参,用于调用者
keyword-only参数:参数必须按照名称传递

函数参数匹配表
func(value)        调用者    常规参数:通过位置进行匹配
func(name=value)   调用者    关键字参数:通过变量名匹配
func(*sequence)    调用者    以name传递所有的对象,并作为独立的基于位置的参数
func(**dict)       调用者    以name成对的传递所有的关键字/值,并作为独立的关键字参数
def func(name)           函数      常规参数:通过位置或者变量名进行匹配
def func(name=value)     函数      默认参数值,如果没有在调用中传递的话
def func(*name)          函数      匹配并收集(在元祖中)所有包含位置的参数
def func(**name)         函数      匹配并收集(在字典中)所有包含位置的参数
def func(*args,name)    函数      参数必须在调用中按照关键字传递
def func(*, name=value)  函数      (python 3.0)

函数调用中,参数必须以此顺序出现:位置参数,关键字参数,*sequence,**dict
函数头部中,参数必须以此顺序出现:一般参数,默认参数,*,keyword-only,**

#关键字参数
def f(a,b,c):
    print(a,b,c)

f(c=3,b=2,a=1)

#默认参数
def f2(a=1,b=2,c=3):
    print(a,b,c)
    
f2()    #1 2 3
f2(a=4)    #4 2 3
f2(11,22)    #11 22 3
f2(11,22,33)    #11 22 33
f2(11,c=33)    #11 2 33

#关键字参数和默认参数的混合
def func(spam, eggs, toast=0, ham=0):
    print((spam, eggs, toast, ham))
    
func(1,2)    #(1, 2, 0, 0)
func(1,ham=1, eggs=0)    #(1, 0, 0, 1)
func(spam=1, eggs=0)    #(1, 0, 0, 0)
func(1,2,3,4)    #(1, 2, 3, 4)

#任意参数
#收集参数
def f(*args):
    print(args)
    
f(1,2,3,4,5)   #(1, 2, 3, 4, 5) 调用时,将所有位置相关的参数收集到一个元素中,并将一个元祖赋值给变量args

def f2(**args):
    print(args)

f2(a=1,b=2)    #{'a': 1, 'b': 2}  **允许关键字阐述转换为字典

def f3(a, *pargs, **kargs):
    print(a, pargs, kargs)
    
f3(1,2,3,x=1,y=2)    #1 (2, 3) {'x': 1, 'y': 2}    混合

#解包参数
def f4(a,b,c,d):
    print(a,b,c,d)
    
f4(*(1,2,3,4))    #1 2 3 4 解包参数的集合
f4(**{'a':1,'b':2,'c':3,'d':4})    #1 2 3 4 解包参数的集合
f4(*(1,2),**{'c':3,'d':4})    #1 2 3 4 解包参数的集合
f4(1, *(2,3),**{'d':4})    #1 2 3 4 解包参数的集合
f4(1, c=3, *(2,),**{'d':4})    #1 2 3 4 解包参数的集合
f4(1, *(2,3),d=4)    #1 2 3 4 解包参数的集合
f4(1, *(2,),c=3, **{'d':4})    #1 2 3 4 解包参数的集合

#keyword-only参数
def kwonly(a,*b,c):
    print(a,b,c)
    
kwonly(1,2,c=3)    #1 (2,) 3
kwonly(a=1,c=3)    #1 () 3
#kwonly(1,2,3)    #报错,c必须要关键字传递

def kwonly2(a,*,b,c):
    print(a,b,c)
    
kwonly2(1,c=3,b=2)    #1 2 3
kwonly2(c=3,b=2,a=1)    #1 2 3
#kwonly2(1,2,b=4,c=5)    #报错,多了一个参数

def kwonly3(a,*,b='spam',c='ham'):
    print(a,b,c)
    
kwonly3(1)    #1 spam ham
kwonly3(1,c=3)    #1 spam 3
kwonly3(a=1)    #1 spam ham
kwonly3(c=3,b=2,a=1)    #123
#kwonly3(1,2)    #报错,b和c必须关键字传递

def kwonly4(a,*,b=1,c,d=2):
    print(a,b,c,d)
    
kwonly4(3,c=4)    #3 1 4 2

#函数定义中,**args必须在keyword-only之前,*args之后,函数调用中,keyword-only参数必须在**args之前或者包含在**args中,可以编写在*args之前或者之后
def f(a,*b,c=6,**d):
    print(a,b,c,d)
    
f(1,3,4,x=4,y=5)    #1 (3, 4) 6 {'x': 4, 'y': 5}
f(1,*(3,4),**dict(x=4,y=5))    #1 (3, 4) 6 {'x': 4, 'y': 5}
f(1,*(3,4),c=7,**dict(x=4,y=5))    #1 (3, 4) 7 {'x': 4, 'y': 5}
f(1,c=7,*(3,4),**dict(x=4,y=5))    #1 (3, 4) 7 {'x': 4, 'y': 5}
f(1,*(2,3),**dict(x=4,y=5,c=7))    #1 (2, 3) 7 {'x': 4, 'y': 5}

猜你喜欢

转载自blog.csdn.net/weixin_37016700/article/details/80240894
今日推荐