Python中什么是函數(shù)?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
10年積累的做網(wǎng)站、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有洛龍免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
函數(shù)是組織好的,可重復(fù)使用的,用來(lái)實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。
函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。你已經(jīng)知道Python提供了許多內(nèi)建函數(shù),比如print()。但你也可以自己創(chuàng)建函數(shù),這被叫做用戶自定義函數(shù)。
你可以定義一個(gè)由自己想要功能的函數(shù),以下是簡(jiǎn)單的規(guī)則:
(1)函數(shù)代碼塊以 def 關(guān)鍵詞開頭,后接函數(shù)標(biāo)識(shí)符名稱和圓括號(hào) ()。
(2)任何傳入?yún)?shù)和自變量必須放在圓括號(hào)中間,圓括號(hào)之間可以用于定義參數(shù)。
(3)函數(shù)的第一行語(yǔ)句可以選擇性地使用文檔字符串—用于存放函數(shù)說(shuō)明。
(4)函數(shù)內(nèi)容以冒號(hào)起始,并且縮進(jìn)。
(5)return [表達(dá)式] 結(jié)束函數(shù),選擇性地返回一個(gè)值給調(diào)用方。不帶表達(dá)式的return相當(dāng)于返回 None。
Python 定義函數(shù)使用 def 關(guān)鍵字,一般格式如下:
def 函數(shù)名(參數(shù)列表): 函數(shù)體
def getNum(): pass
如果我們定義了一個(gè)函數(shù),里面什么也沒(méi)有寫,為了不讓代碼崩潰,我們可以寫一個(gè) pass。
現(xiàn)在我們來(lái)定義一個(gè)可執(zhí)行的函數(shù):
def getNum(): print(123) getNum() # 123
如上我們定義了一個(gè) getNum 的函數(shù),函數(shù)內(nèi)部 print 輸出 123,當(dāng)我們調(diào)用 getNum() 時(shí),就會(huì)輸出 123。
如果我們不想輸出固定的 123,輸出結(jié)果有我們自己定義,我們可以通過(guò)傳參的形式解決:
def getNum(num): print(num) print(num * 2) getNum(123) # 123 246
可以通過(guò) return 的方式把想要的結(jié)果 return 出來(lái):
def getNum(num): return num print(getNum(123)) # 123
函數(shù)中也可以使用嵌套函數(shù)的方式:
def getNum(num): getName(num) def getName(name): print(name) getNum("zhangsan") # zhangsan
我們通過(guò)向函數(shù)傳值來(lái)獲取我們的結(jié)果,也可以通過(guò)設(shè)置變量的形式來(lái)解決:
num = 1 def getNum(): print(num) getNum() # 1
上面的代碼我們?cè)O(shè)置了一個(gè)全局變量,當(dāng)然我們也可以在函數(shù)內(nèi)部設(shè)置變量,叫做局部變量,這樣更有利于我們對(duì)自己函數(shù)內(nèi)的變量操作而不去改變?nèi)值淖兞?,如下?/p>
def getNum(): name = "zhangsan" print(name) getNum() # zhangsan
在有的時(shí)候,我們可以直接將函數(shù)內(nèi)的參數(shù)設(shè)置默認(rèn)值,這就就可以避免在沒(méi)有傳入該參數(shù)時(shí)函數(shù)報(bào)錯(cuò):
def getNum(a, b, c=11, d=22): print(a) print(b) print(c) print(d) getNum(1, 2, 3) # 1 2 3 22
在上面的代碼中,我們對(duì)函數(shù) getNum 的第三個(gè)和第四個(gè)參數(shù)設(shè)置了默認(rèn)值,在調(diào)用該函數(shù)時(shí),我們傳入了三個(gè)值,然后輸出結(jié)果發(fā)現(xiàn),第三個(gè)參數(shù)的默認(rèn)值被調(diào)用 getNum 時(shí)傳入的參數(shù)值覆蓋掉了,而第四個(gè)參數(shù)值由于沒(méi)有傳入,所以使用了默認(rèn)值 d=22。由此我們可以得出,當(dāng)我們不傳入對(duì)應(yīng)參數(shù)值時(shí)如果設(shè)置默認(rèn)值則使用默認(rèn)值,如果傳入了參數(shù)值則優(yōu)先使用傳入的參數(shù)值。
在上面的代碼中,我們定義的參數(shù)都是單一的字符串或者數(shù)字,我們也可以定義列表,元組,字典這樣的參數(shù),如下:
list = [11, 22, 33] tuple = (44, 55, 66) dict = {"a": "77", "b": 88, "c": 99} def getTest(list, tuple, dict): print(list) print(tuple) print(dict) getTest(list, tuple, dict) ''' [11, 22, 33] (44, 55, 66) {'a': '77', 'b': 88, 'c': 99} '''
在上面的代碼中我們可以看出,Python 中的不同變量類型都可以作為參數(shù)傳入函數(shù)中。
接下來(lái)我們?cè)賮?lái)看一下函數(shù)中缺省參數(shù)的 *args 和 **kwargs。
def getTest(a, b, c=123, *args): print(a) # 11 print(b) # 22 print(c) # 33 print(args) # (44, 55, 66) getTest(11, 22, 33, 44, 55, 66)
在上面的代碼中,print(c) 結(jié)果為 33,這個(gè)我們?cè)偕厦嬉呀?jīng)解釋過(guò)了,但是我們?cè)趨?shù) c 后面又加入了一個(gè) *args 的形參,然后我們?cè)谡{(diào)用 getTest() 時(shí)向函數(shù)內(nèi)部傳入?yún)?shù)的個(gè)數(shù)為 6 個(gè),而函數(shù)體 getTest() 接收的參數(shù)為 4 個(gè),按我們上面叫的函數(shù)方法,理論上程序應(yīng)該報(bào)錯(cuò),然而程序卻能運(yùn)行,運(yùn)行結(jié)果打印的第 4 個(gè)參數(shù)結(jié)果為一個(gè)元組,將形參按順序?qū)?yīng)的參數(shù)對(duì)應(yīng)完畢之后剩余的內(nèi)容組成一個(gè)元組輸出。其中 *args 可以寫成 *xxx,我們習(xí)慣上命名為 *args。
在函數(shù)傳參時(shí),除了 *args 外還有一個(gè) **kwargs,如下:
def getTest(a, b, c=123, *args, **kwargs): print(a) # 11 print(b) # 22 print(c) # 33 print(args) # (44, 55, 66) print(kwargs) # {'name': 'zhangsan', 'age': 30} getTest(11, 22, 33, 44, 55, 66, name="zhangsan", age=30)
上面的代碼中,我們?cè)诤瘮?shù) getTest() 后面又多家了一個(gè)形參 **kwargs,當(dāng)我們?cè)谡{(diào)用 getTest() 函數(shù)并傳入?yún)?shù)時(shí),我們傳入了 name="zhangsan" 這樣的鍵值對(duì),這樣在打印輸出 **kwargs 時(shí)會(huì)轉(zhuǎn)為一個(gè)字典類型的數(shù)據(jù)。其中 **kwargs 可以寫成 **xxx,我們習(xí)慣上命名為 **kwargs。
注意:在print() 輸出時(shí),*args 和 **kwargs 的 * 不需要寫。
根據(jù)上面的 *args 和 **kwargs,我們現(xiàn)在來(lái)向這樣一個(gè)問(wèn)題,加入我先在外面分別定義了一個(gè)元組類型變量 tuple 和字典類型數(shù)據(jù) dict,然后調(diào)用 getTest() 函數(shù)時(shí)將變量傳入,輸出結(jié)果還是跟上面的結(jié)果一樣,即下面的代碼:
def getTest(a, b, c=123, *args, **kwargs): print(a) # 11 print(b) # 22 print(c) # 33 print(args) # ((44, 55, 66), {'name': 'zhangsan', 'age': 30}) print(kwargs) # {} tuple=(44,55,66) dict={'name': 'zhangsan', 'age': 30} getTest(11, 22, 33, tuple, dict)
當(dāng)我們還是按照上面的 *args 和 **kwargs 寫法寫時(shí),發(fā)現(xiàn)參數(shù) tuple 和 dict 被當(dāng)做一個(gè)數(shù)據(jù)輸出到了 *args 里,這是由于當(dāng)我們傳入 tuple 和 dict 時(shí)被當(dāng)做了一個(gè)整體,我們可以在傳入前先將其解構(gòu)一下就可以了,如下:
def getTest(a, b, c=123, *args, **kwargs): print(a) # 11 print(b) # 22 print(c) # 33 print(args) # (44, 55, 66) print(kwargs) # {'name': 'zhangsan', 'age': 30} tuple=(44,55,66) dict={'name': 'zhangsan', 'age': 30} getTest(11, 22, 33, *tuple, **dict)
如上,我們?cè)趥魅雲(yún)?shù)的時(shí)候傳入 *tuple 和 **dict 就可以解決了,但是如果我們?cè)趥魅雲(yún)?shù)時(shí)和調(diào)用時(shí)都不加 * 不就相當(dāng)于把整個(gè)變量作為參數(shù)了嗎?如下:
def getTest(a, b, c=123, tuple, dict): print(a) print(b) print(c) print(tuple) print(dict) tuple=(44,55,66) dict={'name': 'zhangsan', 'age': 30} getTest(11, 22, 33, tuple, dict) # SyntaxError: non-default argument follows default argument
我們會(huì)發(fā)現(xiàn)不寫 * 的話會(huì)報(bào)錯(cuò),原因是當(dāng)我們?cè)诤瘮?shù)中定義默認(rèn)參數(shù)時(shí),默認(rèn)參數(shù)必須寫在最后面,即 c=123 需寫在最后面,如下:
def getTest(a, b, tuple, dict, c=123): print(a) # 11 print(b) # 22 print(c) # 33 print(tuple) # (44, 55, 66) print(dict) # {'name': 'zhangsan', 'age': 30} tuple=(44,55,66) dict={'name': 'zhangsan', 'age': 30} getTest(11, 22, tuple, dict, 33)
但是如果參數(shù)中存在 * 的話默認(rèn)參數(shù)不能寫在最后面,如下:
def getTest(a, b, *tuple, **dict, c=123): print(a) print(b) print(c) print(tuple) print(dict) tuple=(44,55,66) dict={'name': 'zhangsan', 'age': 30} getTest(11, 22, *tuple, **dict, 33) # SyntaxError: invalid syntax
由此我們得出函數(shù)的傳參順序?yàn)椋簠?shù),默認(rèn)參數(shù),*args,**kwargs。
我們接下來(lái)看一下匿名函數(shù)。
python 使用 lambda 來(lái)創(chuàng)建匿名函數(shù)。
所謂匿名,意即不再使用 def 語(yǔ)句這樣標(biāo)準(zhǔn)的形式定義一個(gè)函數(shù)。
(1)lambda 只是一個(gè)表達(dá)式,函數(shù)體比 def 簡(jiǎn)單很多。
(2)lambda的主體是一個(gè)表達(dá)式,而不是一個(gè)代碼塊。僅僅能在lambda表達(dá)式中封裝有限的邏輯進(jìn)去。
(3)lambda 函數(shù)擁有自己的命名空間,且不能訪問(wèn)自己參數(shù)列表之外或全局命名空間里的參數(shù)。
(4)雖然lambda函數(shù)看起來(lái)只能寫一行,卻不等同于C或C++的內(nèi)聯(lián)函數(shù),后者的目的是調(diào)用小函數(shù)時(shí)不占用棧內(nèi)存從而增加運(yùn)行效率。
lambda 函數(shù)的語(yǔ)法只包含一個(gè)語(yǔ)句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
# 實(shí)現(xiàn)一個(gè)兩數(shù)相加的匿名函數(shù) sum = lambda num1, num2: num1 + num2 print(sum(10, 20)) # 30
看完上述內(nèi)容,你們掌握Python中什么是函數(shù)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
當(dāng)前文章:Python中什么是函數(shù)
標(biāo)題路徑:http://chinadenli.net/article30/gicpso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、微信小程序、網(wǎng)站導(dǎo)航、服務(wù)器托管、企業(yè)建站、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
移動(dòng)網(wǎng)站建設(shè)知識(shí)