python的底層是通過c語言實現,因此引數呼叫時是通過位址傳遞的(和c語言一樣,值是單向傳遞,指標才能實現雙向傳遞),比如:
# -*- coding: utf-8 -*-def f1(x,y):
z=x+y
y=xreturn
z
a= 1b=2c=f1(a, b)
print c, a, b
得到的結果是
312
從這裡可以看出b值並沒有變化,也就是說值是單向傳遞的。
函式的定義時,引數可以是數值,列表(當元組處理),字典等,其引數定義形式如下:
def f(a, *pargs, **kargs):print(a, pargs, kargs)
實際上這是python的很重要的乙個特性,即arbitrary arguments。當你需要乙個函式支援任意多個引數的時候,你就會用到它。上面例子中的那個函式,python會把匹配上的引數作為乙個tuple(元祖)來處理。可以像下面這樣呼叫函式f,
f(1, 3, 'abc', ('
lls', '
pow'), param1 = '
a')
列印出來結果如下:
(1, (3, 'abc', ('
lls', '
pow')), )
python會把1匹配給引數a,把3, 'abc', ('lls', 'pow')匹配給pargs,可以看出pargs被用tuple (3, 'abc', ('lls', 'pow'))賦值。
類似的,前面出現兩個星號的kargs會被用字典匹配,即所有像param = x這種格式的傳入引數會被轉成dict賦值給給kargs。
需要注意的是,在定義函式的時候**kargs這種型別的引數必須放在最後(如果有的話),而*pargs這種型別的引數必須放在**kargs這種型別引數的前面,其他型別引數的後面。
比如下面這幾種定義都是非法的
def f(a, *b, c=6, **d):pass
def f(a, **b, *c):
pass
def f(*a, **b, c):
pass
def f(a, b, *c, **d, e):
pass
而下面這幾種定義都是合法的
def f(a, **b):pass
def f(a, *b):
pass
def f(*a, **b):
passs
def f(**a):
pass
def f(a, b=1, *c, **d):
pass
舉乙個實際一點的例子,寫乙個函式,輸入任意多個數字作為引數,找到其中最大的乙個,就可以利用我們提到的*pargs, **如下:
1 def max(*pargs):2 maxnum = pargs[0]3
for i in pargs[1
:]:4
if i >maxnum:
5 maxnum =i
6return
maxnum
78 print max(5, 3, 1, 43, 54, 23, 1, 2, 32)
結果列印54。
python 根據不同引數呼叫不同的函式
有時候需要根據不同的情況呼叫不同的方法實現功能邏輯,有什麼優雅的方式可以實現麼?首先有乙個最原始的if else方式 parm a defa print a defb print b if parm a a elif parm b b 這樣的方式可以實現功能邏輯,但是略顯low,而且後續的擴充套件不...
python 根據不同引數呼叫不同的函式
有時候需要根據不同的情況呼叫不同的方法實現功能邏輯,有什麼優雅的方式可以實現麼?首先有乙個最原始的if else方式 parm a defa print a defb print b if parm a a elif parm b b 這樣的方式可以實現功能邏輯,但是略顯low,而且後續的擴充套件不...
python定義函式時的引數 呼叫函式時的傳參
一 定義函式 1 位置引數 直接定義引數 2 預設引數 或者關鍵字引數 引數名 預設值 3 位置引數必須在預設引數之前 二 呼叫函式 1 按位置傳,直接寫引數的值 2 按關鍵字傳,關鍵字 值 3 位置引數必須在關鍵字引數之前 4 關鍵字引數可在 args和 kwargs之前 注 呼叫時,無論定義的函...