python 函式教程:必選引數與預設引數
阿新 • • 發佈:2021-01-14
必選引數
位置引數須以正確的順序傳入函式。呼叫時的數量必須和宣告時的一樣。
def power(x, n):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
print(pow(5,3)) #125
修改後的power(x, n)函式有兩個引數:x和n,這兩個引數都是位置引數,呼叫函式時,傳入的兩個值按照位置順序依次賦給引數x和n。
預設引數
'''
遇到問題沒人解答?小編建立了一個Python學習交流QQ群:778463939
尋找有志同道合的小夥伴,互幫互助,群裡還有不錯的視訊學習教程和PDF電子書!
'''
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
print(power(5)) #25
print(pow(3,3)) #27
預設引數可以簡化函式的呼叫。設定預設引數時必選引數在前,預設引數在後。
有多個預設引數時,呼叫的時候,既可以按順序提供預設引數:
def enroll(name, gender, age=6, city='Beijing'):
print('name:', name)
print('gender:', gender)
print('age:', age)
print('city:', city)
enroll('Bob', 'M', 7)
輸出:
name: Bob
gender: M
age: 7
city: Beijing
也可以不按順序提供部分預設引數。當不按順序提供部分預設引數時,需要把引數名寫上:
enroll('Adam', 'M', city='Tianjin')
輸出:
name: Adam
gender: M
age: 6
city: Tianjin
意思是,city引數用傳進去的值,其他預設引數繼續使用預設值。
預設引數必須指向不變物件
定義函式:
'''
遇到問題沒人解答?小編建立了一個Python學習交流QQ群:778463939
尋找有志同道合的小夥伴,互幫互助,群裡還有不錯的視訊學習教程和PDF電子書!
'''
def add_end(L=[]):
L.append('END')
return L
正常呼叫時:
L1 = add_end([1, 2, 3])
print(L1) #[1, 2, 3, 'END']
L2 = add_end(['x', 'y', 'z'])
print(L2) #['x', 'y', 'z', 'END']
但如果使用預設呼叫:
L1 = add_end()
print(L1) #['END']
L2 = add_end()
print(L2) #['END', 'END']
L3 = add_end()
print(L3) #['END', 'END', 'END']
預設引數是[],但是函式似乎每次都“記住了”上次添加了’END’後的list。
原因解釋如下:
Python函式在定義的時候,預設引數L的值就被計算出來了,即[],因為預設引數L也是一個變數,它指向物件[],每次呼叫該函式,如果改變了L的內容,則下次呼叫時,預設引數的內容就變了,不再是函式定義時的[]了。
要修改上面的例子,我們可以用None這個不變物件來實現:
'''
遇到問題沒人解答?小編建立了一個Python學習交流QQ群:778463939
尋找有志同道合的小夥伴,互幫互助,群裡還有不錯的視訊學習教程和PDF電子書!
'''
def add_end(L=None):
if L is None:
L = []
L.append('END')
return L
L1 = add_end()
print(L1) #['END']
L2 = add_end()
print(L2) #['END']
L3 = add_end()
print(L3) #['END']
因為不變物件一旦建立,物件內部的資料就不能修改,這樣就減少了由於修改資料導致的錯誤。此外,由於物件不變,多工環境下同時讀取物件不需要加鎖,同時讀一點問題都沒有。我們在編寫程式時,如果可以設計一個不變物件,那就儘量設計成不變物件。