python之函數(shù)(二)——函數(shù)參數(shù)詳解

今天,我們要學(xué)習(xí)的是函數(shù)中的一個重要的概念——參數(shù)。
廢話不多說,直接進入正題,下面我們看一段簡單代碼:

def add(a, b):  # 1 形參
    sum = a + b
    return sum


a = add(3, 5)  # 2 實參
print(a)

那么,什么是參數(shù)呢?其實很好理解,我們寫一個函數(shù),函數(shù)用來實現(xiàn)某個特定的功能,參數(shù)就是該函數(shù)為了實現(xiàn)功能所需要的東西。比如說,這邊的add()方法,其功能就是要實現(xiàn)“加法”,那么要實現(xiàn)加法功能,必須要“加數(shù)”和“被加數(shù)”兩個值,那么這邊的參數(shù)就需要兩個:a和b。分別代表加數(shù)和被加數(shù)。再比如,我們常常用到的print()內(nèi)置函數(shù),我們使用print()函數(shù)時,都是在括號中傳入一個字符串,然后調(diào)用print函數(shù),控制臺打印出該字符串,那么其參數(shù)就是“一串你準備打印到控制臺上的字符串”。

“形參”和“實參”

在開發(fā)中,我們常常會聽到“形參”和“實參”這兩個詞,那么,何為形參?何為實參呢?
從名字就可以看出,實參是一個實實在在存在的參數(shù),是實際占用內(nèi)存地址的,而形參只是意義上的一種參數(shù),在定義的時候是不占內(nèi)存地址的,如在上面例子中,注釋1處的a和b就是兩個“形參”,它們在add函數(shù)定義的時候在括號中占位。告訴函數(shù)體,有兩個入?yún)?。而注?中我們調(diào)用add函數(shù)時傳入的3和5就是“實參”,是兩個實實在在的數(shù)字。

參數(shù)的分類

1.位置參數(shù)(調(diào)用函數(shù)時根據(jù)函數(shù)定義的參數(shù)位置來傳遞參數(shù))

位置參數(shù),簡單一點的理解其實就是“一個蘿卜一個坑”,調(diào)用函數(shù)時,傳入的參數(shù)和定義參數(shù)時的形參相比,不能多,不能少,不能交換順序,一定要保證一一對應(yīng)。

def login(name, password):
    if name == "jack" and password == 110:
        print("登錄系統(tǒng)成功")
    else:
        print("用戶名或密碼錯誤")


login("tony", "120")

比如上面的login函數(shù),入?yún)閚ame和password,要求使用這在調(diào)用時傳入用戶和密碼,明顯name在前,password在后,那么我們調(diào)用login時,實參一定要先寫name后寫password如果位置順序填反或者少輸入一個參數(shù),執(zhí)行代碼就會報錯!

2.關(guān)鍵字參數(shù)(調(diào)用函數(shù)傳入?yún)?shù)時在參數(shù)前面加上形參名稱和等于號來區(qū)分填入的是哪個參數(shù))

直接看下列代碼

def login(name, password):
    if name == "jack" and password == 110:
        print("登錄系統(tǒng)成功")
    else:
        print("用戶名或密碼錯誤")


login(password=120, name="tony")

最后一行我們調(diào)用login函數(shù)時,login(password=120, name="tony"),在實際參數(shù)前面分別添加了“password=”和“name=”,這樣,我們可以清楚的看出,120和tony代表的是啥,而且我們并未按照函數(shù)定義時的參數(shù)順序進行傳值。
其實,直白的講,關(guān)鍵字參數(shù)就像貼標(biāo)簽。用于函數(shù)調(diào)用,通過“鍵-值”形式加以指定。可以讓函數(shù)更加清晰、容易使用,同時也清除了參數(shù)的順序需求。但是,這里我們要注意的一點是,關(guān)鍵字參數(shù)必須在位置參數(shù)的后面使用!

3.默認參數(shù)(定義函數(shù)時直接給形參給定一個值,如果調(diào)用時未給值,就用定義函數(shù)時給定的默認值)

def login(name, password=110):
    if name == "jack" and password == 110:
        print("登錄系統(tǒng)成功")
    else:
        print("用戶名或密碼錯誤")


login("tony")
login("tony", 120)

此次,我們在定義login函數(shù)時,給password賦了一個默認值110。然后我們在倒數(shù)第二句代碼調(diào)用loin函數(shù)時,只傳入了一個參數(shù)“tony”,即login("tony"),運行后,發(fā)現(xiàn)并沒有報錯,其實,此時的password值雖然沒有傳入,但是就為110。
繼續(xù)看最后一句代碼,我們傳入了name和password分別為tony和120,那么此時定義的110的password就被傳入的值120覆蓋。
所以我們便可知道,默認函數(shù)用于定義函數(shù),為參數(shù)提供默認值,調(diào)用函數(shù)時可傳可不傳該默認參數(shù)的值(注意:所有位置參數(shù)必須出現(xiàn)在默認參數(shù)前,包括函數(shù)定義和調(diào)用)

4.可變長參數(shù)(當(dāng)參數(shù)個數(shù)不定時使用,很是靈活)

*args(一個星號的可變長參數(shù))

顧名思義,可變長參數(shù)就是傳入的參數(shù)個數(shù)是可變的,可以是1個、2個到任意個,還可以是0個。主要用于一個函數(shù)不能確定入?yún)€數(shù)的情況。就以一個數(shù)學(xué)題目舉例:“將用戶輸入的所有數(shù)字相乘之后對20取余數(shù)用戶輸入的數(shù)字個數(shù)不確定”,針對這個題目,我們并不知道入?yún)⑹嵌嗌賯€,所以按照常規(guī)思路,我們可以在圓括號內(nèi)傳入列表,列表中放入要進行計算的所有的數(shù),代碼如下:

