Python 函數參數詳解:位置引數與關鍵字引數的新手指南

Published October 3, 2024 by 徐培鈞
Python

本文為 python 打包與解構 系列文,第 2 篇:

  1. 理解 Python 函數中的預設值機制
  2. Python 函數參數詳解:位置引數與關鍵字引數的新手指南 👈進度
  3. 理解 Python 函數中的 / 與 * 用法
  4. Python 串列開箱(Unpacking)詳解:新手指南
  5. Python 字典的開箱(**)詳解:新手指南

在 Python 編程中,函數(Function) 是一種重要的工具,允許我們將可重複使用的代碼塊組織起來,提高代碼的可讀性和可維護性。

理解如何向函數傳遞參數是掌握 Python 的關鍵之一。

Python 提供了 位置參數(Positional Arguments)關鍵字參數(Keyword Arguments) 兩種方式來傳遞參數。

本篇文章將詳細介紹這兩種傳遞參數的方式,包括它們的用法、差異、優勢,以及如何在實際開發中靈活運用,幫助新手更好地理解和使用 Python 函數參數。


什麼是函數參數?

在深入探討位置參數和關鍵字參數之前,讓我們先簡要了解一下 函數參數 的概念。

  • 參數(Parameter):在函數定義中,用於接收外部傳遞進來的值的變量。
  • 引數(Argument):在函數調用時,實際傳遞給函數的值。

示例:

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

greet('Alice')  # 這裡的 'Alice' 就是引數

位置引數(Positional Arguments)

定義

位置引數是根據參數在函數定義中的位置,按照順序傳遞值的參數。

傳遞值時,不需要指定參數名稱,直接按照順序賦值。

用法

函數定義:

def function_name(param1, param2, param3):
    # 函數體

函數調用:

function_name(arg1, arg2, arg3)

示例:

def add(a, b):
    return a + b

result = add(5, 3)
print(result)  # 輸出:8
  • 解釋5 傳遞給參數 a3 傳遞給參數 b

特點

  • 順序重要:位置參數的傳遞依賴於參數的位置,順序錯誤會導致結果不正確。
  • 適用於參數較少且順序明確的情況

關鍵字引數(Keyword Arguments)

定義

關鍵字引數 是在函數調用時,通過指定參數名稱來傳遞值的參數。

這樣的傳遞方式與參數在函數定義中的順序無關。

用法

函數定義:

def function_name(param1, param2, param3):
    # 函數體

函數調用:

function_name(param2=value2, param1=value1, param3=value3)

示例:

def introduce(name, age, city):
    print(f"姓名:{name}, 年齡:{age}, 城市:{city}")

introduce(age=25, name='Bob', city='Taipei')

輸出:

姓名:Bob, 年齡:25, 城市:Taipei
  • 解釋:即使參數順序不同,透過指定參數名稱,值仍然正確地傳遞給對應的參數。

特點

  • 順序無關:可以任意順序傳遞參數,因為每個參數都有明確的名稱。
  • 提高可讀性:特別是在參數較多的情況下,代碼更易讀。

混合使用位置引數和關鍵字引數

用法

在函數調用時,可以同時使用位置引數和關鍵字引數,但需要遵循一定的規則。

規則:

  • 位置引數必須在關鍵字引數之前
  • 同一個引數不能被賦值多次

示例:

def introduce(name, age, city):
    print(f"姓名:{name}, 年齡:{age}, 城市:{city}")

introduce('Charlie', age=28, city='Kaohsiung')

輸出:

姓名:Charlie, 年齡:28, 城市:Kaohsiung
  • 解釋'Charlie' 作為位置引數傳遞給 nameagecity 使用關鍵字引數傳遞。

錯誤示例

introduce(age=28, 'Charlie', city='Kaohsiung')
# SyntaxError: positional argument follows keyword argument
  • 解釋:位置引數 'Charlie' 不能跟在關鍵字引數 age=28 之後。

默認參數值(Default Parameter Values)

定義

在函數定義時,可以為參數設置默認值,這些參數稱為 默認引數

在調用函數時,如果沒有為這些引數傳遞值,則使用默認值。

用法

函數定義:

def function_name(param1, param2=default_value):
    # 函數體

示例:

def greet(name, message='你好'):
    print(f"{message}, {name}!")

greet('David')            # 輸出:你好, David!
greet('Emily', '早安')     # 輸出:早安, Emily!
  • 解釋message 有默認值 '你好',在未傳遞 message 時使用默認值。

注意事項

  • 默認引數必須放在非默認引數之後
def greet(message='你好', name):
    # 錯誤:非默認參數在默認參數之後

會引發 SyntaxError


可變長度參數

不定長度位置參數(*args

使用 *args 可以接收任意數量的「位置引數」,參數將以 元組(tuple) 的形式存儲。

示例:

def sum_numbers(*args):
    total = 0
    for num in args:
        total += num
    return total

print(sum_numbers(1, 2, 3))       # 輸出:6
print(sum_numbers(4, 5, 6, 7))    # 輸出:22

不定長度關鍵字參數(**kwargs

使用 **kwargs 可以接收任意數量的「關鍵字引數」,參數將以 字典(dict) 的形式存儲。

示例:

def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name='Frank', age=35, city='Tainan')

輸出:

name: Frank
age: 35
city: Tainan

結合使用

def func(*args, **kwargs):
    print("位置引數:", args)
    print("關鍵字引數:", kwargs)

func(1, 2, 3, a=4, b=5)

輸出:

位置引數: (1, 2, 3)
關鍵字引數: {'a': 4, 'b': 5}

引數開箱(Argument Unpacking)

位置引數開箱

使用 * 運算子,可以將序列(如列表、元組)開箱為位置參數。

示例:

def add(a, b, c):
    return a + b + c

numbers = [1, 2, 3]
print(add(*numbers))  # 輸出:6

關鍵字引數開箱

使用 ** 運算子,可以將字典開箱為關鍵字參數。

示例:

def introduce(name, age):
    print(f"姓名:{name}, 年齡:{age}")

info = {'name': 'Grace', 'age': 27}
introduce(**info)

輸出:

姓名:Grace, 年齡:27

常見錯誤與調試

參數重複賦值

def func(a, b):
    print(a, b)

func(1, a=2)
# TypeError: func() got multiple values for argument 'a'
  • 解釋:參數 a 同時通過位置參數和關鍵字參數賦值,導致重複。

位置引數在關鍵字引數之後

func(a=1, 2)
# SyntaxError: positional argument follows keyword argument
  • 解釋:位置參數不能跟在關鍵字參數之後。

未提供必需的引數

def func(a, b):
    print(a, b)

func(a=1)
# TypeError: func() missing 1 required positional argument: 'b'
  • 解釋:未為參數 b 提供值。

最佳實踐

  • 優先使用位置引數傳遞必需的、順序重要的引數
  • 使用關鍵字引數提高代碼的可讀性,特別是在引數較多時
  • 避免在函數調用時同時使用位置引數和關鍵字引數為同一參數賦值
  • 在函數定義中,將默認引數和可變長度引數放在適當的位置

總結

  • 位置引數:根據引數位置傳遞值,順序重要,適用於引數較少且順序固定的情況。
  • 關鍵字引數:通過引數名稱傳遞值,順序無關,提高代碼可讀性,適用於引數較多的情況。
  • 混合使用:位置引數必須在關鍵字引數之前,注意避免引數重複賦值。
  • 可變長度參數:使用 *args**kwargs 接收任意數量的引數,提高函數的靈活性。
  • 引數開箱:使用 *** 運算子將序列和字典開箱為引數,簡化函數調用。

延伸閱讀