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

來源:互聯網
上載者:User

標籤: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定義函數時,不同參數類型的傳遞

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.