参数

    • 参数的传递是通过自动将对象赋值给本地变量名来实现的(自动的隐式赋值)
    • 在函数内部的参数名赋值不会影响到实参对象,只是将变量名重新引用到另一个对象
    • 若实参对象为可变对象,则在函数内原地修改参数对象会影响所有的指向该实参对象的引用

      可变参数实参对象对函数来说,既可以作为输入也可以作为输出

      如果想限制对可变实参对象的修改,可以创建一个可变对象的拷贝作为参数;
      或者直接转换成不可变对象作为参数

    2.默认情况下,参数匹配是通过其位置进行匹配的,从左到右一一匹配。必须精确传递和函数签名中参数名一样多的实参。

    3.关键字参数:允许通过变量名进行匹配,而不是通过位置。其中关键字顺序可以任意。
    关键字参数

    4.默认参数:函数定义时,可以为参数设定默认值,这样允许调用时传递较少的参数。

    • 默认实参后面不能跟随非默认实参。如果出现这种情况则报语法错误。
    • 函数能用特定的参数(以开头),收集任意多的额外位置参数,将收集到的位置相关的参数到一个新元组中。

      若出现了额外的关键字参数,则报错

      可变位置参数

    • 函数能用特定的参数(以**开头),收集任意多的额外关键字参数,将收集关键字相关的参数到一个新字典中。

    6.可变参数解包:

    • 调用者可以用**语法将字典实参打散,形成关键字参数

      这里的***均是在函数调用中出现,而不是在函数定义中出现

    7.keyword-only参数:在Python3中,它是一种命名参数,出现在*参数之后,在参数之前。所有的keyword-only参数必须使用关键字语法传递。

    keyword-only参数

    8.函数调用时,位置参数与关键字参数可以组合

    • 不能为同一个形参同时指定位置实参与关键字实参
    • 任何关键字实参必须位于任何位置实参之后

    9.函数定义时的参数类型顺序:

    • 调用时必须先赋值形参c,才能进入d。无法跳过c去赋值d
    • e,f,g调用时必须都是关键字实参

    10.函数调用时实参类型顺序:

    1. func('a','b',e='e',*seq,**dic)
    2. #e='e'这个关键字实参也可以位于'b'之后的任何位置
    3. #关键字实参必须位于位置实参之后

    函数定义与调用时参数匹配顺序

    • 通过位置分配位置参数
    • 通过匹配变量名在分配关键字参数
    • 额外的非关键字参数分配到 d引用的元组中
    • 默认值分配给剩下未赋值的参数

    Python最后检测确保每一个参数只传入了一个值

    11.定义函数时,形参列表中*可以单独出现。此时函数并不表示接受一个可变长度的实参列表,而是表示*后面的所有实参必须作为关键字实参传入: