系列文章目录
一、形参和实参
-
形参(形式参数):指的是函数定义中定义的参数,它没有实际的值,相当于一个空的变量,等着值(实参)传入。
-
实参(实际参数):指的是函数调用阶段传入的参数,可以是一个值,也可以是一个定义好的变量,甚至是函数调用(前提是该函数有返回值)。
执行函数的时候,会将实参的内存地址绑定给形参。执行完毕,就立即解除绑定关系。
def foo(a, b): # 括号内为形参,执行函数时会绑定为实参 result = a + b # 函数体内也是形参,执行函数时会绑定为实参 return result x = 2 foo(1, x) # 括号内为实参
二、位置参数和关键字参数
-
位置参数:
函数调用时,按照形参的顺序传入实参,使形参与实参一 一对应:
def foo(a, b, c): pass foo(1, 2, 3) # 这里1绑定给a,2绑定给b,3绑定给c。 foo(3, 1, 2) # 这里3绑定给a,1绑定给b,2绑定给c,全靠位置顺序来相互对应。
-
关键字参数:
函数调用时,直接按照 形参=实参 的形式,将实参绑定给形参,不需要按照位置顺序对应:
def foo(a, b, c): pass foo(c=1, a=2, b=3) # 直接绑定,形参与实参的位置对应关系就不重要了。
-
混合使用的注意事项:
- 位置参数必须放在关键字参数之前
- 关键字参数后面不能再有位置参数
- 不能对同一个形参多次传值
三、默认参数
-
一个参数在函数定义时,就已经赋值给它一个默认值,则称之为默认参数。
-
在调用时,不给默认参数传参,则他会使用默认值;如果给默认参数传参,则使用传入的值。
def foo(a, b=1): # 给了b一个默认值:1 pass foo(a=1) # 没有给b传值,使用默认值:1
注意:默认参数必须在所有位置参数的最右边!
-
默认参数的默认值,是在函数定义阶段完成赋值的:
a = '默认值' def foo(x=a): # 定义时进行赋值 print(x) a = '新的值' # x已经赋值了:默认值,所以a的改变不影响x的值 foo() # 这里还是会打印:默认值
四、可变长参数
-
定义:
可变长参数可以接收若干实参。当我们不确定函数会接收到几个参数的时候,就可以使用可变参数。
当调用时,传入的实参数量超过了形参的数量,多余的实参就会被可变长参数接收。
-
格式:
重点在于变量名前面的 * 符号,变量名可以随便取。
def foo(a, *args, **kwargs): pass
-
*接收若干位置参数,被打包成元组保存到变量args中。
-
**接收若干关键字参数,被打包成字典保存到变量kwargs中。
-
-
实参解包:
在调用时,可以用*将容器类型解包,直接以位置参数的形式赋值给形参:
def foo(a, b, c): print(a, b, c) t = (1, 2, 3) foo(*t) # 打印:1 2 3
使用**可将字典 解包,以关键字参数的形式赋值给形参,但字典的键必须是形参的名字:
def foo(a, b, c): print(a, b, c) d = {'a': 1, 'b': 2, 'c': 3} foo(**d) # 打印:1 2 3