Python編程思想(18):哇!原來Python參數還可以這樣用

李寧老師已經在「極客起源」 微信公衆號推出《Python編程思想》電子書,囊括了Python的核心技術,以及Python的主要函數庫的使用方法。讀者可以在「極客起源」 公衆號中輸入 160442 開始學習。

《Python編程思想》總目錄

《Python編程思想》專欄

目錄

1. 關鍵字( keyword)參數

2. 參數默認值


在定義 Python函數時可指定形參,爲函數指定的參數稱爲形參,這些形參的值要等到調用時才能確定下來,由函數的調用者負責向形參傳入參數值。簡單來說,就是誰調用函數,誰負責傳入參數值。

1. 關鍵字( keyword)參數

Python函數的參數名不是無意義的, Python允許在調用函數時通過名字來傳入參數值。因此,應該爲Python函數的參數名起更有意義的名字。

按照形參位置傳入的參數被稱爲位置參數。如果使用位置參數的方式來傳入參數值,則必須嚴格按照定義函數時指定的順序來傳入參數值。如果根據參數名來傳入參數值,則無須遵守定義形參時的順序,這種方式被稱爲關鍵字(keyword)參數。例子代碼如下:

示例代碼:named_params_test.py

# 定義一個用於計算矩形面積的函數
def rectangle_area(width,height):
   print("width: ", width)
   print("height: ", height)
   return width * height
# 傳統調用函數的方式,根據位置傳入參數
print(rectangle_area(3.5, 4.1))
# 根據關鍵字參數來傳入參數
print(rectangle_area(width = 3.3, height = 8.5))
# 使用關鍵字參數時可交換位置
print(rectangle_area(height = 8.5, width = 3.3))
# 部分使用關鍵字參數,部分使用位置參數
print(rectangle_area(3.7, height = 4.1))

# 位置參數必須放在關鍵字參數之前,下面代碼會出錯
#print(rectangle_area(width = 2.5, 4.6))

運行程序,會輸出如下內容:

width:  3.5
height:  4.1
14.349999999999998
width:  3.3
height:  8.5
28.049999999999997
width:  3.3
height:  8.5
28.049999999999997
width:  3.7
height:  4.1
15.17

上面程序定義了一個簡單的 rectangle_area函數,該函數包含 width和height兩個參數,該函數與前面定義的函數並沒有任何區別。接下來在調用該函數時,既可使用傳統的根據位置參數來調用,也可根據關鍵字參數來調用。在使用關鍵字參數調用函數時可交換參數的位置,還可混合使用位置參數和關鍵字參數。需要說明的是,如果希望在調用函數時混合使用關鍵字參數和位置參數,則關鍵字參數必須位於位置參數之後。換句話說,在關鍵字參數之後的只能是關鍵字參數。而下面的代碼是錯誤的。

print(rectangle_area(width = 2.5, 4.6))

運行上面代碼,將會提示如下錯誤。

SyntaxError: positional argument follows keyword argument

2. 參數默認值

在某些情況下,程序需要在定義函數時爲一個或多個形參指定默認值,這樣在調用函數時就可以省略爲該形參傳入參數值,而是直接使用該形參的默認值。

爲形參指定默認值的語法格式如下:

形參名=默認值

從上面的語法格式可以看出,形參的默認值緊跟在形參之後,中間以英文“=”隔開。

例如,如下程序爲name、 message形參指定了默認值。

示例代碼:param_default_test.py

# 爲兩個參數指定默認值
def print_info(name = "李寧", message = "歡迎來到未來"):
   print(f"hello {name}")
   print(f"message:{message}")
# 全部使用默認參數
print_info()
# 只有message參數使用默認值
print_info("超人")
# 兩個參數都不使用默認值
print_info("超人", "歡迎來到賽博坦")
# 只有name參數使用默認值
print_info(message = "歡迎來到冰雪世界")
# 如果不指定關鍵字參數,那麼就會按形參順序指定參數值,所以這裏name的值是"歡迎學習Python"
print_info("歡迎來到火星")

# print_info(name="神祕博士", "歡迎來到太陽系")   # 出錯

# print_info("歡迎來到地球" , name="神奇女俠")  # 爲name傳遞參數值參數歧義(這兩個值都被認爲是name參數值)

print_info("鋼鐵俠", message="我在哪裏?")
print_info(name="綠巨人", message="這是阿斯加德嗎?")

運行程序,會輸出如下內容:

hello 李寧
message:歡迎來到未來
hello 超人
message:歡迎來到未來
hello 超人
message:歡迎來到賽博坦
hello 李寧
message:歡迎來到冰雪世界
hello 歡迎來到火星
message:歡迎來到未來
hello 鋼鐵俠
message:我在哪裏?
hello 綠巨人
message:這是阿斯加德嗎?

上面程序中在定義print_info函數時爲name和 message形參指定了默認值,因此程序中第1次調用print_info函數時沒有爲name和message參數指定參數值,此時name、 message參數將會使用其默認值。程序在第2次調用print_info函數時爲name參數(使用位置參數)指定了參數值。此時 message參數將會使用默認值。程序第3次調用print_info函數時爲name和message參數(使用位置參數)都指定了參數值,因此這兩個參數都使用開發者傳入的參數值。程序第4次調用print_info函數時只爲 message參數(使用關鍵字參數)傳入了參數值,此時name參數將使用默認值。

從這段程序可以看出,如果只傳入一個位置參數,由於該參數位於第1位,系統會將該參數值傳給name參數。因此,我們不能按如下方式調用 print_info函數。

print_info("歡迎來到火星")

上面調用時傳入的“歡迎來到火星”字符串將傳給name參數,而不是 message參數。

我們也不能按如下方式來調用 print_info函數。

print_info(name="鋼鐵俠","我在哪裏?")

因爲 Python規定,關鍵字參數必須位於位置參數的後面。因此提示錯誤:positional argument follows keyword argument

那麼,我們能不能單純地將上面兩個參數交換位置呢?

print_info("歡迎來到地球", name="雷神")

上面調用依然是錯誤的,因爲第一個字符串沒有指定關鍵字參數,因此將使用位置參數爲name參數傳入參數值,第2個參數使用關鍵字參數的形式再次爲name參數傳入參數值,這意味着兩個參數值其實都會傳給name參數,程序爲name參數傳入了多個參數值。因此提示錯誤:TypeError: print_info() got multiple values for argument 'name'

將函數調用改爲如下兩種形式是正確的。

print_info("雷神", message="歡迎來到地球")
print_info(name="綠巨人", message="我在哪裏?")

上面第一行代碼先使用位置參數爲name參數傳入參數值,再使用關鍵字參數爲 message參數。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章