#### 默認參數
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)