Python中函数的参数可以分为两大类形参和实参~
def func(x, y): # x, y 就是形参
print(x, y)
func(2, 3) # 2, 3 就是实参
- 形参
形参(如上面的x, y)仅在定义的函数中有效,函数调用结束后,不能再使用该形参变量。在调用函数时,该函数中的形参才会被分配内存,并赋值;函数调用结束,分配的内存空间也随即释放~
- 实参
即在调用函数时,向该函数的形参传递确定的值(必须是确定的值)。传递的值可以是常量、变量、表达式、函数等形式~
在形参和实参中又可以细化为多种参数,例如形参中有 位置形参,默认形参,可变长参数...;实参中有位置实参,关键字实参等,下面一一介绍~
位置参数
位置参数顾名思义,按照从左到右的顺序依次定义的参数。位置参数有两种:位置形参和位置实参。上面示例中,func函数中的x,y就是位置形参,每一个位置形参都必须被传值。调用func时传递的2,3就是位置实参,位置实参与位置形参一一对应,不能多也不能少~
关键字参数
关键字参数针对实参,即实参在定义时,按照 key=value 形式定义
def func(x, y, z):
print(x, y, z)
func(1, z = 2, y = 3)
关键字参数可以不用像位置参数一样与形参一一对应,例如这里可以是 z 在前面,y 在后面。
使用注意点:
1)在调用函数时,位置实参 必须在 关键字实参的前面~
def func(x, y, z):
print(x, y, z)
# 位置参数和关键字参数混合使用的时候
func(1, z = 2, y = 3) # 正确
func(x = 1, z = 2, 3) # 错误
2)一个形参不能重复传值
def func(x, y, z):
print(x, y, z)
func(1, x = 2, y = 3, z = 4) # 错误,形参 x 重复传值
默认参数
默认参数即在函数定义阶段,就已经为形参赋值
def function(x, y=10): # y 即为默认参数
pass
# 函数调用阶段,必须为 x 传值(位置形参),可以为 y 传值,也可以不传,不传值就使用默认值 10
function(1) # x = 1,y = 10
function(1,2) # x = 1,y = 2
默认参数使用的注意点:
1)定义函数时,默认形参必须放在位置形参后面
def func(y = 10, x): # 错误
pass
def func(x, y = 10): # 正确
pass
2)默认参数通常要定义成不可变类型,例如:数字,字符串,元组等;虽然语法上支持定义成可变类型,但一般不建议这么做
3)默认参数只在定义阶段被赋值一次,如下示例:
x=10
def func(name, age = x):
pass
x=20
func('hello')
Tip:func函数在定义时,age 只被赋值一次,即 age=10,下面重新指定了 x=20,不会再作用于函数中的 age 参数
可变长参数
在定义函数时,若不确定调用时需要传入多少个参数,这时就可以使用可变长参数,即实参的个数不固定
可变长参数 可以分为两类:
1)按位置定义的可变长度的实参(*)
2)按关键字定义的可变长度的实参(**)
- 按位置定义的可变长度的实参
def func(x, y, *args): # *args 会把传入的 多余的 参数以一个元组的形式存放,元组的变量名就是args
print(x, y)
print(args)
func(1, 2, 3, 4, 5, 6) # x=1, y=2, args=(3,4,5)
# 输出结果:
1 2
(3, 4, 5, 6)
Tip:'args = (3, 4, 5, 6)',所以 '*args = *(3, 4, 5, 6) ',在调用函数时,也可以使用如下方式传值( * 是用来处理位置参数的,表示把后面的元组拆开)
func(1, 2, *(3, 4, 5, 6)) # 等同于 func(1, 2, 3, 4, 5, 6)
# 输出结果: # 结果一致
1 2
(3, 4, 5, 6)
- 按关键字定义的可变长度的实参
def func(x, y, **kwargs): # **kwargs 会把多传入的参数以 dict 形式存放
print(x, y)
print(kwargs)
func(1, 2, a = 3, b = 4, c = 5) # x=1, y=2, kwargs={'a': 3, 'b': 4, 'c': 5}
# 输出结果:
1 2
{'a': 3, 'b': 4, 'c': 5}
Tip:'kwargs = {'a': 3, 'b': 4, 'c': 5}',所以 ' **kwargs = **{'a': 3, 'b': 4, 'c': 5}',在调用函数时,也可以使用如下方式传值(** 表示关键字形式的实参,** 会将字典拆开,以关键字的形式传入)