標籤:pow 多個 utf-8 參數 int pytho 匹配 結果 net
python的底層是通過C語言實現,因此參數調用時是通過地址傳遞的(和C語言一樣,值是單向傳遞,指標才能實現雙向傳遞),比如:
# -*- coding: utf-8 -*-
def f1(x,y):
z=x+y
y=x
return z
a= 1b=2c=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): passdef f(a, **b, *c): passdef f(*a, **b, c): passdef f(a, b, *c, **d, e): pass
而下面這幾種定義都是合法的
def f(a, **b): passdef f(a, *b): passdef f(*a, **b): passsdef f(**a): passdef 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 = i6 return maxNum7 8 print max(5, 3, 1, 43, 54, 23, 1, 2, 32)
結果列印54。
參考博文:http://blog.chinaunix.net/uid-29466937-id-5752171.html
Python定義函數時,不同參數類型的傳遞