本文為 python 打包與解構 系列文,第 2 篇:
- 理解 Python 函數中的預設值機制
- Python 函數參數詳解:位置引數與關鍵字引數的新手指南 👈進度
- 理解 Python 函數中的 / 與 * 用法
- Python 串列開箱(Unpacking)詳解:新手指南
- 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傳遞給參數a,3傳遞給參數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'作為位置引數傳遞給name,age和city使用關鍵字引數傳遞。
錯誤示例
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接收任意數量的引數,提高函數的靈活性。 - 引數開箱:使用
*和**運算子將序列和字典開箱為引數,簡化函數調用。