Python - 僅關鍵字引數

親愛的同學們,大家好!歡迎加入我們精彩的Python編程世界之旅。今天,我們將要探討一個一開始可能會讓人覺得有點兒困難的概念,但我保證你們會覺得它非常吸引人且極其有用。我們要談論的就是「僅關鍵字引數」!

Python - Keyword-Only Arguments

僅關鍵字引數是什麼?

想象一下你正在訂購披薩。你知道你想要大尺寸的,但還沒有確定要加哪些配料。如果可以只是說「我想要一個大披薩」而不需要指定其他東西,那不是很好嗎?這就是Python中僅關鍵字引數的作用!

僅關鍵字引數是一種特殊的函數參數,只能通過關鍵字傳遞,而不能通過位置傳遞。它們在Python 3中被引入,以讓程式設計師能夠更精確地控制函數的調用方式,並使函數調用更加明確,減少錯誤。

讓我們一步步來解析:

基本函數引數

在我們深入探討僅關鍵字引數之前,先來快速複習一下一般函數引數是如何工作的:

def greet(name, message):
print(f"{message}, {name}!")

greet("Alice", "Hello")  # 輸出:Hello, Alice!
greet("Good morning", "Bob")  # 輸出:Bob, Good morning!

在這個例子中,引數的順序是重要的。如果我們交換它們,輸出就會改變,也許會失去意義。

引入僅關鍵字引數

現在,讓我們看看僅關鍵字引數如何提供幫助:

def greet(*, name, message):
print(f"{message}, {name}!")

greet(name="Alice", message="Hello")  # 輸出:Hello, Alice!
greet(message="Good morning", name="Bob")  # 輸出:Good morning, Bob!

注意到參數前的 * 嗎?這個神奇的符號使得所有後面的引數都成為僅關鍵字引數。現在我們在調用函數時必須指定參數名稱,但引數的順序已經不再重要了!

僅關鍵字引數的例子

讓我們來看一個更實際的例子。假設我們正在撰寫一個函數來計算矩形的面積:

def calculate_area(*, length, width):
return length * width

# 這個可以工作:
area = calculate_area(length=10, width=5)
print(f"The area is: {area}")  # 輸出:The area is: 50

# 這個也可以工作:
area = calculate_area(width=5, length=10)
print(f"The area is: {area}")  # 輸出:The area is: 50

# 但這個會引發錯誤:
# area = calculate_area(10, 5)  # TypeError: calculate_area() takes 0 positional arguments but 2 were given

在這個例子中,我們必須通過名稱指定 lengthwidth。這使得我們的代碼更具可讀性,並減少了出錯的可能性,特別是當處理具有許多參數的函數時。

例子:使用「sep」作為非關鍵字引數

現在,讓我們看看一個內建的Python函數,它使用了普通引數和僅關鍵字引數:print() 函數。

print("Hello", "World", sep="-")  # 輸出:Hello-World

在這裡,"Hello" 和 "World" 是位置引數,而 sep 是關鍵字引數。但 sep 不是僅關鍵字引數;我們也可以將它作為位置引數使用:

print("Hello", "World", "-")  # 輸出:Hello-World

然而,這可能會導致混淆。這就是Python允許我們定義具有僅關鍵字引數的自定義函數的原因,確保某些參數必須始終通過名稱指定。

在自定義方法中使用僅關鍵字引數

讓我們創建一個更複雜的例子,展示在自定義方法中使用僅關鍵字引數的威力:

def format_name(*, first, last, middle="", title=""):
if middle:
full_name = f"{first} {middle} {last}"
else:
full_name = f"{first} {last}"

if title:
return f"{title} {full_name}"
else:
return full_name

# 來嘗試不同的組合:
print(format_name(first="John", last="Doe"))
# 輸出:John Doe

print(format_name(first="Jane", last="Smith", title="Dr."))
# 輸出:Dr. Jane Smith

print(format_name(first="Alice", middle="Marie", last="Johnson", title="Ms."))
# 輸出:Ms. Alice Marie Johnson

# 這會引發一個錯誤:
# print(format_name("Bob", "Brown"))  # TypeError: format_name() takes 0 positional arguments but 2 were given

在這個例子中,firstlast 是必需的僅關鍵字引數,而 middletitle 是可選的僅關鍵字引數,具有默認值。這個函數非常靈活且在使用上非常清晰。

僅關鍵字引數方法總結

以下是總結我們討論過的方法的表格:

方法 描述 示例
greet(*, name, message) 基本問候函數,帶有僅關鍵字引數 greet(name="Alice", message="Hello")
calculate_area(*, length, width) 使用僅關鍵字引數計算矩形面積 calculate_area(length=10, width=5)
format_name(*, first, last, middle="", title="") 格式化姓名,帶有可選的中間名和稱謂 format_name(first="John", last="Doe", title="Mr.")

請記住,函數定義中的 * 是使得後面的引數成為僅關鍵字引數的關鍵!

結論

僅關鍵字引數是Python中一個強大的功能,可以使你的代碼更具可讀性,減少錯誤並提高靈活性。它們特別適用於創建具有許多參數的函數,或者當引數的順序可能會導致混淆時。

隨著你繼續Python的學習之旅,你會發現許多情況下僅關鍵字引數都會非常有用。請持續練習,持續探索,最重要的是,請享受Python帶來的樂趣!

請記住,每一位偉大的程式設計師都是從初學者開始的。只要有耐心和練習,你將在不知不覺中编写出複雜的Python程序。祝 coding 愉快,未來的Python大師們!

Credits: Image by storyset