­

[Python]函數的各種傳參

  • 2020 年 3 月 10 日
  • 筆記
原創文章

文章目錄
  • @[toc]

  • 0. 環境
  • 1. 位置參數
  • 2. 默認參數
  • 3. 可變參數
    • 3.1. 用法
    • 3.2. 簡潔調用方法
  • 4. 關鍵字參數
    • 4.1. 用法
    • 4.2. 簡潔調用方法
    • 4.3. 檢查關鍵字參數
  • 5. 命名關鍵字參數
    • 5.1. 用法
    • 5.2.. 特殊情況
  • 6. 組合參數
  • 7. 參考文獻

Python函數的各種傳參

0. 環境

  • python3.6

1. 位置參數

沒什麼好說的,和C++語言都一樣,不過調用起來有點方便,就以冪運算為例吧。

# x是底數,n為冪次  def power(x, n):      ret = 1      while n > 0:          n = n - 1          ret = ret * x        return ret

調用函數的時候,一個蘿蔔一個坑,按部就班就ok了

>> power(3,2)  >> 9

2. 默認參數

# x是底數,n為冪次(默認函數執行平方運算)  def power(x, n=2):      ret = 1      while n > 0:          n = n - 1          ret = ret * x        return ret
>> power(3)  9  >>

這也和C++中定義函數一樣,可以在聲明中設置默認參數,不過要注意的是:

必須設定參數在前(如函數中的底數x),默認參數(如函數中的冪次n)在後,否則Python的解釋器會報錯

這樣做的好處是什麼?當然是調用起來省事啦,懶惰才是第一生產力!

注意:

設定默認參數時,默認值必須是一個不變的對象,比如說上述例子中n=2中的2

3. 可變參數

3.1. 用法

編寫一個函數sum()可以計算傳入變數的和。

def sum(*numbers):      ret = 0      print(type(numbers))  # 測試參數類型      for n in numbers:          ret = ret + n      return ret
>> print(sum(1, 2, 3, 4, 5))  <class 'tuple'>  15  >> print(sum())  <class 'tuple'>  0  >>

可以看出,在定義函數時,在參數前面加入一個*,就可以使得函數內部得到一個tuple數組。

3.2. 簡潔調用方法

