Python參數傳遞
1、傳遞方式:通過自動將對象賦值給本地變量實現的
不可變對象通過“值”進行傳遞,在函數內部改變形參的值,只是讓其引用了另一個對象;
可變參數通過“指針”進行傳遞,在函數內部改變形參的值,將直接修改應用的對象;
2、避免可變參數被函數修改的方式1).直接傳遞可變對象的副本:testfunc(A,B[:])
2).在函數內部創建可變參數的副本:B=B[:]
3、傳遞機制
默認情況下,參數通過其位置進行傳遞,從左至右,所以必須精確的傳遞和函數頭部定義中一樣多的參數。
可以通過關鍵字參數、默認參數或參數容器等改變這種傳遞機制;
參數傳遞示例:
例1:參數傳遞示例
In [1]:def f1():
...: x = 666
...: def f2():
...: y = "hello world"
...: print x,y
...: return f2
...:
In [2]:f1()
Out[2]:
In [3]: a1= f1()
In [4]:type(a1)
Out[4]:function
In [5]:a1()
666 helloworld:
In [6]:def f2(x,y):
...: print x+y
...:
In [7]:f2(3,4)
7
In [8]:f2('hello','world')
helloworld
例2、不可變對象參數傳遞示例
In [11]: m= 3;n =4
In [12]:def f3(x,y):
....: x -= 1
....: print x,y
....:
In [13]:f3(m,n)
24
In [14]:print m,n
34
例3:可變對象參數傳遞示例
In [1]: l1= [1,2,3,4]
In [2]:def f4(x):
...: x.pop()
...: print x
...:
In [3]:f4(l1)
[1, 2,3]
In [4]:print l1
[1, 2,3]
例4:避免可變參數被函數修改的方式示例
In [5]:f4(l1[:])
[1,2]
In [6]:print l1
[1, 2,3]
4、改變默認傳遞機制方式位置參數:從左向右
關鍵字參數:使用“name=value”語法按關鍵字參數名稱匹配;
混用位置、關鍵字兩種方式:調用時所有位置參數必須在前,而後纔是所有的關鍵字參數
默認參數:有默認值的參數,定義函數時使用“name=value”語法爲變量賦值,從而傳入的參數可以少於參數個數;
混用有默認和無默認值的參數:定義時無默認值放前面,而後纔是所有的默認參數
可變參數:定義函數時使用*開頭的參數,可用於收集任意多位置或關鍵字參數;
調用函數時使用可變參數要求:定義時可變參數放在其他參數後面
定義函數時使用*:收集位置參數,不可使用“name=value”調用。
定義函數時使用**:收集關鍵字參數,收集到的參數都當做字典處理
可變參數解包:參數分解,調用函數時,使用*開頭的參數,可用於將參數集合打散,從而傳遞任意多基於位置或關鍵字的參數
l1 = ["Sun","Mon","Tue"]
x,y,z = l1
print x -->Sun
print x,y,z -->SunMon Tue
例1:位置參數示例(自左而右)
In [7]:def f5(x,y):
...: print x,y
...:
In [8]:m=3;n=4
In [9]:f5(m,n)
34
In [10]:f5(n,m)
43
In [11]:f5(m)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in()
----> 1f5(m)
TypeError:f5() takes exactly 2 arguments (1 given)
In [12]:f5(m,n,l1)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in()
----> 1f5(m,n,l1)
TypeError:f5() takes exactly 2 arguments (3 given)
#分別傳遞一個、三個參數時報錯,個數必須精確匹配;
例2:關鍵字參數示例:混用位置、關鍵字兩種方式時,調用時所有位置參數必須在前,而後纔是所有的關鍵字參數
In [13]:def f6(x,y,z):
....: print x,y,z
....:
In [14]:f6(m,n,l1)
3 4 [1, 2,3]
In [15]:f6(m,y=n,z=l1)
3 4 [1, 2,3]
例3:默認參數示例:混用有默認和無默認值的參數時:定義時無默認值放前面,而後纔是所有的默認參數
In [16]:def f7(x,y,z='Default'):
....: print x,y,z
....:
In [17]:f7(m,n,l1)
3 4 [1, 2,3]
In [18]:f7(m,n)
3 4Default
例4:使用可變參數:收集位置參數示例
In [20]:def f9(*x):
....: print x
....:
In [21]:f9(m)
(3,)
In [22]:f9(m,n,l1,5)
(3, 4, [1,2, 3], 5)
In [23]:f9(m,n,l1,z=5)
---------------------------------------------------------------------------
TypeError Traceback(most recent call last)
in()
----> 1f9(m,n,l1,z=5)
TypeError:f9() got an unexpected keyword argument 'z'
#定義函數傳入爲可變參數時,不能混用默認參數傳遞
例5:使用可變參數:收集關鍵字參數示例,構建字典
In [24]:def f10(**x):
....: print x
....:
In [25]:f10(x=1,y=2,z=3)
{'y': 2,'x': 1, 'z': 3}
例6:混用各種參數示例
In [32]:def f11(x,y=666,*z,**k):
....: print x,y,z,k
....:
In [33]:f11(m,n,a=1,b=3,c=6)
3 4 (){'a': 1, 'c': 6, 'b': 3}
In [34]:f11(m,n,l1,a=1,b=3,c=6)
3 4 ([1,2, 3],) {'a': 1, 'c': 6, 'b': 3}
In [43]:def f12(x,y=666,*z,**k):
....: print x
....: print y
....: print z
....: print k
....:
In [44]:f12(m,n,l1,m,n,a=1,b=3,c=6)
3
4
([1, 2,3], 3, 4)
{'a': 1,'c': 6, 'b': 3}
In [45]:f12(m,n,a=1,b=3,c=6)
3
4
()
{'a': 1,'c': 6, 'b': 3}
例7:參數解包示例
In [50]:l1 = ["Sun","Mon","Tue"]
In [51]:def f13(x,y,z):
....: print x,y,z
....:
In [52]:f13(*l1)
Sun MonTue
In [53]:def f15(x,*y,**z):
....: print x
....: print y
....: print z
....:
In [54]:a=666;b=["Sun","Mon","Tue","Wed"];c={'Mon':2,'Tue':3,'Wed':4}
In [55]:f15(a,*b,**c)
666
('Sun','Mon', 'Tue', 'Wed')
{'Tue': 3,'Mon': 2, 'Wed': 4}
In [56]:f15(a,b,m,n,l1,**c)
666
(['Sun','Mon', 'Tue', 'Wed'], 3, 4, ['Sun', 'Mon', 'Tue'])
{'Tue': 3,'Mon': 2, 'Wed': 4}
In [57]:f15(a,b,m,n,l1,str1='hello',str2='world',str3='!')
666
(['Sun','Mon', 'Tue', 'Wed'], 3, 4, ['Sun', 'Mon', 'Tue'])
{'str3':'!', 'str2': 'world', 'str1': 'hello'}