关于Python的参数,在各种代码中看到最多的可能就是def func(*args, **kw)这种参数组合,这篇文章就来讨论我们是如何一步一步来得到这样的参数组合。

概述

Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。

位置参数

位置参数是我们最常见的函数参数,例如下面完成幂运算的pow函数:

def pow(x, n):
s = 1
while n > 0:
    n = n - 1
    s = s * x
return s

pow(x, n)函数有两个参数:xn,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋值给参数xn

默认参数

由于我们经常计算x^2,所以,完全可以把第二个参数n的默认值设定为2:、

def pow(x, n=2):
s = 1
while n > 0:
    n = n - 1
    s = s * x
return s

这样,我们在调用pow(5)时,相当于调用pow(5, 2)

>>> power(5)
25
>>> power(5, 2)
25

设置默认参数时,有几点需要注意:

  • 必选参数在前,默认参数在后,否则Python编译器会报错;
  • 当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
  • 也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上。

默认参数有个最大的坑,如下:

>>> def add_end(L=[]):
...     L.append('END')
...     return L
... 
>>> add_end()
['END']
>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']

我们发现,每次使用默认参数调用add_end()函数时,都会“记住“上一次调用的结果。

原因如下:

Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。

所以,默认参数必须指向不可变对象!!!

最后修改:2020 年 10 月 23 日 03 : 30 PM
如果觉得我的文章对你有用,请随意赞赏