背景
在學習python時發現方法調用和方法定義會經常發現有帶星號的標記,為了弄明白是怎么使用的。特此做個筆記。
一、參數符號對比速查表
符號類 | 使用場景 | 作用描述 | 示例 |
---|---|---|---|
無符號 | 函數定義/調用 | 普通位置參數或關鍵字參數 | .def func(a, b) |
* | 函數定義 | 收集多余位置參數為元組 | .def func(*args) |
* | 函數調用 | 解包可迭代對象為位置參數 | .func(*[1,2]) |
** | 函數定義 | 收集多余關鍵字參數為字典 | def func(**kwargs) |
** | 函數調用 | 解包字典為關鍵字參數 | func(**{‘x’:1}) |
單獨* | 參數分隔 | 強制后續參數必須用關鍵字指定 | def func(a, *, b) |
二、核心區別詳解
1. 無符號參數(基礎參數)
# 位置參數示例
def add(a, b):return a + badd(3, 5) # ? 正確:位置傳參
add(b=5, a=3) # ? 正確:關鍵字傳參
2. 單星號(*)參數
定義時使用(收集位置參數)
def log(*values):print(type(values)) # <class 'tuple'>print(values)log(1, 'A', True) # 輸出: (1, 'A', True)
調用時使用(解包可迭代對象)
def plot(x, y):print(f"繪制點({x},{y})")points = [5, 8]
plot(*points) # 等效于 plot(5, 8)
3. 雙星號(**)參數
定義時使用(收集關鍵字參數)
def user_info(**details):print(type(details)) # <class 'dict'>print(details)user_info(name='Alice', age=25) # 輸出: {'name': 'Alice', 'age': 25}
調用時使用(解包字典)
def create_profile(name, age):print(f"{name} | {age}歲")data = {'name': 'Bob', 'age': 30}
create_profile(**data) # 等效于 create_profile(name='Bob', age=30)
4. 強制關鍵字參數(單獨*)
def register(username, *, email, phone):print(f"注冊用戶: {username}, 郵箱: {email}, 電話: {phone}")register("wyz", email="wyz@example.com", phone="13800138000") # ? 正確
register("bob456", "bob@test.com", "12345678911") # ? 報錯:email和phone必須用關鍵字參數
三、混合使用案例
def complex_example(a, b=0, *args, c, d=10, **kwargs):print(f"""固定參數: a={a}, b={b}可變位置參數: args={args}強制關鍵字參數: c={c}, d={d}可變關鍵字參數: kwargs={kwargs}""")complex_example(1, 2, 3, 4, c=5, e=20, f=30)
# 輸出:
# 固定參數: a=1, b=2
# 可變位置參數: args=(3, 4)
# 強制關鍵字參數: c=5, d=10
# 可變關鍵字參數: kwargs={'e': 20, 'f': 30}