def get_remainder(list):
    product = 1
    for item in range(len(list)):
        product = list[item] * product
    return product % 20


my_list = [1, 2, 3, 4]
print(get_remainder(my_list))

在這里,我們調(diào)用此函數(shù)時,必須把要參與計算的所有數(shù)據(jù)封裝成一個列表才能進行計算,那么,如果不進行封裝呢?下面就是可變長參數(shù)的Show Time:

def get_remainder(*args):
    """
    獲取輸入值的乘積對20的余數(shù)
    :param args: 輸入的所有值
    :return: 乘積對20的余數(shù)
    """
    product = 1
    for arg in args:
        product *= int(arg)
    return product % 20


result = get_remainder(1, 2, 3, 4)
print(result)

從代碼表示上,我們可以看到,在定義函數(shù)的時候,我們在圓括號內(nèi)的參數(shù)表示為“args”,重點在于號,args只是一般習(xí)慣性寫法,當(dāng)然我們也可以寫成“any”、“haha”。在參數(shù)前面加*號,就表示這是一個可變長參數(shù),在代碼調(diào)用result = get_remainder(1, 2, 3, 4),我們無需封裝列表,只需要將參與計算的數(shù)據(jù)傳入方法中,并且用逗號隔開即可,這樣是不是很方便呢?
另外,如果已經(jīng)有一個list或者tuple,要調(diào)用一個可變參數(shù)怎么辦?其實也很方便,看下方代碼:

def get_remainder(*args):
    """
    獲取輸入值的乘積對20的余數(shù)
    :param args: 輸入的所有值
    :return: 乘積對20的余數(shù)
    """
    product = 1
    for arg in args:
        product *= int(arg)
    return product % 20


my_list = [1, 2, 3, 4]
result = get_remainder(*my_list)
print(result)

我們可以看到,在最后三行調(diào)用代碼中,我們有一個my_list的列表,要作為入?yún)⒄{(diào)用get_remainder方法,那么我們在調(diào)用時,在my_list前加一個號即可,即result = get_remainder(my_list),這樣列表也能使用可變長參數(shù)的函數(shù)。這一過程,在python中我們叫做“解包”。

**kwargs(兩個星號的可變長參數(shù))

說完了args的情況,我們來說下兩個星號的可變長參數(shù)情況*kwargs。他們兩個的區(qū)別在于, 兩個星表示接受鍵值對的動態(tài)參數(shù),數(shù)量任意。調(diào)用的時候會將實際參數(shù)打包成字典。詳細還是看例子,這次我們的題目為“輸入鍵盤數(shù)字鍵(0~9),返回數(shù)字鍵上方字符”,看相應(yīng)代碼:

def get_symbol(**kwargs):
    for people in kwargs:
        print(kwargs[people], end=" ")
    print()


num_str_dic = {'1': '!', '2': '@', '3': '#', '4': '$', '5': '%', '6': '^', '7': '&', '8': '*', '9': '(', '0': ')'}
get_symbol(**num_str_dic)

在get_symbol函數(shù)中,我們傳入?yún)?shù)為“kwargs”,在調(diào)用函數(shù)時,直接加上,如get_symbol(num_str_dic)即可調(diào)用。
要注意的是list或者tuple的時候用
args,而dict的時候用的是
*kwargs。

總結(jié)

關(guān)于函數(shù)的參數(shù),大概就是這么多,我們要注意的是:
1.默認參數(shù)一定要用不可變對象,如果是可變對象,運行會有邏輯錯誤!
2.默認參數(shù)必須在位置參數(shù)后面!
3.關(guān)鍵字參數(shù)可以不按照位置順序?qū)?br> 4.動態(tài)參數(shù),必須放在所有的位置參數(shù)和默認參數(shù)后面!
5.args必須出現(xiàn)在*kwargs前面
好,今天的學(xué)習(xí)內(nèi)容就到這里啦,打完收工!

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

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

  • 第5章 函數(shù)和函數(shù)式編程 5.1 引言函數(shù)是組織好的,可重復(fù)使用的,用來實現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。函數(shù)...
    VIVAFT閱讀 1,096評論 0 5
  • 函數(shù)只定義一次,但可能被執(zhí)行或調(diào)用任意次。JS函數(shù)是參數(shù)化的,函數(shù)的定義會包括一個稱為形參的標(biāo)識符列表,這些參數(shù)在...
    PySong閱讀 685評論 0 0
  • 函數(shù)只定義一次,但可能被執(zhí)行或調(diào)用任意次。JS函數(shù)是參數(shù)化的,函數(shù)的定義會包括一個稱為形參的標(biāo)識符列表,這些參數(shù)在...
    PySong閱讀 384評論 0 0
  • 函數(shù)只定義一次,但可能被執(zhí)行或調(diào)用任意次。JS函數(shù)是參數(shù)化的,函數(shù)的定義會包括一個稱為形參的標(biāo)識符列表,這些參數(shù)在...
    PySong閱讀 912評論 0 0
  • 函數(shù)是一段可以反復(fù)調(diào)用的代碼塊。函數(shù)還能接受輸入的參數(shù),不同的參數(shù)會返回不同的值。 概述 函數(shù)的聲明 JavaSc...
    oWSQo閱讀 1,477評論 0 4

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