在学习Python的过程中,不免要调用很多库中的函数,各种库中函数参数的“形参”有不同的定义形式,如果你和我一样困惑的话,希望下面这篇文章可以帮到你。
0. 前言
- 形参(parameter):指函数定义中的参数
- 实参(argument):指函数调用时人为传递的参数
1. 位置参数
(1) 简述
位置参数,也是我们自己定义和调用函数时用的最多的。
当我们定义函数的时候使用了位置参数的形式,那么在我们调用函数的时候输入实参的顺序和数量,必须和函数定义中的形参的顺序和数量一样。
(2) 举例说明
def myfunction(name, age):
print(f"My name is {name}, I am {age} years old.")
# 位置参数形式调用
myfunction("Bob", 25)
# 关键词参数形式调用,可不按照顺序
myfunction(age=25, name="Alice")
运行结果
My name is Bob, I am 25 years old.
My name is Alice, I am 25 years old.
2. 默认参数
(1) 简述
默认参数,顾名思义就是在函数定义的时候,我们就已经给形参指定了默认值(缺省值),在函数调用的时候可以不关心该参数(也可以重新赋值)。
在我们调用库中函数的时候,有时候一个函数有十几个形参,但是绝大多数形参都有默认值。当我们不是很了解这个函数的时候,可以只给没有默认值的形参传入数据,这大大提高了函数调用的效率。
(2) 举例说明
def myfunction(name="Bob", age=30):
print(f"My name is {name}, I am {age} years old.")
# 不指定参数
myfunction()
# 指定部分参数
myfunction("Alice")
运行结果
My name is Bob, I am 30 years old.
My name is Alice, I am 30 years old.
3. 不定长参数(*args)
(1) 简述
在参数前面加上(*)号,那么给这个形参传递参数的时候,实际上传递过来的参数会保存在一个元组中。
注:对于不定长参数不能使用关键词参数的形式进行传参,否则报错;
最好也不要直接传递一个元组进去,否则传入的元组会被包裹为元组的第一个元素;
如果要传递一个元组进去,可以在前面加上一个(*)
(2) 举例说明
def myfunction(arg1, *args):
print(arg1)
print(args)
myfunction(1, 100, 200) # 第一种
print("---------------")
tuple1 = (100, 200)
myfunction(1, tuple1) # 第二种
print("---------------")
myfunction(1, *tuple1) # 第三种,加上(*)和第一种相同
运行结果
1
(100, 200)
---------------
1
((100, 200),)
---------------
1
(100, 200)
4. 关键词参数(**kwargs)
(1) 简述
在参数前面加上(**)号,那么给这个形参传递参数的时候,我们需要使用关键词参数的形式进行传参,实际上传递过来的参数会保存在一个字典中。
注:使用关键词参数的形式进行传参;
直接传入字典的时候,需要加上(**)
(2) 举例说明
def myfunction(arg1, **kwargs):
print(arg1)
print(kwargs)
myfunction(1, a=100, b=200)
print("---------------")
c = "c"
d = "d"
dict1 = {c: 300, d: 400}
myfunction(1, **dict1)
运行结果
1
{'a': 100, 'b': 200}
---------------
1
{'c': 300, 'd': 400}
5. *单独出现
(1) 简述
一般的形式是 def myfunc(a, b, *, c) ,( * )号后的参数必须使用关键词参数的形式传入,( * )号前的参数可以直接传入也可以使用关键词参数形式传入
6. 强制位置参数
(1) 简述
Python3.8 新增了一个强制位置参数的语法,用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式。
一般形式是 def myfunc(a, b, /, c) ,(/)前的参数只能按照顺序传入,不能使用关键词参数的形式传入;(/)后的参数都可以。