函數(shù)的參數(shù)問(wèn)題

'''
位置參數(shù):
    位置形參:函數(shù)定義時(shí),從左往右寫(xiě)的參數(shù)
    位置實(shí)參:函數(shù)調(diào)用時(shí),從左往右寫(xiě)的參數(shù)
'''


def func(a, b):
    print(a, b)


func(1, 2)
# 1, 2
'''
關(guān)鍵參數(shù):
  正常情況下,給函數(shù)傳參數(shù),要按順序。如果不想按順序,就用關(guān)鍵參數(shù)。
  指定參數(shù)名的參數(shù),就叫做關(guān)鍵參數(shù)。
  函數(shù)調(diào)用時(shí):func(a=1, b=2),  這種指定了參數(shù)名的參數(shù),就是關(guān)鍵參數(shù)。
  調(diào)用函數(shù)時(shí),關(guān)鍵參數(shù)可以和位置參數(shù)一起用,但是關(guān)鍵參數(shù)必須在位置參數(shù)的后面。不然會(huì)報(bào)錯(cuò)。

利用關(guān)鍵字傳參的是時(shí)候,要么全部參數(shù)都用關(guān)鍵字傳參,要么就必須按照順序
'''


def func1(a, b, c):
    print(a, b, c)


func1(10, 20, c=30)
# 10, 20, 30

'''
默認(rèn)參數(shù):
  函數(shù)定義時(shí),默認(rèn)參數(shù)必須在位置形參的后面。
  函數(shù)調(diào)用時(shí),指定參數(shù)名的參數(shù),叫關(guān)鍵參數(shù)。
  而在函數(shù)定義時(shí),給參數(shù)名指定值的時(shí)候,這個(gè)參數(shù)叫做默認(rèn)參數(shù)。
  關(guān)鍵參數(shù),和默認(rèn)參數(shù)兩個(gè)參數(shù)寫(xiě)法一樣,區(qū)別在于:
    關(guān)鍵參數(shù)是在函數(shù)調(diào)用時(shí),指定實(shí)參的參數(shù)名,也可以說(shuō)指定值的參數(shù)名。
    默認(rèn)參數(shù)是在函數(shù)定義時(shí),指定參數(shù)名的值。
'''


def func2(a, b, c=30):
    print(a, b, c)


func2(10, 20, 40)
# 10, 20, 40

'''
動(dòng)態(tài)參數(shù):*args  **kwargs
  *args
  針對(duì)函數(shù)定義時(shí)的*:
    def func(a, b, *args):
      pass
    *args會(huì)接收函數(shù)調(diào)用時(shí),傳入的多余的位置實(shí)參。
    *args 是一個(gè)元組

    *kwargs
    針對(duì)函數(shù)定義時(shí),站在形參的角度看 **
    接收多余的關(guān)鍵實(shí)參,成為一個(gè)字典dict。
    字典的key是關(guān)鍵實(shí)參的變量名,字典的value是關(guān)鍵實(shí)參的值。
    將字典交給**后面的變量名,這里是kwargs
'''


def func3(a, b, *args):
    print(a, b, args)


func3(10, 20, 30, 40)
# 10, 20, (30, 40)

'''
函數(shù)定義時(shí):
    從左往右:位置形參 > *args > 默認(rèn)參數(shù) > **kwargs
    位置形參 > 默認(rèn)參數(shù) > *args > **kwargs  也可以。
    因?yàn)楹瘮?shù)調(diào)用時(shí)給的實(shí)參滿足了位置形參、默認(rèn)參數(shù)之后,會(huì)把多余的位置實(shí)參給args。這樣并不會(huì)報(bào)錯(cuò)。
    但是 **kwargs 必須在 *args后面
    默認(rèn)形參必須在位置形參后面

函數(shù)調(diào)用時(shí):
    從左往右:位置實(shí)參 > *args > 關(guān)鍵參數(shù) > **kwargs
    因?yàn)?*args 在函數(shù)調(diào)用時(shí),會(huì)被打散成位置實(shí)參,而關(guān)鍵參數(shù)必須在位置實(shí)參的后面,否則會(huì)報(bào)錯(cuò)。SyntaxError: positional argument follows keyword argument
    *args 必須在 **kwargs后面, 否則會(huì)報(bào)語(yǔ)法錯(cuò)誤:SyntaxError: iterable argument unpacking follows keyword argument unpacking

注意:用了*之后,*后面的參數(shù)必須以關(guān)鍵字傳參,并且用了*之后,不能再接收不定個(gè)數(shù)的位置參數(shù)。
'''


def func4(a, b, c=10, *args, **kwargs):
    print(a, b, c, args, kwargs)


func4(10, 20, 30, e=100)
# 10,20,30,(),{'e':100}


def func5(a, b, *args, c=30, **kwargs):
    print(a, b, c,  args, kwargs)


func5(10, 20, 30, e=100)
# 10,20,30,(30,),{'e':100}


def func6(a, b, *, c=10, d=30, **kwargs):
    print(a, b, c, d, kwargs)


func6(10, 20)
# 10,20,10,30,{}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容