函数定义支持可变数量的参数

  • 1、 默认值参数
  • 2、默认值只计算一次。默认值为列表、字典或类实例等可变对象时,会产生与该规则不同的结果
  • 3、关键字参数
  • 4、特殊参数
  • 5、解包实参列表


1、 默认值参数

为参数指定默认值是非常有用的方式,调用函数时可以使用比定义时更少的参数

>>> def ask_ok(prompt,retries = 4,reminder:'abcd'):
...     ..........
...

调用此函数的方式:

  • 只给出必选参数:
>>> ask_ok('hello')
  • 给出一个可选参数:
>>> ask_ok('hello',2)
  • 给出所有实参
>>> ask_ok('hello',2,'world')

2、默认值只计算一次。默认值为列表、字典或类实例等可变对象时,会产生与该规则不同的结果

例如:
>>> def stu(a,L = []):
...     L.append(a)
...     return L
...
>>> print(stu(1))
[1]
>>> print(stu(2))
[1, 2]
>>> print(stu(3))
[1, 2, 3]
>>>
正确写法:

>>> def stu(a,L=None):
...     if L is None:
...             L=[]
...     L.append(a)
...     return L

3、关键字参数

kwarg = value 形式的参数也可用于调用函数

注意:关键字参数在输出结果中的顺序与调用函数时的顺序一致

4、特殊参数

函数中定义未使用/和*时,参数可以按位置或关键字传递给函数

  • 仅未知参数

仅限位置时,形参的顺序很重要,且这些形参不能用关键字传递,仅限位置形参应放在/前。/用于在逻辑上分割仅限位置形参与其它形参。
/后可以是位置或关键字或权限关键字形参

  • 仅限关键字参数:

把形参标记为仅限关键字,表明必须以关键字参数形式传递形参,应在参数列表中第一个,仅限关键字形参前加*

>>> def stu_arg(arg):

>>> def stu_arg(arg,/):

>>> def stu_arg(*,arg):

>>> def stu_arg(pos_only,/,stand,*,kwd_only):

仅限位置形参参-------让用户无法使用形参名,防止未来修改形参名时造成破坏性的API变动
关键字参数---------显示名称可以让函数定义更容易理解,防止用户依赖传 递位置参数

5、解包实参列表

  • 函数调用要求独立的位置参数,且实参在列表或元组里时,要求执行相反的操作

例如:range()函数要求独立的start和stop实参
如果这些参数不是独立的,则要在调用函数时,用*操作符把参数从列表或元祖解包出来

>>> args = [1,2,3]
>>> List(range(*args))
  • 字典可以用**操作符传递关键字参数
>>> d = {'name':'zxb','age':'18','sex':'man'}
>>> parrot(**d)