python 函数参数_python之函数(二)——函数参数详解
今天,我們要學習的是函數中的一個重要的概念——參數。
廢話不多說,直接進入正題,下面我們看一段簡單代碼:
def add(a, b): # 1 形參
sum = a + b
return sum
a = add(3, 5) # 2 實參
print(a)
那么,什么是參數呢?其實很好理解,我們寫一個函數,函數用來實現某個特定的功能,參數就是該函數為了實現功能所需要的東西。比如說,這邊的add()方法,其功能就是要實現“加法”,那么要實現加法功能,必須要“加數”和“被加數”兩個值,那么這邊的參數就需要兩個:a和b。分別代表加數和被加數。再比如,我們常常用到的print()內置函數,我們使用print()函數時,都是在括號中傳入一個字符串,然后調用print函數,控制臺打印出該字符串,那么其參數就是“一串你準備打印到控制臺上的字符串”。
“形參”和“實參”
在開發中,我們常常會聽到“形參”和“實參”這兩個詞,那么,何為形參?何為實參呢?
從名字就可以看出,實參是一個實實在在存在的參數,是實際占用內存地址的,而形參只是意義上的一種參數,在定義的時候是不占內存地址的,如在上面例子中,注釋1處的a和b就是兩個“形參”,它們在add函數定義的時候在括號中占位。告訴函數體,有兩個入參。而注釋2中我們調用add函數時傳入的3和5就是“實參”,是兩個實實在在的數字。
參數的分類
1.位置參數(調用函數時根據函數定義的參數位置來傳遞參數)
位置參數,簡單一點的理解其實就是“一個蘿卜一個坑”,調用函數時,傳入的參數和定義參數時的形參相比,不能多,不能少,不能交換順序,一定要保證一一對應。
def login(name, password):
if name == "jack" and password == 110:
print("登錄系統成功")
else:
print("用戶名或密碼錯誤")
login("tony", "120")
比如上面的login函數,入參為name和password,要求使用這在調用時傳入用戶和密碼,明顯name在前,password在后,那么我們調用login時,實參一定要先寫name后寫password如果位置順序填反或者少輸入一個參數,執行代碼就會報錯!
2.關鍵字參數(調用函數傳入參數時在參數前面加上形參名稱和等于號來區分填入的是哪個參數)
直接看下列代碼
def login(name, password):
if name == "jack" and password == 110:
print("登錄系統成功")
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("登錄系統成功")
else:
print("用戶名或密碼錯誤")
login("tony")
login("tony", 120)
此次,我們在定義login函數時,給password賦了一個默認值110。然后我們在倒數第二句代碼調用loin函數時,只傳入了一個參數“tony”,即login("tony"),運行后,發現并沒有報錯,其實,此時的password值雖然沒有傳入,但是就為110。
繼續看最后一句代碼,我們傳入了name和password分別為tony和120,那么此時定義的110的password就被傳入的值120覆蓋。
所以我們便可知道,默認函數用于定義函數,為參數提供默認值,調用函數時可傳可不傳該默認參數的值(注意:所有位置參數必須出現在默認參數前,包括函數定義和調用)
4.可變長參數(當參數個數不定時使用,很是靈活)
*args(一個星號的可變長參數)
顧名思義,可變長參數就是傳入的參數個數是可變的,可以是1個、2個到任意個,還可以是0個。主要用于一個函數不能確定入參個數的情況。就以一個數學題目舉例:“將用戶輸入的所有數字相乘之后對20取余數用戶輸入的數字個數不確定”,針對這個題目,我們并不知道入參是多少個,所以按照常規思路,我們可以在圓括號內傳入列表,列表中放入要進行計算的所有的數,代碼如下:
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。他們兩個的區別在于, 兩個星表示接受鍵值對的動態參數,數量任意。調用的時候會將實際參數打包成字典。詳細還是看例子,這次我們的題目為“輸入鍵盤數字鍵(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.動態參數,必須放在所有的位置參數和默認參數后面!
5.args必須出現在*kwargs前面
好,今天的學習內容就到這里啦,打完收工!
總結
以上是生活随笔為你收集整理的python 函数参数_python之函数(二)——函数参数详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac自带python怎么用_怎么在ma
- 下一篇: python动态生成数据库表_Pytho