函数的传参方式有多种,位置参数、关键字参数、缺省参数、不定长参数。不过我们最常用的可能是位置参数,接下来让我们了解一下我们的参数
一、位置参数
调用函数时,编译器会将函数的实际参数按照位置顺序依次传递给形式参数,即将第1个实际参数传递给第1个形式参数,将第2个实际参数传递给第2个形式参数,依此类推。
其实也就是传递的参数和定义的参数顺序和个数一样。
举个例子
def xuesheng(name,age,gender):
print(f'学生的名字是{name},年龄是{age},性别是{gender}')
#这是我们定义函数,所以我们调用时就应该按name、age、gender的顺序来
xuesheng('李华',18,'男')
输出的结果是
学生的名字是李华,年龄是18,性别是男
二、关键字参数
使用位置参数传值时,如果函数中存在多个参数,记住每个参数的位置及其含义并不是一件容易的事,此时可以使用关键字参数进行传递。关键字参数传递通过“形式参数 = 实际参数”(“键 = 值”)的格式将实际参数与形式参数相关联,根据形式参数的名称进行参数传递。
示例
def xuesheng(name,age,gender):
print(f'学生的名字是{name},年龄是{age},性别是{gender}')
xuesheng(name = '李华',age = 18,gender = '男')
此时调用时括号里的age = 18,name = '李华',gender = '男'的顺序是可以打乱的,输出结果都不变
学生的名字是李华,年龄是18,性别是男
当我们函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间顺序可以改变,记住位置参数是一一对应的,不要把后面的写前面来了
def xuesheng(name,age,gender):
print(f'学生的名字是{name},年龄是{age},性别是{gender}')
#两种都有时,前面位置参数只可能是名字,不会是年龄和性别,位置参数是有顺序的
xuesheng('李华',gender = '男',age = '18')
关键字参数作用:可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求
三、缺省参数(也称默认参数)
定义函数时可以指定形式参数的默认值,调用函数时,若没有给带有默认值的形式参数传值,则直接使用参数的默认值;若给带有默认值的形式参数传值,则实际参数的值会覆盖默认值。但要注意的时所有位置参数必须出现在默认参数之前,包括函数定义与调用。
示例
def xuesheng(name,age,gender = '男'):
print(f'学生的名字是{name},年龄是{age},性别是{gender}')
xuesheng('李华','18')
结果与前面还是一样,李华的输出信息没改变,如果我们在默认值那改成女,结果输出就是女(当然也可以在默认为男的时候传值进去,把他改成女)
四、不定长参数
若要传入函数中的参数的个数不确定,可以使用不定长参数。不定长参数也称可变参数,此种参数接收参数的数量可以任意改变。他的类型分为位置传递和关键字传递。
先提前说明一下*args 和 **kwargs 不是特殊的参数,只是编程人员约定的变量名字,args 是 arguments 的缩写,表示位置参数;kwargs 是 keyword arguments 的缩写,表示关键字参数。 其实并不是一定要写成 *args 和 **kwargs ,只有前面的 * (星号)才是必须的
1.位置传递
def test(*args):
print(args)
print(type(args))
#调用函数,传入任意个参数
test(1,2,3,'我','是','李华')
不定长参数*args用于接收不定数量的位置参数,调用函数时传入的所有参数被*args接收后以元组形式保存.
#以元组形式存在
(1, 2, 3, '我', '是', '李华')
<class 'tuple'>
2关键字参数
传入参数要以“键 = 值”的形式才会被接受
def test(**kwargs):
print(kwargs)
print(type(kwargs))
#调用函数,传入任意个参数
test(a = '不',b = '爱',c = '作文')
不定长参数**kwargs用于接收不定数量的关键字参数,调用函数时传入的所有参数被**kwargs接收后以字典形式保存下来。
{'a': '不', 'b': '爱', 'c': '作文'}
<class 'dict'>
小结:
1 位置参数一定要按顺序
2 关键字参数必须以”键 = 值“的形式,如果和位置参数混用,位置参数一定要放前
3 缺省参数默认值一定要放最后
4 不定长参数要分清位置不定长和关键字不定长,前者以元组形式接收,"*"号不能忘,
后者以字典形式接收,"**"不能忘