immutable — 不可变

具有固定值的对象。不可变对象包括数字、字符串和元组。这样的对象不能被改变。如果必须存储一个不同的值,则必须创建新的对象。它们在需要常量哈希值的地方起着重要作用,例如作为字典中的键。

parameter — 形参

function (或方法)定义中的命名实体,它指定函数可以接受的一个 argument (或在某些情况下,多个实参)。有五种形参:

  • positional-or-keyword:位置或关键字,指定一个可以作为 位置参数 传入也可以作为 关键字参数 传入的实参。这是默认的形参类型,例如下面的 foobar:

def func(foo, bar=None):`

  • positional-only:仅限位置,指定一个只能通过位置传入的参数。 仅限位置形参可通过在函数定义的形参列表中它们之后包含一个 / 字符来定义, 如果函数定义中没有 /,则表示没有仅限位置形参。例如下面的 posonly1posonly2:

def func(posonly1, posonly2, /, positional_or_keyword): …

  • keyword-only:仅限关键字,指定一个只能通过关键字传入的参数。仅限关键字形参可通过在函数定义的形参列表中包含单个可变位置形参或者在多个可变位置形参之前放一个 * 来定义,例如下面的 kw_only1kw_only2:

def func(arg, *, kw_only1, kw_only2): …

  • var-positional:可变位置,指定可以提供由一个任意数量的位置参数构成的序列(附加在其他形参已接受的位置参数之后)。这种形参可通过在形参名称前加缀 * 来定义,例如下面的 args:

def func(args, *kwargs): …

  • var-keyword:可变关键字,指定可以提供任意数量的关键字参数(附加在其他形参已接受的关键字参数之后)。这种形参可通过在形参名称前加缀 ** 来定义,例如上面的 kwargs

形参可以同时指定可选和必选参数,也可以为某些可选参数指定默认值。
注意事项:

  • 形参顺序:仅限位置,位置或关键字,仅限关键字,kwargs;或者:仅限位置,位置或关键字,*args, 仅限关键字,kwargs.
  • 在函数调用时,位置或关键字参数既可以用位置来传参,也可以用关键字来传参,只需记得关键字参数必须跟随在位置参数的后面。最简单的调用方式就是各用各的,该是位置参数就用位置传参,该是关键字参数就用关键字传参。
  • 传递的所有关键字参数必须与函数接受的其中一个参数匹配,它们的顺序并不重要。这也包括非可选参数。
  • 默认值只会执行一次。这条规则在默认值为可变对象(列表、字典以及大多数类实例)时很重要。
  • 不能对同一个参数多次赋值。
  • 仅限位置形参的名称可以在 **kwds 中使用而不产生歧义。
  • 出现在 *args 参数之后的任何形式参数都是 ‘仅限关键字参数’,也就是说它们只能作为关键字参数而不能是位置参数。 *args* 不能同时使用,因为*args就决定了位于它后面的参数是仅限关键字参数。

    概括

    用例将确定要在函数定义中使用的参数:
    def f(pos1, pos2, /, pos_or_kwd, , kwd1, kwd2, **kwargs):
    def f(pos1, pos2, /, pos_or_kwd,
    args, **kwargs):
    作为指导:

  • 如果你希望形参名称对用户来说不可用,则使用仅限位置形参。 这适用于形参名称没有实际意义,以及当你希望强制规定调用时的参数顺序,或是需要同时收受一些位置形参和任意关键字形参等情况。

  • 当形参名称有实际意义,以及显式指定形参名称可使函数定义更易理解,或者当你想要防止用户过于依赖传入参数的位置时,则使用仅限关键字形参。