1. 程式人生 > 其它 >python 函式教程:必選引數與預設引數

python 函式教程:必選引數與預設引數

技術標籤:程式語言python

必選引數

位置引數須以正確的順序傳入函式。呼叫時的數量必須和宣告時的一樣。

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']

因為不變物件一旦建立,物件內部的資料就不能修改,這樣就減少了由於修改資料導致的錯誤。此外,由於物件不變,多工環境下同時讀取物件不需要加鎖,同時讀一點問題都沒有。我們在編寫程式時,如果可以設計一個不變物件,那就儘量設計成不變物件。