1. 程式人生 > >python函式引數詳解

python函式引數詳解



值傳遞和引用傳遞區別

如果你傳入的引數物件是可變物件:列表,字典,這個時候就是引用傳遞。
如果你傳入的引數物件是不可變的物件:數字,元組,字串,這個時候就是值傳遞。

對於值傳遞,函式內部修改的是引數的副本,不會改變原值;
對於引用傳遞,函式內部修改了是變數的指向,從而相應對變數進行了改變。

舉例如下:
當引數是不可變物件時:

>>> a = 10
>>> def change(a):
        a = 20
>>> change(a)
>>> a
10

當引數是可變物件時:
>>> b = [1,2,3]
>>> def change(b):
        b[0] = 0
>>> change(b)
>>> b
[0, 2, 3]

位置引數與關鍵字引數

當多個實參向多個形參傳遞,通常是根據位置來判斷對應關係。

例如:5傳遞給了x,2傳遞給了y,1傳遞給了z:

>>> def yao(x, y, z):
        return x - y - z
>>> yao(5, 2, 1)
2

在傳參時,指定引數名稱,可以忽略位置因素。
例如:

>>> def yao(x, y, z):
        return x - y - z
>>> yao(z=1, y=2, x=5)
2

函式引數可以指定預設值。

例如:下面函式在指定了預設值後,如果在呼叫時沒有傳遞相應引數,引數就會使用預設值。

>>> def yao(x=5, y=2, z=1):
        return x - y - z
>>> yao()
2

引數收集

通過在形參前放置一個*號,該形參就自動建立為一個元祖,可接收多個實參作為其元素。

舉例如下:

>>> def yao(*params):
        print(params)
>>> yao(1,2,3,4,5)
(1, 2, 3, 4, 5)

推薦將該引數作為形參的最後一個引數,這樣在前面形參引數接收完畢後,剩餘的引數就都屬於該引數的元素。
例如:

>>> def yao(x,y,*z):
        print(z)
>>> yao(1,2,3,4,5)
(3, 4, 5)

可以形參前加上**來接收關鍵字引數。該引數是字典形式。
例如:

>>> def yao(**params):
        print(params)
>>> yao(x=1, y=2, z=3)
{'x': 1, 'y': 2, 'z': 3}

引數分配

引數收集說的是,形參如何通過元組形式或字典形式接收多個實參。
引數分配說的是,一個元組形式的實參如何分配給多個形參。

具體操作方式與引數收集類似,具體是在實參傳遞時適用*號或**號。

例如:將元組傳遞給多個形參:

>>> def yao(x, y):
        return x + y
>>> params = (1, 2)
>>> yao(*params)
3

再例如,將字典傳遞給多個形參:
>>> def yao(x,y):
        return x + y
>>> params = {
	'y':1,
	'x':2
	}
>>> yao(**params)
3