python輸入任意多個數求和:python函數參數傳遞列表

參數定義(形參):

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一定不能是"默認參數"
"""

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/218404.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 00:31
下一篇 2024-12-09 00:31

相關推薦

發表回復

登錄後才能評論