python--基礎學習(五)參數位置傳遞、關鍵字傳遞、包裹傳遞及解包裹


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、附:學習參考

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM