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

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

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


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

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

“形參”和“實參”

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

參數的分類

1.位置參數(調用函數時根據函數定義的參數位置來傳遞參數)

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

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


login("tony", "120")

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

2.關鍵字參數(調用函數傳入參數時在參數前面加上形參名稱和等于號來區(qū)分填入的是哪個參數)

直接看下列代碼

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


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

最后一行我們調用login函數時,login(password=120, name="tony"),在實際參數前面分別添加了“password=”和“name=”,這樣,我們可以清楚的看出,120和tony代表的是啥,而且我們并未按照函數定義時的參數順序進行傳值。
其實,直白的講,關鍵字參數就像貼標簽。用于函數調用,通過“鍵-值”形式加以指定??梢宰尯瘮蹈忧逦⑷菀资褂?,同時也清除了參數的順序需求。但是,這里我們要注意的一點是,關鍵字參數必須在位置參數的后面使用!

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

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


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

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

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

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

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

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))

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

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


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

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

def get_remainder(*args):
    """
    獲取輸入值的乘積對20的余數
    :param args: 輸入的所有值
    :return: 乘積對20的余數
    """
    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)

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

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

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

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函數中,我們傳入參數為“kwargs”,在調用函數時,直接加上,如get_symbol(num_str_dic)即可調用。
要注意的是list或者tuple的時候用
args,而dict的時候用的是
*kwargs。

總結

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

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

相關閱讀更多精彩內容

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

友情鏈接更多精彩內容