Python3函数
函數(shù)是組織好的,可重復(fù)使用的,用來實(shí)現(xiàn)單一,或相關(guān)功能的代碼段。
函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)使用率。
?
定義一個(gè)函數(shù)
可以定義一個(gè)由自己想要功能的函數(shù),以下是簡(jiǎn)單規(guī)則:
- l? 函數(shù)代碼塊是以def關(guān)鍵詞開頭,后接函數(shù)標(biāo)識(shí)符名稱和圓括號(hào)。
- l? 任何傳入?yún)?shù)和自變量都必須放在圓括號(hào)中,圓括號(hào)之間可以用來定義參數(shù)。
- l? 函數(shù)的第一行語句可以選擇性的使用文檔字符串—用于存放函數(shù)說明。
- l? 函數(shù)內(nèi)容以冒號(hào)起始,并且縮進(jìn)。
- l? return[表達(dá)式]結(jié)束函數(shù),選擇性的返回一個(gè)值給調(diào)用方。不帶表達(dá)式的return相當(dāng)于None
?
語法:
Python定義函數(shù)使用def關(guān)鍵字,一般格式如下:
def 函數(shù)名(參數(shù)列表)函數(shù)體默認(rèn)情況下,參數(shù)值和參數(shù)名稱是按函數(shù)聲明中的定義順序匹配的。
?
參數(shù)傳遞
在python中,類型屬于對(duì)象,對(duì)象是沒有類型的。
a = [1,2,3] a = “Runoob”以上代碼中,[1,2,3]是List類型,“Runoob”是String類型,而變量a是沒有類型的,她僅僅是一個(gè)對(duì)象的引用(一個(gè)指針),可以是指向List類型的對(duì)象,也可以是指向String類型對(duì)象。
可更改和不可更改對(duì)象
在Python中,string,tuples和numbers是不可更改的對(duì)象,而list,dict等則是可以修改的對(duì)象。
不可變類型:變量賦值后a=5后再賦值a=10,這里實(shí)際是生成一個(gè)int對(duì)象10,再讓a指向它,而5被拋棄,而不是改變了a的值,相當(dāng)于重新生成了a。
可變類型:變量賦值la = [1,2,3,4]后再賦值la[2] = 5則是將list la的第三個(gè)元素更改,本身la沒有動(dòng),只是其內(nèi)部的一部分值被修改了。
?
python函數(shù)的參數(shù)傳遞:
不可變類型:類似于C++的值傳遞,如整數(shù),字符串,元組。
可變類型:類似于C++引用傳遞,如列表,字典。
?
python中一切都是對(duì)象,嚴(yán)格意義上我們不能說值傳遞還是引用傳遞,我們應(yīng)該說,傳不可變對(duì)象和傳可變對(duì)象。
?
python傳不可變對(duì)象實(shí)例:
#immutable.py def ChangeInt(a):a = 10b = 2 ChangeInt(b) print(b)運(yùn)行結(jié)果:
robot@ubuntu:~/wangqinghe/python/20190828$ python3 immutable.py
2
實(shí)例中由int對(duì)象2,指向它的變量是b,在傳遞給ChangeInt函數(shù)時(shí),按傳值的方式復(fù)制了變量b,a和b都指向了同一個(gè)int對(duì)象,在a=10時(shí),則新生成了一個(gè)int對(duì)象10,并讓a指向了它。
?
傳可變對(duì)象實(shí)例:
可變對(duì)象在函數(shù)里修改了參數(shù),那么在調(diào)用這個(gè)函數(shù)的函數(shù)里,原始的參數(shù)也被改變了。
#mutable.py def changeme(mylist):mylist.append([1,2,3,4])print("In funciton :",mylist)return mylist = [100,200,300] changeme(mylist) print("outside function : ",mylist)運(yùn)行結(jié)果:
robot@ubuntu:~/wangqinghe/python/20190828$ python3 mutable.py
In funciton : [100, 200, 300, [1, 2, 3, 4]]
outside function :? [100, 200, 300, [1, 2, 3, 4]]
?
傳入函數(shù)的和在末尾添加新內(nèi)容的對(duì)象用的是同一個(gè)引用
?
參數(shù)
以下是調(diào)用函數(shù)時(shí)可使用的正式參數(shù)類型:
- l? 必需函數(shù)
- l? 關(guān)鍵字函數(shù)
- l? 默認(rèn)函數(shù)
- l? 不定長(zhǎng)函數(shù)
?
必需參數(shù)
必需參數(shù)須以正確的順序傳入函數(shù)。調(diào)用時(shí)數(shù)量必須和聲明時(shí)的一樣。
?
關(guān)鍵字參數(shù)
關(guān)鍵字參數(shù)和函數(shù)調(diào)用關(guān)系緊密,函數(shù)調(diào)用使用關(guān)鍵字參數(shù)來確定傳入的參數(shù)值。
使用關(guān)鍵字允許函數(shù)調(diào)用時(shí)參數(shù)順序與聲明時(shí)不一致,因?yàn)镻ython解釋器能夠使用參數(shù)名稱匹配參數(shù)值。
##函數(shù)參數(shù)使用不需要使用指定順序:def printinfo(name,age):print("name : ",name)print("age : ",age)return printinfo(age = 20,name = "jack")運(yùn)行結(jié)果: robot@ubuntu:~/wangqinghe/python/20190828$ python3 seq.py name : jack age : 20默認(rèn)參數(shù):
調(diào)用函數(shù)時(shí),如果沒有傳遞參數(shù),則會(huì)使用默認(rèn)參數(shù)
#default.py def printinfo(name,age = 35):print("name :",name)print("age : ",age)return printinfo(age = 20,name = "wangqinghe") print("-----------------") printinfo(name = "wangqinge")運(yùn)行結(jié)果:
robot@ubuntu:~/wangqinghe/python/20190828$ python3 default.py
name : wangqinghe
age :? 20
-----------------
name : wangqinge
age :? 35
?
不定長(zhǎng)參數(shù)
你可能需要一個(gè)函數(shù)能處理比當(dāng)初聲明時(shí)更多的參數(shù),這些參數(shù)叫做不定長(zhǎng)參數(shù),和上述兩種參數(shù)不同,聲明時(shí)不會(huì)命名。
語法如下:
def functionname([formal_args,],*var_args_tuple):function_suitereturn [expresssion]加*號(hào)的參數(shù)會(huì)以元組的形式導(dǎo)入,存放所有未命名的變量參數(shù)。
#random_length.py def printinfo(arg1,*vartuple):print("output : ")print(arg1)print(vartuple)printinfo(70,60,50)運(yùn)行結(jié)果:
robot@ubuntu:~/wangqinghe/python/20190828$ python random_length.py
output :
70
(60, 50)
如果在函數(shù)調(diào)用時(shí)沒有指定參數(shù),它就是一個(gè)空元組,我們也可以不想函數(shù)傳遞未命名的變量:
#unnaming.py def printinfo(arg1,*vartuple):print("output : ")print(arg1)for var in vartuple:print(var)return printinfo(10) printinfo(70,60,50)運(yùn)行結(jié)果:
robot@ubuntu:~/wangqinghe/python/20190828$ python3 unnaming.py
output :
10
output :
70
60
50
?
還有一種是參數(shù)帶有兩個(gè)**,基本語法如下:
def functionname([formal_args,] **var_args_dict):function_suitereturn [expression]加了兩個(gè)星號(hào),參數(shù)會(huì)以字典的形式導(dǎo)入
#dic_param.py def printinfo(arg1,**vardict):print("output")print(arg1)print(vardict)printinfo(1,a=2,b=3)運(yùn)行結(jié)果:
robot@ubuntu:~/wangqinghe/python/20190828$ python3 dic_param.py
output
1
{'a': 2, 'b': 3}
?
聲明函數(shù)時(shí),參數(shù)中信號(hào)*可以單獨(dú)出現(xiàn),
def f(a,b,*,c)
?????? return a+b+c
?
如果單獨(dú)出現(xiàn)星號(hào)后的參數(shù),必須以關(guān)鍵字傳入
?
?
匿名函數(shù)
python使用lambda來創(chuàng)建匿名函數(shù)。
所謂匿名,就是不再使用def語句這樣標(biāo)準(zhǔn)的形式定義一個(gè)函數(shù)。
lambda只是一個(gè)表達(dá)式,函數(shù)體比def簡(jiǎn)單的多
lambda的主體是一個(gè)表達(dá)式,而不是一個(gè)代碼塊,僅僅能在lambda表達(dá)式中封裝有限的邏輯進(jìn)去。
lambda函數(shù)擁有自己的命名空間,且不能訪問自己參數(shù)列表之外或全局命名空間里的參數(shù)。
雖然lambda函數(shù)看起來只能寫一行,卻不等同于C/C++的內(nèi)聯(lián)函數(shù),后者的目的調(diào)用小函數(shù)時(shí)不占用??臻g從而增加運(yùn)行效率。
?
語法:
lambda函數(shù)的語法只包含一個(gè)語句。
lambda[arg1[,arg2,…argn]]:expression
#lambda.py sum = lambda arg1,arg2:arg1+arg2print("a + b : ",sum(10,20)) print("a + b : ",sum(20,20))運(yùn)行結(jié)果:
robot@ubuntu:~/wangqinghe/python/20190828$ python3 lambda.py
a + b :? 30
a + b :? 40
?
return語句:
return[表達(dá)式]語句用于退出函數(shù),選擇性地向調(diào)用方返回一個(gè)表達(dá)式,不帶參數(shù)值地return語句返回None。
#return.py def sum(arg1,arg2):total = arg1 + arg2print("Inside fun : ",total)return totaltotal = sum(10,20) print("Outside fun : ",total)運(yùn)行結(jié)果:
robot@ubuntu:~/wangqinghe/python/20190828$ python3 return.py
Inside fun :? 30
Outside fun :? 30
?
變量作用域
Python中,程序變量并不是在哪個(gè)位置都可以訪問地,訪問權(quán)限決定于這個(gè)變量在哪里賦值地。
變量地作用域決定了在哪一部分可以訪問哪個(gè)特定地變量名稱。python地作用域一共4種,分別是:
- L(local):局部作用域
- E(E你closing):閉包函數(shù)外的函數(shù)體中
- G(Global)全局作用域
- B(Built-in)內(nèi)置作用域(內(nèi)置函數(shù)所在模塊地范圍)
以L->E->G->B地規(guī)則去找,即:在局部找不到,就去局部外去找,再找不到就去全局找,再去內(nèi)置找。
g_count = 0 #全局作用域 def outer():o_count = 1 #閉包函數(shù)外的函數(shù)中def inner(0:i_count = 2 #局部作用域內(nèi)置作用域時(shí)通過一個(gè)叫built地標(biāo)準(zhǔn)模塊實(shí)現(xiàn)的,但是這個(gè)變量名自身并沒有放入內(nèi)置作用域中,所有必須導(dǎo)入這個(gè)文件才能使用,在python3中,可以是以下的代碼查看到底預(yù)定義了哪些變量。
inport builtins dir(builtins)Python中只有模塊(module),類(class)以及函數(shù)(def、lambda)才會(huì)引入新的作用域,其他代碼塊(if/elif/else、try/exception、for/while等)是不會(huì)引入新的作用域的,也就是說這些語句內(nèi)定義的變量,外部亦可以訪問
?
全局變量和局部變量
定義在函數(shù)內(nèi)部的變量擁有一個(gè)局部作用域,定義在函數(shù)外的擁有全局作用域。
局部變量只能在其被聲明的函數(shù)內(nèi)部訪問,而全局變量可以在整個(gè)程序范圍內(nèi)訪問,調(diào)用函數(shù)時(shí),所有在函數(shù)內(nèi)聲明的變量名稱都將被加入到作用域中
?
轉(zhuǎn)載于:https://www.cnblogs.com/wanghao-boke/p/11425518.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: Pythton3实例
- 下一篇: Python3OS文件/方法