python之函数的参数
函数的参数(重要)
函数的参数可以分为两大类:
- 形参:形式参数,函数在定义阶段括号内所写的参数,在函数调用时会被取代的参数。
- 实参:实际参数,函数在调用阶段括号内所写的参数,用于取代形参进入函数。
def my_func(a, b):
pass
my_func(1, 2)
"""
在上述例子中,a和b就是形参,1和2就是实参
在调用函数时,1和2会临时取代a和b,函数内代码执行完后,1和2就会离开a和b,这是a和b就会等待下一次函数调用
"""
位置参数
在函数的调用过程中,括号内传入的实参必须与定义函数括号内的形参一一对应,从左往右挨个绑定。
def my_func(a, b):
print(a, b)
my_func('tom', 123) # 输出:tom 123
my_func(123, 'tom') # 输出:123 tom
my_func(123) # 报错
my_func(123, 45, 7) # 报错
my_func() # 报错
主要注意两点:
- 按顺序传参,不然会乱
- 传参不能多也不能少,要刚刚好
关键字参数
在给函数传参过程中我们可以指定给形参传值。
def my_func(a, b, c):
print(a, b, c)
my_func(b=123,c='jason', a='tom') # 输出:tom 123 jason
my_func(123, b='tom', c='jason') # 输出:123 tom jason 相当于位置参数
my_func(123, b='jason', 'tom') # 报错 关键字传值必须要在位置参数的后面
my_func(123, 'jason', b='tom') # 报错 不能重复传值
主要注意两点:
- 关键字参数必须要在位置参数的后面
- 不能重复传值
默认参数
如果在函数定义阶段时,就已经给形参赋值了,那我们称这个为默认参数。
调用函数时如果不传值则会使用定义阶段赋给它的值,传值的话就是使用传的值。
默认参数的出现也打破了形参与实参之间个数一致的情况。
# 默认参数在定义是必须要放在位置参数后面
def my_func(a, b, c=123):
print(a, b, c)
my_func('tom', 'jason') # 输出:tom jason 123
my_func('tom', 'jason', 456) # 输出:tom jason 456
主要注意两点:
- 定义函数时默认参数必须要放在位置参数后面
- 不传参数用默认,传了参数用传的
可变长参数(重要)
如果此时有一串数据要传入函数,不知道有多少个,那么应该如何定义函数呢?
这个时候就需要用到可变长形参了,它可以接收数个参数。
可变长形参(*变量名)
可以接受多余的位置参数,并将多余参数转换成元组类型赋值给*后面的变量名。
def my_func(a, b, *c): # *c就是可变长形参
print(a, b, c)
my_func(1, 2) # 输出:1 2 ()
my_func(1, 2, 3, 4, 5) # 输出:1 2 (3, 4, 5)
my_func(1) # 报错 位置参数只能多,不能少
主要注意两点:
- 位置参数只能多,不能少
- 定义可变长形参时如果放在位置参数前面,那么后面的位置参数需要用关键字传参
可变长形参(**变量名)
可以接受多余的关键字参数,并将多余参数转换成字典类型赋值给**后面的变量名。
def my_func(a, b, **c): # **c就是可变长形参
print(a, b, c)
my_func(1, 2) # 输出:1 2 {}
my_func(1, 2, c=3, d=4, e=5) # 输出:1 2 {'d': 3, 'e': 4, 'f': 5}
my_func(1) # 报错 位置参数b没有拿到值
my_func(1, 2, 3) # 报错 多余的参数必须要用关键字传参
主要注意两点:
- 位置参数要对应
- 多余的参数必须要用关键字传参
拓展
如何定义一个无论接收多少个任意类型的参数都可以正常执行的函数?
# 可以传入数个任意类型参数
def my_func(*args, **kwargs):
print(args, kwargs)
"""小补充:针对这*和**后面的变量名,我们推荐都这么写:*args和**kwargs"""
*与**在实参中的用处
*与**不仅可以在形参中使用,还能在实参中使用。
def my_func(*args, **kwargs):
print(args, kwargs)
# *的使用,可以将列表或者元组打散成位置参数一一传入
my_func(*[5, 6, 7, 'tom']) # 等价于my_func(5, 6, 7, 'tom')
my_func(*(5, 6, 7, 'tom')) # 等价于my_func(5, 6, 7, 'tom')
"""*里面不能有字典类型,不然会报错"""
# **的使用,可以将字典打散成关键字参数一一传入
my_func(**{'a':1, 'b':2}) # 等价于my_func(a=1, b=2)