函数的参数问题

'''
位置参数:
    位置形参:函数定义时,从左往右写的参数
    位置实参:函数调用时,从左往右写的参数
'''


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,{}

你可能感兴趣的:(函数的参数问题)