如果已經有了一個list或是tuple,要傳入一個有可變參數的函數,有兩種方法。

  • 方法1:list或是tuple用下標,一個一個傳入(麻煩
  • 方法2: 在傳入參數(list或是tuple)的變數名前加*(有點類似C語言指針的用法,自己體會一下吧)
>> ns = [1, 2, 3]  # 方法1(麻煩)  >> sum(ns[0], ns[1], ns[2])      # 方法2(推薦)  >> sum(*ns)

4. 關鍵字參數

4.1. 用法

  • 可變參數 允許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝為一個tuple
  • 關鍵字參數 允許你傳入0個或任意個參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict
def car(brand, price, **kw):      print("brand: ", brand)      print("price: ", price)      print("kw: ", kw)      print("type(kw): ", type(kw))
# 情況1  >> car('Volkswagen', '9999')  brand:  Volkswagen  price:  9999  kw:  {}  type(kw):  <class 'dict'>  >>    # 情況2  >> car('Volkswagen', '9999', place='Germany', salePlace='China')  brand:  Volkswagen  price:  9999  kw:  {'place': 'Germany', 'salePlace': 'China'}  type(kw):  <class 'dict'>  >> 

4.2. 簡潔調用方法

類似3.2節,如果已經有了一個字典dict,可以在調用函數時把它當做關鍵字參數傳入進入,只需要在前面變數名前加**

>> extraParam = {'place': 'Germany', 'salePlace': 'China'}  >> car('Volkswagen', '9999', **extraParam)  brand:  Volkswagen  price:  9999  kw:  {'place': 'Germany', 'salePlace': 'China'}  type(kw):  <class 'dict'>  >> 

4.3. 檢查關鍵字參數

其實就是檢查字典dict

def car(brand, price, **kw):      print("brand: ", brand)      print("price: ", price)      print("kw: ", kw)      print("type(kw): ", type(kw))        # 檢查程式碼      if 'place' in kw:      	# 有place這個參數      	pass      if 'salePlace' in kw:      	# 有salePlace這個參數      	pass

5. 命名關鍵字參數

5.1. 用法

如果要 限制 關鍵字參數名字,就可以用 命名關鍵字參數,例如,只接收placesalePlace作為 關鍵字參數。這種方式定義的函數如下所示:

def car2(brand, price, *, place, salePlace):      print("brand: ", brand)      print("price: ", price)      print("place: ", place)      print("salePlace: ", salePlace)      print("type(place): ", type(place))      print("type(salePlace): ", type(salePlace))

和關鍵字參數**kw不同,命名關鍵字參數需要一個特殊分隔符**後面的參數被視為命名關鍵字參數

運行情況:

# 情況1  >> car2('Volkswagen', '9999', place='Germany', salePlace='China')  brand:  Volkswagen  price:  9999  place:  Germany  salePlace:  China  type(place):  <class 'str'>  type(salePlace):  <class 'str'>    # 情況2  >> car2('Volkswagen', '9999', 'Germany', 'China')  Traceback (most recent call last):      car2('Volkswagen', '9999', 'Germany', 'China')  TypeError: car2() takes 2 positional arguments but 4 were given    # 情況3  >> car2('Volkswagen', '9999', salePlace='China')  Traceback (most recent call last):      car2('Volkswagen', '9999', salePlace='China')  TypeError: car2() missing 1 required keyword-only argument: 'place'    # 情況4  >> car2('Volkswagen', '9999', place='Germany', salePlace='China', city = 'beijing')  Traceback (most recent call last):      car2('Volkswagen', '9999', place='Germany', salePlace='China', city = 'beijing')  TypeError: car2() got an unexpected keyword argument 'city'

解釋:

  • 情況1: 一般調用方式;
  • 情況2: 因為調用時缺少參數名placesalePlacePython解釋器把這4個參數均視為位置參數,但car2()函數僅接受2位置參數
  • 情況3: 由於沒有設置默認值,所以命名關鍵字參數不可以省略;
  • 情況4: 沒有定義city這個命名關鍵字參數

注意: 命名關鍵字參數必須傳入參數名,這和位置參數不同。如果沒有傳入參數名,調用將報錯,如情況2所示。

針對情況3出現的問題,只需要設置好參數的默認值就可以避免了:

def car2(brand, price, *, place='', salePlace=''):      print("brand: ", brand)      print("price: ", price)      print("place: ", place)      print("salePlace: ", salePlace)      print("type(place): ", type(place))      print("type(salePlace): ", type(salePlace))
# 情況1  >> car2('Volkswagen', '9999')  brand:  Volkswagen  price:  9999  place:  salePlace:  type(place):  <class 'str'>  type(salePlace):  <class 'str'>      # 情況2  >> car2('Volkswagen', '9999', salePlace='China')  brand:  Volkswagen  price:  9999  place:  salePlace:  China  type(place):  <class 'str'>  type(salePlace):  <class 'str'>

5.2… 特殊情況

如果函數定義中已經有了一個可變參數,後面跟著的命名關鍵字參數就不再需要一個特殊分隔符*了:

def car3(brand, price, *args, place='', salePlace=''):      print("brand: ", brand)      print("price: ", price)      print("args: ", args)      print("place: ", place)      print("salePlace: ", salePlace)        print("type(args): ", type(args))      print("type(place): ", type(place))      print("type(salePlace): ", type(salePlace))

運行情況:

# 將place參數省略,使用默認參數  >> car3('Volkswagen', '9999', 1, 2, 3, salePlace='China')  brand:  Volkswagen  price:  9999  args:  (1, 2, 3)  place:  salePlace:  China  type(args):  <class 'tuple'>  type(place):  <class 'str'>  type(salePlace):  <class 'str'>

注意:

使用命名關鍵字參數時,如果沒有可變參數,就必須加一個*作為特殊分隔符。如果缺少*,Python解釋器將其視為位置參數

6. 組合參數

在Python中定義函數,可以用必選參數默認參數可變參數關鍵字參數命名關鍵字參數,這5種參數都可以組合使用。 注意: 參數定義的順序必須是:必選參數默認參數可變參數命名關鍵字參數關鍵字參數

我的建議是:別亂搞,函數介面理解性變差,損人不利己。

7. 參考文獻

廖雪峰Python教程:https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888


OK! 以上,Enjoy~