函数的参数
定义函数(参数):
普通参数,默认参数,可变参数(可变位置参数,可变关键字参数),keyword-only 参数
调用函数(传参):
位置参数,关键字参数,参数结构(位置参数解构,关键字参数解构)
普通参数 x,y:
def add(x,y)
return x + y
默认参数 x=1:
def inc(base,x =1):
return base +x
inc(3)
4
inc(3,2)
5
参数可以有默认值, 但当一个参数有默认值时,调用时如果不传递此参数,会使用默认值
带默认值参数必须在不带默认值参数之后,否则会报错SyntaxError
def inc(x=0,y):
return x+y
File "<ipython-input-19-d6c7b4f89658>", line 1
def inc(x= 0,y):
^
SyntaxError: non-default argument follows default argument
可变位置参数:
定义参数时前面加一个*,表示这个参数是可变的,可以接受任意多个参数,这些参数构成一个元组,只能通过位置参数传递
可变关键字参数:
定义参数时,在前面加**,表示这个参数可变,可以接受任意多个参数,这些参数构成一个字典,只能通过关键字参数传递
参数的混合使用:
#位置参数可以和关键字参数一起使用
#当位置可变参数和关键字可变参数一起使用时候,可变位置参数必须在前
def fn(*args,**kwargs):
print(args)
print(kwargs)
fn(1,2,3,x=4,y=5)
(1,2,3)
#普通参数可以和可变参数一起使用,但是传参的时候必须匹配
def fn(x,y,*args,**kwargs):
print(x)
print(y)
print(args)
print(kwargs)
fn(1,2,3,4,5,a=6,b=7)
1
#关键字可变参数不允许在普通参数之前
def fn(**kwargs,x):
print(x)
#上面的方式定义会出错
#默认参数可以在可变位置参数之前
def fn(x=5,*args):
print(x)
pprint(args)
#位置可变参数可以在普通参数之前,但是在位置可变参数之后的普通参数变成可keyword-only 参数
keyword-only参数:
Python3特性
#在*号之后的参数只能通过关键字参数传递的叫keyword-only参数
可变位置参数之后的参数也是keyword-only参数
def fn(*,x):
print(x)
fn(1,x=3) #此时x 只能通过关键字参数传递,如果安装普通参数传递,会被*和可变位置参数吃掉
fn(x=3)
def fn(*args,x):
print(args)
print(x)
#keyword-only 参数可以有默认值
keyword-only 参数可以和默认参数一起出现,不管它有没有默认值,不管默认参数是不是keyword-only
参数解构:
可以把一个可迭代对象解构成位置参数
参数解构发生在函数调用用,可变参数发生在函数定义的时候
解构的两种形式:
一个星号*,解构的对象:可迭代对象,解构后的结果,位置参数
两个星号**,解构的对象:字典,解构的结果,关键字参数
关键字参数解构,key必须是str类型
def add(a,b):
return a+b
data = [4,3]
print(add(*data)) #位置参数解构
data1 = {'a':3,'b':4}
print(add(**data1)) #关键字参数解构