不同型別的引數的優先順序(在引數列表中的順序)
def
testfunc1()
:pass
這是乙個最簡單的函式,沒有引數,沒有返回,pass表示該函式沒有做任何操作,testfunc1是函式名,def是關鍵字,表示這是乙個函式
呼叫函式時給出函式並給函式傳遞相應的引數,對於命名關鍵字引數需要給出引數名,位置引數若給出引數名,則不用考慮引數名的順序
函式以關鍵字return表示函式的返回,返回的值可以被乙個變數接收。返回可以是0到多個任何型別的值,若返回沒有值返回為none。
return可以表示函式的結束。
def
testfunc2
(a,b)
:return a+b
# 函式有返回值,可以用乙個變數接受返回的值
c = testfunc2(1,
2)print
(c)# 函式可以返回多個值
deftestfunc3
(a,b)
:return a,b
d = testfunc3(1,
2)
# 1、位置引數,位置引數要求與呼叫函式時傳入的引數相匹配,函式定義時有幾個引數,
# 就要傳入幾個引數,即不能多也不能少。
deftestfunc4
(a,b)
:print
(a*a)
print
(b+b)
testfunc4(2,
1)# 傳入引數的順序與引數列表的順序相同,但是可以用[引數名=引數值]的方式傳遞引數,
# 這時,函式會通過引數名進行相互的對應,即使引數順序不與引數列表中的順序相同也
# 不會報錯
testfunc4(b=
2,a=
2)
預設引數是在函式定義時,給引數乙個預設值,如果在呼叫函式時,沒有傳入這個引數,函式會以定義時給出的值進行處理
def
testfunc5
(a,b=2)
:print
(a*b)
testfunc5(2,
3)# 返回6
testfunc5(2)
# 返回4
預設引數必須指向不變物件,因為python函式在定義的時候,預設引數就會被計算出
來,預設值也是乙個物件,預設引數指向這個物件,每次呼叫這個函式時,如果改變了這個預設引數的值,那麼下次呼叫時,預設引數的內容就變了。
python中的不可變物件包括數值型別(int,float,布林值),字串,元組
def
testfunc6
(a,b=
):print
(b)
對上面的**進行測試:
testfunc6(1)
# 執行結果為[1, 2]
testfunc6(2)
# 執行結果為[1, 2,3]
testfunc6(3)
# 執行結果為[5,4]
testfunc6(4,
[5])
# 執行結果為[1, 2, 3, 6]
testfunc6(
6)
產生這種結果的原因是,python**在執行函式之前會將整個函式放到記憶體中,然後在記憶體中執行它,對於b這個預設引數,在記憶體中分配了一塊位址儲存了引數的預設值,在呼叫函式時,如果沒有給它傳值,則會使用預設的引數值,若是在函式中改變了這個值,則相應位址的值也會發生改變,下次再呼叫時如果不傳值還會使用這個值,這就是為什麼出現前三次結果的原因。如果再呼叫函式時,給預設引數傳遞了引數值,則該引數值自己擁有乙個儲存位址,對這個位址上的操作不會影響到引數的預設值。這就是出現第四個結果的原因如果繼續呼叫上面的函式,而不給預設引數傳入值,預設引數又會使用預設值,因為再前三次呼叫該函式時已經改變了預設值,所以新的結果會收到之前的影響。
可變引數允許傳入0到多個值,在引數名前加*號表示可變引數,可變引數會將傳入的引數封裝成乙個不可變的元組,再對元組中的每乙個資料進行操作。
def
testfunc7
(*args)
:print
(args)
for i in args:
print
(i**2)
testfunc7(1,
2,3)
若是有了乙個list或者tuple,想將整個list或者tuple當作引數傳遞給函式,可以在引數前加*
號,表示將整個列表或元組當作引數傳遞給函式
list=[
1,2,
3]testfunc7(
*list
)tuple=(
1,2,
3)testfunc7(
*tuple
)
關鍵字引數也是可變引數,允許傳入0到多個引數,引數名前加**表示關鍵字引數,但是在傳入引數時必須遵循key=value的格式,傳入的鍵值對會被封裝成乙個字典
def
testfunc8
(**kwargs)
:print
(kwargs)
testfunc8(a=
1,b=
2,c=
3)
若已有乙個字典想將字典中的鍵值對作為引數傳遞給函式,需要在引數前加**
dict
=testfunc8(
**dict
)
命名關鍵字引數限制了關鍵字引數的名字,和關鍵字引數**kw不同,命名關鍵字引數需要乙個特殊分隔符*
,*
後面的引數被視為命名關鍵字引數。給命名關鍵字引數傳值的時候要以鍵值對的方式傳值,一旦設定的命名關鍵字引數,就必須給其傳值,當然,命名關鍵字引數也可以設定預設值下面**中,a,b是位置引數,*
分隔符,表示後面的引數是命名關鍵字引數,c,d即命名關鍵字引數
def
testfunc9
(a,b,
*,c,d=0)
:print
(a+b+c+d)
testfunc9(1,
2,c=3)
testfunc9(1,
2,c=
3,d=
4)
#如果命名關鍵字前有可變引數則不需要*
分隔
def
testfunc10
(a,b,
*args,c)
: k =
0for i in args:
k = k+i
print
(a+b+k+c)
testfunc10(1,
2,3,
4,c=
5)
必選引數(位置引數)-> 預設引數 -> 可變引數 -> 命名關鍵字引數 -> 關鍵字引數
def
testfunc
(a,b=0,
*args,c,d=
0,e,
**kwargs)
:pass
python之函式基礎
python 函式 python函式可以返回多值 defadd dif x,y,sum x y dif x y return sum,dif a,b add dif 2,3 print a,b 5 1 r add dif 2,3 print r 5,1 本質來說返回多值的函式其實返回乙個元組tupl...
Python之函式(基礎)
1.函式的定義 1 函式的定義與呼叫 定義函式 def say hello print hello1 print hello2 print hello3 呼叫函式,函式只有被呼叫了才會有輸出值 示例1 定義求和函式 計算 20 30 2 函式的巢狀 def fun1 print world def ...
python基礎之函式
在任何一門程式語言中,函式都是非常重要的乙個部分,當然python裡也不例外。不過python裡函式也會有一些額外的擴充,比如巢狀函式,閉包和現在很多程式設計 語言都有的lambda表示式。先來看一下python裡正常函式的樣子 a 1def func num print num a 函式裡可以直接...