參數定義(形參):
1. 位置參數
- def foo(a, b,):
2. 可變長位置參數
- def foo(a, b, *args):
3. 命名關鍵字參數
- def foo(a, b, *, c):
- def foo(a, b, *args, c): (如果已經有*args, 可以不用*分隔, c也已經是”命名關鍵字參數”了)
使用*號分隔, 后面的形參名c表示: 之后的實參傳遞進來的時候, 必須要使用”c”這個關鍵字傳參
如: foo(1, 2, *[3, 4, 5], c=6) >> 可正常調用
foo(1, 2, *[3, 4, 5], b=6) >> 報錯
用途: 不明(感覺沒啥用啊)
4. 默認/非默認參數
- def foo(a, b, *args, c=618, d):
- def foo(a, b=618, *args, c, d):
位置: 必須要放在”非默認的位置參數”后 (notice: ‘默認參數b’ 可以放在 “非默認的命名關鍵詞參數c和d” 前 )
5. 可變長關鍵字參數
- def foo(a, b, *args, c, d, **kwargs):
其實**kwargs參數也算是一種”命名關鍵字參數” (它也是必須要以”關鍵字傳參”形式傳入實參)
參數傳遞(實參):
1. 位置傳參
- foo(1, 2, [3, 4, 5], *[6, 7, 8]) >>等價于>> foo(1, 2, [3,4,5], 6, 7, 8)
2. 關鍵字傳參
- foo(a=1, b=2, c={“c”:3, “d”:4}, d=**{“e”:5, “f”:6}) >>>> foo(a=1, b=2, c={“c”:3, “d”:4}, e=5, f=6)
注意:
傳遞參數時:
- *: 是對list解包 即:以”位置傳參”的形式傳遞參數
- **: 是對dict解包 即:以”關鍵字傳參”的形式傳遞參數
接收參數時(在函數內部使用參數時):
- *: 是對list打包 即:把多個傳進來的”位置參數”, 收集到一個元祖, 并將這個元祖賦值給args這個變量
- **: 是對dict打包 即:把多個傳進來的”關鍵字參數”, 收集到一個字典, 并將這個字典賦值給kwargs這個變量
所以此時:
args: 其實就是個元祖tuple
kwargs: 其實就是個字典dict
def foo(a, b=99, *args, c=618, d, **kwargs):
print(a) # [0, 1, 2]
print(b) # 3
print(args) # (4, 5)
print(*args) # 4, 5
print(c) # 6
print(d) # 7
print(kwargs) # {"x":88, "y":99}
# print(**kargs) # 這樣的解包形式會出錯!!
print(kwargs["y"]) # 99
foo([0, 1, 2], *[3, 4, 5], c=6, d=7, x=88, y=99)
"""
上述案例中:
1. [0, 1, 2] 就是1個類型為list的位置參數
2. *[3, 4, 5] 就等價于 3, 4, 5 的位置傳參(傳進3個位置參數)
3. 當b為"非默認參數"時, a一定不能是"默認參數"
"""
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。
發表評論
請登錄后評論...
登錄后才能評論