Python 函数传参详解

Python位置传参

位置传参也称为必备参数,必须按照正确的顺序将参数传递到函数中,定义函数时的参数与实际传入的参数数量必须保持一致

正常如下:

def par(A,B):
    return A+B
print(par(1,2))

结果
3

少传参数:

def par(A,B):
    return A+B
print(par(1))

结果
TypeError: par() missing 1 required positional argument: 'B'
缺少一个必要的 B 参数。

多传参数

def par(A,B):
    return A+B
print(par(1,2,3))

结果
TypeError: par() takes 2 positional arguments but 3 were given
只需要 2 个参数,但是却传入了 3 个参数。

Python 关键字参数

关键字传参是以形参的名字确认输入的参数值,通过关键字传参不在需要与形参位置完全一致,只要参数名正确即可

def par(A,B):
    print("A",A)
    print("B",B)
par(A=1,B=2)
print("~"*30)
par(B=2,A=1)

结果
A 1
B 2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A 1
B 2

可看出在调用函数时既可以根据位置参数调用,也可以使用关键字来调用,也可任意调换位置,只要参数关键字正确即可

必须要注意的是在使用位置参数和关键字参数混合传参的方式时,关键字参数必须位于所有位置参数之后

Python 默认传参

在调用函数时如果不指定某个参数,python解释器会抛出异常。为了解决这个问题python运行为参数设置默认值,即在定义函数时直接给形参指定一个默认值。这样即使调用函数时没有给拥有默认值的形参传递参数时,该参数可以直接使用定义函数时设置的默认值

语法格式

def 函数名(...,形参名,形参名=默认值):
    代码块

注意,在使用此格式定义函数时,指定有默认值的形式参数必须在所有没默认值参数的最后,否则会产生语法错误。

def par(A,B=2):
    print("A",A)
    print("B",B)
par(A=1)
print("~"*30)
par(A=1,B=3)

结果
A 1
B 2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A 1
B 3

结论:函数中 B参数设有默认值,也就是说可以只传一个参数,也可以传两个参数,传一个参数时会使用默认值

对于自己定义的函数可以知道哪个参数有默认值,但如果使用python提供的内置函数,或者其他第三方提供的函数,怎么知道哪些参数有默认值?
Python中可以使用"函数名__defaults__"查看函数默认参数的当前值,返回的是一个元组

def par(A,B=2):
    print("A",A)
    print("B",B)
print(par.__defaults__)

结果
(2,)

Python可变参数(*args,**kwargs)

可变参数又称为不定长参数,即传入函数中的实际参数可以是任意多个
可变参数:形参前添加一个 '*'
args表示创建一个名为args的空元组,该元组可接受任意多个传入的非关键字实参

def par(A,*args):
    print(A)
    print(args)

par(1,2,3,4)

结果
1
(2, 3, 4)

除了前面位置参数接收对应位置的实参外,其它非关键字参数都会由 args元组接收。

def par(*args,A):
    print(A)
    print(args)
par(1,2,3,4)

结果
TypeError: par() missing 1 required keyword-only argument: 'A'

我们没有给 A 参数传值。当然,如果A 参数有默认参数,则此调用方式是可行的。

可变参数:形参前添加两个’*'
**kwargs 表示创建一个名为 kwargs 的空字典,该字典可以接收任意多个以关键字参数赋值的实际参数。

def par(A,**kwargs):
    print(A)
    print(kwargs)

par(1,B=1,C=2)

结果
1
{'B': 1, 'C': 2}

注意,*args 可变参数的值默认是空元组,**kwargs 可变参数的值默认是空字典。因此,在调用具有可变参数的函数时,不一定非要给它们传值。

def par(A,**kwargs):
    print(A)
    print(kwargs)

par(1)

结果
1
{}

Python逆向参数传递

  • 直接将列表、元组、字典作为函数参数,Python 会将其进行拆分,把其中存储的元素按照次序分给函数中的各个形参。
  • 在以逆向参数收集的方式向函数参数传值时,Pyhon 语法规定,当传入列表或元组时,其名称前要带一个 * 号,当传入字典时,其名称前要带有 2 个 * 号。
def par(A,args):
    print(A)
    print(args)
data = ["A","B"]
par(*data)

结果
A
B

def par(A,B):
    print(A)
    print(B)
data = {"A":1,"B":2}
par(**data)

结果
1
2

如果使用逆向参数收集的方式,必须注意 * 号的添加。以逆向收集字典为例,如果传参时其字典名前不带 * 号,则 Python 解释器会将整个字典作为参数传递给一个参数。例如:

def par(A,*args):
    print(A)
    print(args)
data = {"A":1,"B":2}
par(data)

结果
{'A': 1, 'B': 2}
()

你可能感兴趣的:(python,python)