在 Python 中使用變數引數
在 Python 中,您可以使用任意數量的引數和關鍵字引數,而不需要宣告其中每一個引數。 當函式可能會取得未知數量的輸入時,這項功能很有用。
變數引數
函式中的引數是必要的。 但是,當您使用變數引數時,函式允許傳入任意數量的引數 (包括 0
)。 使用變數引數的語法是在引數名稱前面加上單一星號 (*
)。
下列函式會列印收到的引數:
def variable_length(*args):
print(args)
注意
不一定要呼叫變數引數 args
。 您可以使用任何有效的變數名稱。 雖然通常會看到 *args
或 *a
,但您應該嘗試在整個專案中使用相同的慣例。
在此情況下,*args
會指示函式接受任意數量的引數 (包括 0
)。 在函式中,args
現在可作為將所有引數保留為 Tuple 的變數。 傳遞任意數量或類型的引數來試用函式:
variable_length()
()
variable_length("one", "two")
('one', 'two')
variable_length(None)
(None,)
如您所見,傳入的引數數量或類型沒有任何限制。
火箭在發射前歷經數個步驟。 視工作或延遲而定,這些步驟可能需要比預期更長的時間。 讓我們建立可變長度函式,根據每個步驟需要多少時間來計算發射前經過幾分鐘:
def sequence_time(*args):
total_minutes = sum(args)
if total_minutes < 60:
return f"Total time to launch is {total_minutes} minutes"
else:
return f"Total time to launch is {total_minutes/60} hours"
傳遞任意分鐘數來試用函式:
sequence_time(4, 14, 18)
Total time to launch is 36 minutes.
sequence_time(4, 14, 48)
Total time to launch is 1.1 hours.
注意
當您使用變數引數時,每個值都不再獲指派變數名稱。 所有值現在都是使用星號的 catch-all 變數名稱的一部分 (這些範例中的 args
)。
變數關鍵字引數
若要讓函式接受任意數量的關鍵字引數,您可以使用類似的語法。 在此情況下,需要雙星號:
def variable_length(**kwargs):
print(kwargs)
請嘗試範例函式,它會將傳入的名稱和值列印為 kwargs
:
variable_length(tanks=1, day="Wednesday", pilots=3)
{'tanks': 1, 'day': 'Wednesday', 'pilots': 3}
如果您已經熟悉 Python 字典,則會發現已將可變長度關鍵字引數指派為字典。 若要與變數和值互動,請使用與字典相同的作業。
注意
如同變數引數,當您使用變數關鍵字引數時,不一定要使用 kwargs
。 您可以使用任何有效的變數名稱。 雖然通常會看到 **kwargs
或 **kw
,但您應該嘗試在整個專案中使用相同的慣例。
在此函式中,讓我們使用變數關鍵字引數來報告獲任務指派的太空人。 由於此函式允許任意數量的關鍵字引數,因此不論指派的太空人數為何,都可以重複使用:
def crew_members(**kwargs):
print(f"{len(kwargs)} astronauts assigned for this mission:")
for title, name in kwargs.items():
print(f"{title}: {name}")
以阿波羅 11 號的組員為例進行嘗試:
crew_members(captain="Neil Armstrong", pilot="Buzz Aldrin", command_pilot="Michael Collins")
3 astronauts assigned for this mission:
captain: Neil Armstrong
pilot: Buzz Aldrin
command_pilot: Michael Collins
因為您可以傳遞關鍵字引數的任何組合,所以請務必避免重複的關鍵字。 重複的關鍵字會導致錯誤:
crew_members(captain="Neil Armstrong", pilot="Buzz Aldrin", pilot="Michael Collins")
File "<stdin>", line 1
SyntaxError: keyword argument repeated: pilot