python
中函式引數的傳遞方式分為:
(
1)位置引數
這個說白一點就是普通的引數傳遞,比如定義乙個求和函式:
def fun1(a,b):
return a+b
其中的引數a和
b即為位置引數
(
2)預設引數
有時候需要給引數設定乙個預設值,比如定義乙個求次方的函式:
def fun2(x,n=2)
return x**n
其中n=2
即為預設引數,呼叫的方式如下:
● fun2(5,4):計算5的
4次方● fun2(5):計算5
的平方
(
3)可變引數
顧名思義,即可以傳入任意個數的引數(包括
0個),比如定義乙個求和函式:
def fun3(*x):
calc=1
for a in x:
calc+=a
return calc
該函式與上面位置引數的不同之處在於:可以傳入任意個引數參與計算,也可直接傳入乙個
list
或者tuple
,而位置引數那裡只能傳兩個,呼叫方式如下:
● fun3(1, 2, 3, 4, 5):計算
1-5的和
● l = [1, 2, 3, 4, 5] fun3(*l):計算
1-5的和
(
4)關鍵字引數
關鍵字引數允許傳入任意個含引數名的引數(包括
0個),比如定義乙個學生資訊錄入函式:
def fun4(name,age,**kw):
print('name:',name,'age:',age,'other:',kw)
呼叫方式如下:
● 只傳入必選引數,如
:fun4('zhou',21);
● 傳入任意個數的關鍵字引數,如
:person('zhou',21city='sq',job='stu');
● 先組裝出乙個
dict,然後,
把該dict
轉換為關鍵字引數傳進去,如:
a=;fun4('zhou',21,**a)
(
5)命名關鍵字引數
即限制了關鍵字引數的名字,大白話就是可以傳入關鍵字引數,但是不能瞎取名字,得按給定的名字來。
格式:fun(a,*,b)
,命名關鍵字引數需要乙個特殊分隔符*,
*後面的引數被視為命名關鍵字引數
def fun5(name,age,*,city,job):
print(name,age,city,job)
呼叫方式如下:
● fun5('zhou',21,city='sq',job='stu')
如果函式定義中已經有了乙個可變引數,後面跟著的命名關鍵字引數就不再需要乙個特殊分隔符
*了:即
fun5(a,*b,c)
引數的呼叫順序:
位置引數
>
預設引數
>
可變引數
>
關鍵字引數
>
命名關鍵字引數
def f(a,b,c=0,*d,**kw):
print('a=',a,'b=',b,'c=',c,'d=',d,'kw=',kw)
解惑:
①普通的位置引數也可以傳入
list
或者tuple
,比如fun1
的呼叫:
● print(fun1([1,2,3],[4,5,6]))
● print(fun1((1,2,3),(4,5,6)))
②預設引數的坑:
def add_fun(a=):
return a
此函式呼叫時,會出現如下結果:
>>>add_fun()
['end','end']
>>>add_fun()
['end','end', 'end']
解決預設引數的坑
:定義預設引數要牢記一點:預設引數必須指向不變物件。
none
是不變物件,上述**可改為:
def add_fun(a=none):
if(a is none):
a=return a
關於原資料經過函式作用後是否改變的問題:(1
)普通的修改不會改變原資料的值,例如:
defswap(a,b)
a,b=b,a
return a,b
呼叫①,a=3;b=4 print(swap(a,b)),呼叫結束後a和b的值不會發生改變;
呼叫②
,a=[1,2,3];b=[4,5,6] print(swap(a,b))
,呼叫結束後a和
b的值不會改變。 (
2)會改變的情況:
對於列表,在函式中修改元素列表(如
a[0]=6
)、新增元素(如
)、刪除元素(如
a.pop()/a.remove(1)
)都會使得原列表發生改變,如下表所示:
函式
def fun(a,b):
a[0]=6
a=[1,2,3];b=[4,5,6]
fun1(a,b)
print('呼叫後a=',a)
print('呼叫後b=',b)
def fun(a,b):
a=[1,2,3];b=[4,5,6]
fun1(a,b)
print('呼叫後a=',a)
print('呼叫後b=',b)
def fun(a,b):
a.pop()
a=[1,2,3];b=[4,5,6]
fun1(a,b)
print('呼叫後a=',a)
print('呼叫後b=',b)
def fun(a,b):
a.remove(1)
a=[1,2,3];b=[4,5,6]
fun1(a,b)
print('呼叫後a=',a)
print('呼叫後b=',b)結果
a= [6, 2, 3]
b= [4, 5, 6]
a= [1, 2, 3, 4]
b= [4, 5, 6]
a= [1, 2]
b= [4, 5, 6]
a= [2, 3]
b= [4, 5, 6] (
3)禁止函式修改列表:
向函式傳遞列表的副本而不是原件,這樣在函式中所做的修改不會影響到原列表,如下所示:
function_a(list_a[:])
切片表示法建立列表的副本。
Python中函式引數傳遞問題
先上兩個例子 a 1 deffun a a 2fun a print a 結果為1 fun a 中的a,可以看做函式中的形參,可以用任何字元代替 fun aaa a deffun a fun a print a 結果為 1 所有的變數都可以理解是記憶體中乙個物件的 引用 或者,也可以看似c中void...
python函式的引數問題
函式的定義方式 def 函式名 塊函式的呼叫方式 函式名 上面是最簡單的無引數函式。函式高階,就是帶有引數的函式,樣例如下 def demo x,y return x y 呼叫方式 print demo 1,2 輸出3demo函式做只做了兩個引數的加法運算。python的引數如下幾種 1.必須引數 ...
Python函式引數中的 ,
問題 python的函式定義中有兩種特殊的情況,即出現 的形式。如 def execute command self,args,options 等。解釋 用來傳遞任意個無名字引數,這些引數會乙個tuple的形式訪問。用來處理傳遞任意個有名字的引數,這些引數用dict來訪問。應用 的應用 def fu...