Python定義函式時,不同引數型別的傳遞

2022-06-18 18:48:12 字數 1788 閱讀 6713

python的底層是通過c語言實現,因此引數呼叫時是通過位址傳遞的(和c語言一樣,值是單向傳遞,指標才能實現雙向傳遞),比如:

# -*- coding: utf-8 -*-

def f1(x,y):

z=x+y

y=xreturn

z

a= 1

b=2c=f1(a, b)

print c, a, b

得到的結果是

3

12

從這裡可以看出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之前 注 呼叫時,無論定義的函...