目錄:http://m.itdecent.cn/p/863c446364a8
函數(shù)
函數(shù)是組織好的,可重復(fù)使用的,用來(lái)實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。
一、定義函數(shù)
規(guī)則:
1、函數(shù)代碼塊由def關(guān)鍵字開(kāi)頭,后接函數(shù)名和圓括號(hào);
2、任何傳入?yún)?shù)和自變量必須放在圓括號(hào)內(nèi)。圓括號(hào)內(nèi)也可以用于定義參數(shù)。
3、函數(shù)內(nèi)容以冒號(hào)起始,并且函數(shù)體縮進(jìn)。
4、return [表達(dá)式]結(jié)束函數(shù),選擇性地返回一個(gè)值給調(diào)用方。不帶表達(dá)式的return相當(dāng)于返回 None。
語(yǔ)法:
def 函數(shù)名(參數(shù)列表):
? ? 函數(shù)體
實(shí)例1(不帶參數(shù)函數(shù)):
def zoo():
? ? '''
? ? 這里可以用來(lái)說(shuō)明函數(shù)作用,參數(shù)類(lèi)型,返回值類(lèi)型
? ? '''
? ? print("歡迎來(lái)到動(dòng)物園")zoo()? ?#使用函數(shù)名+(),可以直接調(diào)用函數(shù)
運(yùn)行結(jié)果為:
歡迎來(lái)到動(dòng)物園
實(shí)例2(帶參數(shù)函數(shù)):
def zoo(name):
? ? print("welcome to zoo ",name)
def zoo1(name):
? ? return "welcome to zoo "+name? ? ? ? ??#return將結(jié)果返回主函數(shù), 即zoo1("LIMing")
zoo("Lisa")? ? ? ? ? ? ? ? ? ? ? ? #因?yàn)楹瘮?shù)定義中有參數(shù),所以我們要把 ‘Lisa’ 傳入函數(shù)中
print(zoo1("LiMing"))
#return有返回值,他會(huì)將結(jié)果返回給函數(shù);print沒(méi)有返回值,會(huì)直接輸出結(jié)果。
運(yùn)行結(jié)果為:
welcome to zoo Lisa?
welcome to zoo LiMing?
函數(shù)調(diào)用
我們調(diào)用函數(shù)只需要使用函數(shù)名()就可以完成函數(shù)的調(diào)用,例如實(shí)例1中我們調(diào)用zoo()這個(gè)函數(shù),直接使用zoo()就完成了調(diào)用;當(dāng)然如果我們調(diào)用的函數(shù)是有參數(shù)的,那么我們?cè)谡{(diào)用函數(shù)時(shí)也要聲明我們需要傳入的參數(shù),比如我們的實(shí)例2,調(diào)用了zoo(name)這個(gè)函數(shù),我們就需要使用 zoo("lisa")傳入一個(gè)參數(shù)。
二、帶參函數(shù)
帶參函數(shù)的參數(shù)類(lèi)型分為必需參數(shù)、關(guān)鍵字參數(shù)、默認(rèn)參數(shù)、不定長(zhǎng)參數(shù)四種。
(1) 必要參數(shù)函數(shù)
必要參數(shù)是最基礎(chǔ)的函數(shù)調(diào)用,要求嚴(yán)格,須以正確的順序傳入函數(shù)。調(diào)用時(shí)的數(shù)量必須和聲明時(shí)的一樣。
語(yǔ)法:
def 函數(shù)名(必要參數(shù)1,必要參數(shù)2,...,必要參數(shù)N):
? ? 函數(shù)體
實(shí)例:
def zoo(name1,name2,name3):
? ? print("今天%s,%s和%s一起去了動(dòng)物園"%(name1,name2,name3))zoo("Lisa","LiMing","siri")
運(yùn)行結(jié)果為:
今天Lisa,LiMing和siri一起去了動(dòng)物園
(2)關(guān)鍵字參數(shù)函數(shù)
關(guān)鍵字傳參可以不遵守參數(shù)列表的順序進(jìn)行傳參。
語(yǔ)法:
def 函數(shù)名(參數(shù)1,參數(shù)2,...,參數(shù)N):
? ? 函數(shù)體
函數(shù)名(參數(shù)2=標(biāo)識(shí)符1,參數(shù)1=標(biāo)識(shí)符2)
實(shí)例:
def zoo(name1,name2,name3):
????print("今天%s,%s和%s一起去了動(dòng)物園"%(name1,name2,name3))
zoo(name2="Lisa",name3="LiMing",name1="siri")
運(yùn)行結(jié)果為:
今天siri,Lisa和LiMing一起去了動(dòng)物園? ? ? ?#因?yàn)槲覀冎付藚?shù)傳遞的位置,這次輸出的
結(jié)果和上個(gè)例子有些差別。
(3)默認(rèn)參數(shù)函數(shù)
默認(rèn)參數(shù)函數(shù)是在函數(shù)定義時(shí),給參數(shù)附上默認(rèn)值的定義方式。這樣在調(diào)用函數(shù)時(shí),這個(gè)參數(shù)可以不傳參。
語(yǔ)法:
def 函數(shù)名(參數(shù)1,參數(shù)2=默認(rèn)值):
? ? 函數(shù)體
函數(shù)名(參數(shù)1=標(biāo)識(shí)符)
實(shí)例:
def zoo(name1,name2="siri"):
????print("今天%s和%s一起去了動(dòng)物園"%(name1,name2))
zoo(name1="Lisa")? ? ? ? ? ? ?#我們并沒(méi)有傳入siri這個(gè)參數(shù),但是在函數(shù)內(nèi)還是使用了siri參
數(shù),而她使用的這個(gè)siri是我們定義函數(shù)時(shí)設(shè)置好的默認(rèn)值 。
運(yùn)行結(jié)果為:
今天Lisa和siri一起去了動(dòng)物園? ? ? ? ??
(4)不定長(zhǎng)參數(shù)函數(shù)
不定長(zhǎng)參數(shù)有一個(gè)*和兩個(gè)*兩種模式,前者表示會(huì)將自身接收的所有參數(shù)轉(zhuǎn)換為一個(gè)元組,后者必須接收關(guān)鍵字參數(shù)傳參,他會(huì)將接收的參數(shù)轉(zhuǎn)換為一個(gè)字典。key是關(guān)鍵字參數(shù)的參數(shù)名稱(chēng),value是其對(duì)應(yīng)的標(biāo)識(shí)符。
語(yǔ)法:
def 函數(shù)名(*args,**kwargs):
? ? 函數(shù)體函數(shù)名(1,2,a=3,b=4)
#*args會(huì)接收前兩個(gè)參數(shù),并把它聚合為(1,2),**kwargs會(huì)接受后邊兩個(gè)參數(shù),并把它聚合為{"a":3,"b":4}
實(shí)例:
def zoo(*args,**kwargs):
????print(args)
? ? print(kwargs)
zoo("Lisa","Siri","LiMing",BZ="XiaoMing",DY="Wanglaoshi")?
運(yùn)行結(jié)果:
('Lisa', 'Siri', 'LiMing')
{'BZ': 'XiaoMing', 'DY': 'Wanglaoshi'}
‘*’標(biāo)識(shí)符
*標(biāo)識(shí)符更像是一個(gè)分隔符,*標(biāo)識(shí)符后的參數(shù)必須以關(guān)鍵字參數(shù)傳入
def zoo(name1,name2,name3):
????print("今天%s,%s和%s一起去了動(dòng)物園"%(name1,name2,name3))
zoo("Lisa","LiMing",name3="siri")
運(yùn)行結(jié)果為:
今天Lisa,LiMing和siri一起去了動(dòng)物園
參數(shù)傳遞
在Python中,不可變數(shù)據(jù)類(lèi)型傳入函數(shù)體內(nèi),在函數(shù)體內(nèi)發(fā)生任何變化時(shí)不會(huì)影響到變量本身,相當(dāng)于復(fù)制了一個(gè)變量。
實(shí)例1(傳入不可變數(shù)據(jù)類(lèi)型):
def zoo(a):
? ? a=10
? ? print(a)? ? ? ? ? ?
b=2
zoo(b)
print(b)? ? ? ? ? ? #因?yàn)閎為不可變類(lèi)型,此時(shí)的b不會(huì)因?yàn)楹瘮?shù)體內(nèi)的操作而變化
運(yùn)行結(jié)果為:
10
2
變量b為2,傳入函數(shù)zoo中并把值賦給了a,這是在函數(shù)體內(nèi)被操作的是a,變量a可以理解為變量b的拷貝,無(wú)論變量a發(fā)生什么變化,都不會(huì)影響變量b的值。
實(shí)例2(傳入可變數(shù)據(jù)類(lèi)型):
def zoo(a)
? ? a.append([6,7,8,9])
? ? print(a)
b=[1,2,3,4,5]
zoo(b)
print(b)? ? ? ? ? ? ? ? #因?yàn)榇藭r(shí)的b為列表,是可變數(shù)據(jù)類(lèi)型,當(dāng)把b的值傳入函數(shù)zoo中,對(duì)a進(jìn)行的操作相當(dāng)于對(duì)b本身進(jìn)行修改。
運(yùn)行結(jié)果為:
[1, 2, 3, 4, 5, [6, 7, 8, 9]]?[1, 2, 3, 4, 5, [6, 7, 8, 9]]?
可變數(shù)據(jù)類(lèi)型變量傳入后,在函數(shù)內(nèi)發(fā)生變化會(huì)影響到主函數(shù)中的變量數(shù)據(jù),可以理解為把自己本身傳了進(jìn)去。
三、匿名函數(shù)?
關(guān)鍵字lambda表示匿名函數(shù),冒號(hào)前面的n表示函數(shù)參數(shù),可以有多個(gè)參數(shù)。
?匿名函數(shù)有個(gè)限制,就是只能有一個(gè)表達(dá)式,不用寫(xiě)return,返回值就是該表達(dá)式的結(jié)果。
?用匿名函數(shù)有個(gè)好處,因?yàn)楹瘮?shù)沒(méi)有名字,不必?fù)?dān)心函數(shù)名沖突。
此外,匿名函數(shù)也是一個(gè)函數(shù)對(duì)象,也可以把匿名函數(shù)賦值給一個(gè)變量,再利用變量來(lái)調(diào)用該函數(shù): 有些函數(shù)在代碼中只用一次,而且函數(shù)體比較簡(jiǎn)單,使用匿名函數(shù)可以減少代碼量,看起來(lái)比較"優(yōu)雅“
語(yǔ)法:
lambda[arg1[,arg2,.....argn]]:expression
例子
sum=lambda arg1,arg2:arg1+arg2
# 調(diào)用sum函數(shù)
print("相加后的值為 :",sum(10,20))
print("相加后的值為 :",sum(20,20))
運(yùn)行結(jié)果為:
相加后的值為 : 30
?相加后的值為 : 40
四、return 語(yǔ)句
return [表達(dá)式]?語(yǔ)句用于退出函數(shù),向調(diào)用方返回一個(gè)表達(dá)式(返回值)。不帶參數(shù)值的return語(yǔ)句返回None。
def sum(arg1,arg2):# 返回2個(gè)參數(shù)的和."
????total=arg1+arg2
????print("函數(shù)內(nèi) :",total)
????return total
# 調(diào)用sum函數(shù)
total=sum(10,20)
print("函數(shù)外 :",total)
運(yùn)行結(jié)果為:
函數(shù)內(nèi) : 30
函數(shù)外 : 30?