阅读 37

Python函数参数类型 - CSDN博客

原文链接: blog.csdn.net

函数的参数

定义函数(参数):

普通参数,默认参数,可变参数(可变位置参数,可变关键字参数),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)  复制代码
(1, 2, 3)
{'y': 5, 'x': 4}
复制代码

#普通参数可以和可变参数一起使用,但是传参的时候必须匹配

复制代码
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复制代码
1
2
(3, 4, 5)
{'a': 6, 'b': 7}
复制代码

#关键字可变参数不允许在普通参数之前

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))          #关键字参数解构