淺析 Python 函數的參數

一、前言

Python 的函數定義非常簡單,但靈活度卻非常大。除了正常定義的必選參數外,還可以使用默認參數、可變參數和關鍵字參數,使得函數定義出來的接口,不但能處理複雜的參數,還可以簡化調用者的代碼。

二、可變參數

在 Python 函數中,還可以定義可變參數。顧名思義,可變參數就是傳入的參數個數是可變的,可以是 1 個、2 個到任意個,還可以是 0 個。

案例:請計算 a2 + b2 + c2 + ……。

以數學題爲例子,給定一組數字 a,b,c……,

要定義出這個函數,必須確定輸入的參數。由於參數個數不確定,首先想到可以把 a,b,c…… 作爲一個 list 或 tuple 傳進來。

函數可以定義如下:

def calc(numbers):   
  sum = 0    
  for n in numbers:       
    sum = sum + n * n   
  return sum

但是調用的時候,需要先組裝出一個 list 或 tuple:

print(calc([1, 2, 3]))
#結果:14
print(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 個參數:

print(calc(1, 2))
#結果:5
print(calc())
#結果:0

如果已經有一個 list 或者 tuple,要調用一個可變參數怎麼辦?

例:

nums = [1, 2, 3]
print(calc(nums[0], nums[1], nums[2]))

這種寫法當然是可行的,問題是太繁瑣。

所以 Python 允許在 list 或 tuple 前面加一個 * 號,把 list 或 tuple 的元素變成可變參數傳進去:

nums = [1, 2, 3]
calc(*nums)

*nums 表示把 nums 這個 list 的所有元素作爲可變參數傳進去。這種寫法相當有用,而且很常見。

三、關鍵字參數

可變參數允許傳入 0 個或任意個參數,這些可變參數在函數調用時自動組裝爲一個 tuple。

而關鍵字參數允許傳入 0 個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個 dict。請看示例:

def person(name, age, **kw):    
  print('name:', name, 'age:', age, 'other:', kw)

函數 person 除了必選參數 name 和 age 外,還接受關鍵字參數 kw。在調用該函數時,可以只傳入必選參數:

person('Michael', 30)

運行結果:

也可以傳入任意個數的關鍵字參數:

extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, **extra)

關鍵字參數有什麼用?

它可以擴展函數的功能。

比如,在 person 函數里,保證能接收到 name 和 age 這兩個參數,但是,如果調用者願意提供更多的參數,也能收到。

試想正在做一個用戶註冊的功能,除了用戶名和年齡是必填項外,其他都是可選項,利用關鍵字參數來定義這個函數就能滿足註冊的需求。

extra 表示把 extra 這個 dict 的所有 key-value 用關鍵字參數傳入到函數的 **kw 參數,kw 將獲得一個 dict,注意 kw 獲得的 dict 是 extra 的一份拷貝,對 kw 的改動不會影響到函數外的 extra。

四、總結

本文基於 Python 基礎,介紹了 Python 函數的參數。Python 的函數具有非常靈活的參數形態,既可以實現簡單的調用,又可以傳入非常複雜的參數。介紹了常見的可變參數,關鍵字的參數。

通過案例的分析,進行詳細的講解。在實際應用中,需要注意的點,遇到的難點,提供有效的解決方法,希望能幫助你更好的學習。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/d4ND-3elPHmFLABN3jijog