Python定義函數時,不同參數類型的傳遞


python的底層是通過C語言實現,因此參數調用時是通過地址傳遞的(和C語言一樣,值是單向傳遞,指針才能實現雙向傳遞),比如:

 
         
# -*- coding: utf-8 -*-
def f1(x,y):
z=x+y
y=x
  return z
a= 1 b=2 c=f1(a, b) print c, a, b

得到的結果是

3 1 2

從這里可以看出b值並沒有變化,也就是說值是單向傳遞的。

函數的定義時,參數可以是數值,列表(當元組處理),字典等,其參數定義形式如下:

def f(a, *pargs, **kargs): 
    print(a, pargs, kargs)

實際上這是python的很重要的一個特性,即arbitrary arguments。當你需要一個函數支持任意多個參數的時候,你就會用到它。上面例子中的那個函數,python會把匹配上的參數作為一個tuple(元祖)來處理。可以像下面這樣調用函數f,

f(1, 3, 'abc', ('lls', 'pow'), param1 = 'A')

打印出來結果如下:

(1, (3, 'abc', ('lls', 'pow')), {'param1': 'A'})

python會把1匹配給參數a,把3, 'abc', ('lls', 'pow')匹配給pargs,可以看出pargs被用tuple (3, 'abc', ('lls', 'pow'))賦值。
類似的,前面出現兩個星號的kargs會被用字典匹配,即所有像param = x這種格式的傳入參數會被轉成dict賦值給給kargs。

需要注意的是,在定義函數的時候**kargs這種類型的參數必須放在最后(如果有的話),而*pargs這種類型的參數必須放在**kargs這種類型參數的前面,其他類型參數的后面。
比如下面這幾種定義都是非法的

def f(a, *b, c=6, **d):
    pass
def f(a, **b, *c):
    pass
def f(*a, **b, c):
    pass
def f(a, b, *c, **d, e):
    pass

而下面這幾種定義都是合法的

def f(a, **b):
    pass
def f(a, *b):
    pass
def f(*a, **b):
    passs
def f(**a):
    pass
def f(a, b=1, *c, **d):
    pass

舉一個實際一點的例子,寫一個函數,輸入任意多個數字作為參數,找到其中最大的一個,就可以利用我們提到的*pargs, 代碼如下:

1 def max(*pargs):
2     maxNum = pargs[0]
3     for i in pargs[1:]:
4         if i > maxNum:
5             maxNum = i
6     return maxNum
7 
8 print max(5, 3, 1, 43, 54, 23, 1, 2, 32)

結果打印54。

 

 

參考博文:http://blog.chinaunix.net/uid-29466937-id-5752171.html

 


免責聲明!

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



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