python定義函式時的引數 呼叫函式時的傳參

2022-06-04 05:33:08 字數 4110 閱讀 9274

一、定義函式:

1、位置引數:直接定義引數

2、預設引數(或者關鍵字引數):引數名 = "預設值"

3、位置引數必須在預設引數之前

二、呼叫函式:

1、按位置傳,直接寫引數的值

2、按關鍵字傳,關鍵字 = "值"

3、位置引數必須在關鍵字引數之前

4、關鍵字引數可在*args和**kwargs之前

注:呼叫時,無論定義的函式是使用位置引數還是預設值引數,呼叫函式時,都可以按位置傳參或者按關鍵字進行傳參,即呼叫時的傳參形式和定義時的引數形式無關

def foo(a, b, c=3):

print("

a={},b={},c={}

".format(a, b, c))

foo(1,2,3) #

呼叫函式時按位置引數進行傳參

#輸出 a=1,b=2,c=3

foo(a=1,b=2,c=3) #

呼叫函式時按關鍵字引數傳參

foo(c=3,a=1,b=2) #

使用關鍵字傳參時,與關鍵字的位置無關,即關鍵字引數之間不存在先後順序

#上面呼叫的結果是一樣的

def foo(a, b, name=none,*args, **kwargs):

print

(name)

print

(args)

print

(kwargs)

a=(1, 2, 3)

b=foo(1,2,c=6,*a,**b) #

如果寫成foo(1,2,c=6,1, 2, 3,**b)則會報錯

1------->name

(2, 3)------->args

------->kwargs,c=6傳入kwargs中

三、動態引數

定義函式時:

動態位置引數使用*args進行定義(引數前加乙個*),將所有的值進行聚合成乙個元組

動態關鍵字引數使用**kwargs進行定義(引數前加二個*),將所有的值進行聚合成乙個字典

呼叫函式時:

1、使用位置引數和關鍵字引數進行傳參

2、給乙個序列加上*,就是將這個序列進行解包,然後按位置進行傳參

3、給乙個字段加上**,就是將這個字典進行解包,然後按關鍵字引數進行傳參

def foo(*args):

print

(args)

foo(*[1,2,3])

#輸出 (1, 2, 3)

def foo(**kwargs):

print

(kwargs)

foo(**)

#輸出

四、預設引數和可變引數混合使用

1、預設引數定義在可變引數之前

def foo(x,y = 1,*args):

print

(x)

print

(y)

print

(args)

foo(1,2,3,4,5,6,7,8,9) #

呼叫函式,改變預設引數的值

1------->x=1

2-------->y=2(3, 4, 5, 6, 7, 8, 9)----->args的值變成元組

2、預設引數定義在可變引數之後

def foo(x,*args,y = 1000):

print

(x)

print

(y)

print

(args)

foo(1,2,3,4,5,6,7,8,9) #

呼叫函式,使用預設值

1------->x=1

2-------->y=1000(2, 3, 4, 5, 6, 7, 8, 9)----->args的值變成元組

foo(1,2,3,4,5,6,7,8,y=2000) #

呼叫函式,改變預設值

1------->x=1

2-------->y=2000(2, 3, 4, 5, 6, 7, 8)----->args的值變成元組

3、位置引數定義在可變位置引數之後

如果在乙個星號引數後,或者在可變位置引數後出現普遍引數即位置引數,實際上已經不是普通引數了,而是keyworld-only引數(python3引入)

def foo(*args, x):

print

(args)

print

(x)foo(1, 2, 3) #

typeerror: foo() missing 1 required keyword-only argument: 'x'

foo(1,2,3,x=4)

args------>(1, 2, 3)

x ------>4

1、args可以看做已經截獲了所有的位置引數,x不使用關鍵字傳參不可能拿到實參

2、使用foo(x=4,1,2,3)貌似可以,但是違反了關鍵字引數在位置引數之後的語法

五、複雜混合引數

#

使用預設引數時,注意預設引數的位置要在args之後kwargs之前

def foo(x,*args,a=4,**kwargs):

print

(x)

print

(a)

print

(args)

print

(kwargs)

foo(1,5,6,7,8,y=2,z=3) #

呼叫函式,不修改預設引數

1------->x=1

4------->a=4(5, 6, 7, 8)------->args

------->kwargs

#

注意:當需要修改預設引數時,要調整預設引數的位置,要放在args之前即可,但不可放在開頭

def foo(x,a=4,*args,**kwargs):

print

(x)

print

(a)

print

(args)

print

(kwargs)

foo(1,9,5,6,7,8,y=2,z=3) #

呼叫函式,修改預設引數a為9

1------->x=1

9------->a=9(5, 6, 7, 8)------->args

------->kwargs

六、總結

定義函式時引數順序:

1、位置引數--->預設引數--->可變位置引數--->可變關鍵字引數(呼叫時修改預設引數)

2、位置引數--->可變位置引數--->預設引數--->可變關鍵字引數((呼叫時可不修改預設引數)

呼叫函式順序:

1、位置引數在關鍵引數之前,呼叫時的傳參形式和定義時的引數形式無關

2、位置引數在最前,可變位置引數傳參和關鍵字引數傳參沒有先後之分,可變關鍵字引數最後

def foo(a, b, *args, name=none,* *kwargs):

print

(name)

print

(args)

print

(kwargs)

a=(1, 2, 3)

b=foo(1,2,c=6,*a,**b) #

關鍵字在可變位置引數之前

#none------->name

#(2, 3)------->args

#------->kwargs,c=6傳入kwargs中

foo(1,2,*a,c=6,**b) #

關鍵字在可變位置引數之後,輸出結果和上面一致

foo(1,2,*a,**b,c=6) #

syntaxerror: invalid syntax,語法錯誤

Python函式的引數定義

python的函式具有非常靈活的引數形態,既可以實現簡單的呼叫,又可以傳入非常複雜的引數。預設引數一定要用不可變物件,如果是可變物件,程式執行時會有邏輯錯誤!要注意定義可變引數和關鍵字引數的語法 args是可變引數,args接收的是乙個tuple kw是關鍵字引數,kw接收的是乙個dict。以及呼叫...

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

python的底層是通過c語言實現,因此引數呼叫時是通過位址傳遞的 和c語言一樣,值是單向傳遞,指標才能實現雙向傳遞 比如 coding utf 8 def f1 x,y z x y y xreturn za 1 b 2c f1 a,b print c,a,b 得到的結果是 3 12 從這裡可以看出...

python定義函式時預設引數注意事項

如果在呼叫乙個函式時,沒有傳遞預設引數,則函式內的預設引數是對函式的預設引數屬性 defaults 的引用,如def func arg1 呼叫func時如果沒有傳參,上面的arg1就是func.defaults 0 的引用 沒傳遞預設引數,會發生以下情況 這樣在有些情況下會導致邏輯出錯的,例如 de...