#### 默认参数
Python中的函数定义以及参数的使用:
定义函数要使用def+函数名
~~~
def enroll(name,gender,age = 6,city = 'Beijing'):
print(name)
print(gender)
print(age)
print(city)
enroll('Billy','Six')
~~~
这里使用了默认参数,降低了函数调用的难度,而一旦需要更复杂的调用时,又可以传递更多的参数来实现。无论是简单调用还是复杂调用,函数只需要定义一个。
默认参数的坑:先定义一个函数,传入一个list,添加一个END再返回:
~~~
def add_end(L=[]):
L.append('END')
return L
add_end([1,2,3])
~~~
正常调用的时候没有错误,但是如果使用默认参数多次调用的话:
~~~
print(add_end())
print(add_end())
print(add_end())
print(add_end())
~~~
结果会是:
[‘END’]
[‘END’, ‘END’]
[‘END’, ‘END’, ‘END’]
[‘END’, ‘END’, ‘END’, ‘END’]
Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。
所以,定义默认参数要牢记一点:默认参数必须指向不变对象!
要修改上面的例子,可以使用None这个不变对象来实现:
~~~
def add_end(L=None):
if L is None:
L = []
L.append('END')
return L
~~~
#### 可变参数
在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
我们以数学题为例子,给定一组数字a,b,c……,请计算a2 + b2 + c2 + ……。
要定义出这个函数,我们必须确定输入的参数。由于参数个数不确定,我们首先想到可以把a,b,c……作为一个list或tuple传进来,这样,函数可以定义如下:
~~~
def calc(numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
~~~
但是调用的时候,需要先组装出一个list或tuple:
calc([1, 2, 3])
14
calc((1, 3, 5, 7))
84
如果利用可变参数,调用函数的方式可以简化成这样:
calc(1, 2, 3)
14
calc(1, 3, 5, 7)
84
所以,我们把函数的参数改为可变参数:
~~~
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
~~~
定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数:
calc(1, 2)
5
calc()
0
如果已经有一个list或者tuple,要调用一个可变参数怎么办?可以这样做:
nums = [1, 2, 3]
calc(nums[0], nums[1], nums[2])
14
这种写法当然是可行的,问题是太繁琐,所以Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:
nums = [1, 2, 3]
calc(*nums)
14
*nums表示把nums这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。
转载自 :[廖雪峰的官方网站:函数的参数](http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431752945034eb82ac80a3e64b9bb4929b16eeed1eb9000)