Python參數傳遞

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'}

發佈了108 篇原創文章 · 獲贊 47 · 訪問量 48萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章