先前我們在討論函式Fution定義時,引數(argument) 都是固定的數量的例如def add_numbers(a, b):
,那如果要讓函式更彈性一點,是不是有可輸入不固定數量的引數(argument) 用法呢?因為可能輸入的是Log的字串,可能會有不固定的數量的引數。
當你無法預測函式將接收到的引數數量時,就可以使用*args
和**kwargs
來當函式的引數。
*args
: 用於處理可變數量的位置引數,將它們收集到一個元組中。
def example_function(*args):
for arg in args:
print(arg)
example_function(1, 2, "hello", [3, 4], 5)
# 輸出
# 1
# 2
# hello
# [3, 4]
# 5
**kwargs
: 用於處理可變數量的關鍵字引數,將它們收集到一個字典中。
def example_function(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
example_function(name="John", age=25, city="New York")
# 輸出
# name: John
# age: 25
# city: New York
def calculate_sum(*args):
return sum(args)
result = calculate_sum(1, 2, 3, 4, 5)
print(result)
# 輸出
# 15
建立一個可同時輸入*args
與**kwargs
的函式
def generate_message(*args, **kwargs):
message = "Hello, "
if args:
message += " ".join(map(str, args))
if kwargs:
message += " with details: " + ", ".join([f"{key}={value}" for key, value in kwargs.items()])
return message
message1 = generate_message("John", "Doe")
message2 = generate_message(name="Jane", age=30)
message3 = generate_message( "Doe",name="Jane", age=30)
print(message1)
print(message2)
print(message3)
# 輸出
# Hello, John Doe
# Hello, with details: name=Jane, age=30
# Hello, Doe with details: name=Jane, age=30
那*args
位置引數與**kwargs
關鍵字引數有順序的問題嗎?
是的,在Python中,位置引數必須在關鍵字引數之前,否則引發錯誤,如下圖
星號 *
用於表示可變數量的位置引數(*args
)。這個星號在Python函式中被視為可變數量的位置引數,也可以定義*a123之類的名稱,儘管在使用 *
符號時可以不使用 args
這樣的名稱,但為了代碼的可讀性,建議還是使用慣例,即 *args
。
**
也是跟上述差不多,建議還是使用慣例,即**kwargs。