在 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