python系列均基於python3.4環境
1、位置傳遞和關鍵字傳遞
- 代碼示例
#位置傳遞 def fun(a,b,c): print("a: {0}, b: {1}, c: {2}".format(a,b,c)) fun(1,2,3) #參數傳遞,位置傳遞 fun(c=3,a=1,b=2) #關鍵字傳遞,位置可以打亂 fun(1,c=3,b=2,) #關鍵字傳遞和位置傳遞混合,位置參數需要在關鍵字參數之前
- 運行結果
a: 1, b: 2, c: 3 a: 1, b: 2, c: 3 a: 1, b: 2, c: 3
- 結果分析:
(1)關鍵字傳遞是根據每個參數的名字傳遞參數。關鍵字並不用遵守位置的對應關系。
(2)關鍵字傳遞可以和位置傳遞混用。但位置參數要出現在關鍵字參數之前。
- 代碼示例2:參數默認值
def fun2(a,b,c=100): print("a: {0}, b: {1}, c: {2}".format(a,b,c)) fun2(1,2) #傳遞2個值,c沒有被賦值,所以c將使用默認值 fun2(1,2,3) #c被賦值為1,將不使用默認值
- 運行結果
a: 1, b: 2, c: 100
a: 1, b: 2, c: 3
- 結果分析:
(1)如果該參數最終沒有被傳遞值,將使用該默認值。
2、包裹位置傳遞
- 代碼示例
def func(*name): print(type(name)) print(name) func(1,2,3) func(5,6,7,1,2,3)
- 運行結果
<class 'tuple'> (1, 2, 3) <class 'tuple'> (5, 6, 7, 1, 2, 3)
- 結果分析:
(1)兩次調用,盡管參數個數不同,都基於同一個func定義。在func的參數表中,所有的參數被name收集,根據位置合並成一個元組(tuple)。
(2)name是包裹位置傳遞所用的元組名,在定義func時,在name前加*號。
3、包裹關鍵字傳遞
- 代碼示例
def func(**dict): print(type(dict)) print(dict) func(a=1,b=9) func(m=2,n=1,c=11)
- 運行結果
<class 'dict'> {'b': 9, 'a': 1} <class 'dict'> {'n': 1, 'm': 2, 'c': 11}
- 結果分析
(1)dict是一個字典,收集所有的關鍵字,傳遞給函數func。參數dict是包裹關鍵字傳遞所用的字典,在dict前加**。
4、解包裹(包裹和解包裹並不是相反操作,是兩個相對獨立的過程。)
- 代碼示例
#解包裹 def func(a,b,c): print(a,b,c) args = (1,2,3) func(*args) dict = {'a':1,'b':2,'c':3} func(**dict)
- 運行結果
1 2 3 1 2 3
- 結果分析:
(1)*和**,也可以在解包裹的時使用。
(2)在傳遞tuple時,讓tuple的每一個元素對應一個位置參數。在調用func時使用*,把args拆成分散的三個元素,分別傳遞給a,b,c。
(3)在傳遞詞典dict時,讓詞典的每個鍵值對作為一個關鍵字傳遞給func。
5、結論
- 在定義或者調用參數時,參數的幾種傳遞方式可以混合。基本原則是,先位置,再關鍵字,再包裹位置,再包裹關鍵字。
6、附:學習參考