'''
位置参数:
位置形参:函数定义时,从左往右写的参数
位置实参:函数调用时,从左往右写的参数
'''
def func(a, b):
print(a, b)
func(1, 2)
# 1, 2
'''
关键参数:
正常情况下,给函数传参数,要按顺序。如果不想按顺序,就用关键参数。
指定参数名的参数,就叫做关键参数。
函数调用时:func(a=1, b=2), 这种指定了参数名的参数,就是关键参数。
调用函数时,关键参数可以和位置参数一起用,但是关键参数必须在位置参数的后面。不然会报错。
利用关键字传参的是时候,要么全部参数都用关键字传参,要么就必须按照顺序
'''
def func1(a, b, c):
print(a, b, c)
func1(10, 20, c=30)
# 10, 20, 30
'''
默认参数:
函数定义时,默认参数必须在位置形参的后面。
函数调用时,指定参数名的参数,叫关键参数。
而在函数定义时,给参数名指定值的时候,这个参数叫做默认参数。
关键参数,和默认参数两个参数写法一样,区别在于:
关键参数是在函数调用时,指定实参的参数名,也可以说指定值的参数名。
默认参数是在函数定义时,指定参数名的值。
'''
def func2(a, b, c=30):
print(a, b, c)
func2(10, 20, 40)
# 10, 20, 40
'''
动态参数:*args **kwargs
*args
针对函数定义时的*:
def func(a, b, *args):
pass
*args会接收函数调用时,传入的多余的位置实参。
*args 是一个元组
*kwargs
针对函数定义时,站在形参的角度看 **
接收多余的关键实参,成为一个字典dict。
字典的key是关键实参的变量名,字典的value是关键实参的值。
将字典交给**后面的变量名,这里是kwargs
'''
def func3(a, b, *args):
print(a, b, args)
func3(10, 20, 30, 40)
# 10, 20, (30, 40)
'''
函数定义时:
从左往右:位置形参 > *args > 默认参数 > **kwargs
位置形参 > 默认参数 > *args > **kwargs 也可以。
因为函数调用时给的实参满足了位置形参、默认参数之后,会把多余的位置实参给args。这样并不会报错。
但是 **kwargs 必须在 *args后面
默认形参必须在位置形参后面
函数调用时:
从左往右:位置实参 > *args > 关键参数 > **kwargs
因为 *args 在函数调用时,会被打散成位置实参,而关键参数必须在位置实参的后面,否则会报错。SyntaxError: positional argument follows keyword argument
*args 必须在 **kwargs后面, 否则会报语法错误:SyntaxError: iterable argument unpacking follows keyword argument unpacking
注意:用了*之后,*后面的参数必须以关键字传参,并且用了*之后,不能再接收不定个数的位置参数。
'''
def func4(a, b, c=10, *args, **kwargs):
print(a, b, c, args, kwargs)
func4(10, 20, 30, e=100)
# 10,20,30,(),{'e':100}
def func5(a, b, *args, c=30, **kwargs):
print(a, b, c, args, kwargs)
func5(10, 20, 30, e=100)
# 10,20,30,(30,),{'e':100}
def func6(a, b, *, c=10, d=30, **kwargs):
print(a, b, c, d, kwargs)
func6(10, 20)
# 10,20,10,30,{}