我們已經接觸過函式(function)的引數(arguments)傳遞。當時我們根據位置,傳遞對應的引數。這種引數傳遞的方式被稱為函式引數的位置傳遞。
我們將接觸更多的引數傳遞方式。
回憶一下位置傳遞:
def f(a,b,c):在呼叫f函式時,1,2,3根據位置分別傳遞給了a,b,c。return a+b+c
res = f(1,2,3)
print res
有些情況下,用位置傳遞會感覺比較死板。關鍵字(keyword)傳遞是根據每個引數的名字傳遞引數。關鍵字並不用遵守位置的對應關係。依然沿用上面f的定義,更改呼叫方式:
res = f(c=3, b=2, a=1)關鍵字傳遞可以和位置傳遞混用。但位置引數要出現在關鍵字引數之前:print res
res = f(1, c=3, b=2)在關鍵字引數和位置引數混用的時候,如果不遵循上面的規則,則會報錯:non-keyword arg after keyword argprint res
在定義函式的時候,使用形如a=19的方式,可以給引數賦予預設值(default)。如果該引數最終沒有被傳遞值,將使用該預設值。
def f(a,b,c=10):在第一次呼叫函式f時, 我們並沒有足夠的值,c沒有被賦值,c將使用預設值10.return a+b+c
res = f(3,2)
print res
res = f(3,2,1)
print res
第二次呼叫函式的時候,c被賦值為1,不再使用預設值。
還有乙個規則:在函式定義的時候,必須把帶預設值的引數放在後面。
在定義函式時,我們有時候並不知道呼叫的時候會傳遞多少個引數。這時候,包裹(packing)位置引數,或者包裹關鍵字引數,來進行引數傳遞,會非常有用。
包裹傳遞有兩種方式:通過元組包裹或者通過字典包裹。
(1)元組包裹
下面是元組
包裹位置傳遞的例子:
兩次呼叫,儘管引數個數不同,都基於同乙個func定義。在func的參數列中,所有的引數被name收集,根據位置合併成乙個元組(tuple),這就是包裹位置傳遞。
為了提醒python引數:name是包裹位置傳遞所用的元組名,在定義func時,在name前加*號。
(2)字典包裹
下面是字典
包裹關鍵字傳遞的例子:
與上面乙個例子類似,dict是乙個字典,收集所有的關鍵字,傳遞給函式func。為了提醒python,引數dict是包裹關鍵字傳遞所用的字典,在dict前加**。
包裹傳遞的關鍵在於定義函式時,在相應元組或字典前加*或**。
*和**,也可以在呼叫的時候使用,即解包裹(unpacking)。
(1)元組按位置解包裹
下面為例:
def func(a,b,c):在這個例子中,所謂的解包裹,就是在傳遞tuple時,讓tuple的每乙個元素對應乙個位置引數print a,b,c
args = (1,3,4)
func(*args)
如果不用解包裹的話,函式呼叫就會出現函式引數的型別error。
(2)字典按關鍵字解包裹
相應的,也存在對詞典的解包裹,使用相同的func定義,然後:
dict =在傳遞詞典dict時,讓詞典的每個鍵值對作為乙個關鍵字傳遞給func,這裡的引數的傳遞是關鍵字引數,也就是說func的形參是a,b,c,那麼dict字典的鍵值對的鍵也要是a,b,c不能是其他的。(a,b,c的順序不重要)。func(**dict)
在定義或者呼叫引數時,引數的幾種傳遞方式可以混合。但在過程中要小心前後順序。基本原則是:先位置,再關鍵字,再包裹位置,再包裹關鍵字,並且根據上面所說的原理細細分辨。
注意:請注意函式定義時和函式呼叫時的區分。包裹和解包裹並不是相反操作,是兩個相對獨立的過程。
1 12 python基礎學習
def checki while true x input 請輸入 if x 1 print 當前餘額為 999元 elif x 2 print 當前剩餘流量為 5g elif x 3 print 當前剩餘通話為 189分鐘 elif x 0 print 退出自助查詢系統 break else pr...
python基礎 函式定義 呼叫
在python中,定義乙個函式要使用def語句,依次寫出函式名 括號 括號中的引數和冒號 然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。我們以自定義乙個求絕對值的my abs函式為例 定義函式 def my abs x if x 0 return x else return x 函...
Python 基礎 函式引數及呼叫
函式中return返回值功能 這次是要來說明一下,return到底在函式中有什麼作用 usr bin env python3 coding utf 8 def test1 print in the test1 return 0 print test end test 執行結果 in the test...