在Python
中,除了正常定义的参数外,Python
还可以使用默认参数,可变参数,关键字参数,使得函数的灵活度非常大。
默认参数
下面的例子中,就是默认参数的运用
def sayHi(name,city='beijing',age=18):
print('my name is',name,'. I\'m from',city,'. my age',age)
sayHi('Lisa',age=20)
上面的例子中就是一个默认参数的使用,在调用函数是,如果定义了默认参数,没有传递参数的话,那么就会使用默认的参数。有多个默认参数时,调用的时候,既可以按顺序提供默认参数,也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上。
默认参数很有用,但使用不当,也会掉坑里。默认参数有个最大的坑,演示如下:
def add_end(L=[]):
L.append('END')
return L
add_end()
add_end()
如果是正常调用,结果似乎是没问题,可如果是多次调用,那么输出就成了下面这样
>>> add_end()
['END']
>>> add_end()
['END', 'END']
为什么会这样呢,Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。
定义默认参数要牢记一点:默认参数必须指向不变对象!
可变参数
在Python
中,是可以定义可变参数的,顾名思义就是说可变参数传入的参数个数不定,举一个例子
def add(n):
ar = 0
for x in n:
ar = ar + x
print(ar)
return ar
add([1,2,5,7])
如何是可变参数的话,我们只需要
def add(*n):
ar = 0
for x in n:
ar = ar + x
print(ar)
return ar
add(1,2,5,7)
定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数:
def add(*n):
print(type(*n))
add()
这里我们拿到的是一个元组,当你传已给可变参数的时候,Python会自己将收到的参数变成一个元组,那么,如果你想要传一个元组或者数组参数改怎么办呢
nums = [1,2,3,4,5]
add(*nums)
*nums
表示把 nums
这个 list
的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。
网友评论