1. 程式人生 > >python2.7 函數的參數學習

python2.7 函數的參數學習

讀取 計算 add gin ttr 需求 包括 註冊 但是

1.默認參數

默認參數可以簡化函數的調用。

設置默認參數時,有幾點要註意:

一、必選參數在前,默認參數在後,否則Python的解釋器會報錯。

二、當函數有多個參數時,把變化大的參數放前面,變化小的參數放後面。變化小的參數就可以作為默認參數。

使用默認參數有什麽好處?最大的好處是能降低調用函數的難度。

也可以不按順序提供部分默認參數。當不按順序提供部分默認參數時,需要把參數名寫上

默認參數有個最大的坑,演示如下:

先定義一個函數,傳入一個list,添加一個END再返回:

def add_end(L=[]):
    L.append(‘END‘)
    return L

當你正常調用時,結果似乎不錯:

>>> add_end([1, 2, 3])
[1, 2, 3, ‘END‘]
>>> add_end([‘x‘, ‘y‘, ‘z‘])
[‘x‘, ‘y‘, ‘z‘, ‘END‘]

Python函數在定義的時候,默認參數L的值就被計算出來了,即[],因為默認參數L也是一個變量,它指向對象[],每次調用該函數,如果改變了L的內容,則下次調用時,默認參數的內容就變了,不再是函數定義時的[]了。

所以,定義默認參數要牢記一點:默認參數必須指向不變對象!

為什麽要設計str、None這樣的不變對象呢?

因為不變對象一旦創建,對象內部的數據就不能修改

,這樣就減少了由於修改數據導致的錯誤。
此外,由於對象不變,多任務環境下同時讀取對象不需要加鎖,同時讀一點問題都沒有。

2.可變參數

顧名思義,可變參數就是傳入的參數個數是可變的,可以是1個、2個到任意個,還可以是0個。

由於參數個數不確定,我們首先想到可以把a,b,c……作為一個list或tuple傳進來

需要先組裝出一個list或tuple: calc([1, 2, 3])

如果利用可變參數,調用函數的方式可以簡化成這樣:calc(1, 2, 3)

我們把函數的參數改為可變參數: def calc(*numbers):

定義可變參數和定義list或tuple參數相比,僅僅在參數前面加了一個*

號。

在函數內部,參數numbers接收到的是一個tuple,因此,函數代碼完全不變。但是,調用該函數時,可以傳入任意個參數,包括0個參數: calc(1, 2)

如果已經有一個list或者tuple,要調用一個可變參數怎麽辦?可以這樣做:

所以Python允許你在list或tuple前面加一個*,把list或tuple的元素變成可變參數傳進去:

>>> nums = [1, 2, 3]

>>> calc(*nums)

3.關鍵字參數

可變參數允許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝為一個tuple

而關鍵字參數允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict。請看示例: def person(name, age, **kw):

關鍵字參數有什麽用?它可以擴展函數的功能。

試想你正在做一個用戶註冊的功能,除了用戶名和年齡是必填項外,其他都是可選項,利用關鍵字參數來定義這個函數就能滿足註冊的需求

和可變參數類似,也可以先組裝出一個dict,然後,把該dict轉換為關鍵字參數傳進去:

>>> kw = {‘city‘: ‘Beijing‘, ‘job‘: ‘Engineer‘}

>>> person(‘Jack‘, 24, city=kw[‘city‘], job=kw[‘job‘])

當然,上面復雜的調用可以用簡化的寫法:

>>> kw = {‘city‘: ‘Beijing‘, ‘job‘: ‘Engineer‘}

>>> person(‘Jack‘, 24, **kw)

4.參數組合

在Python中定義函數,可以用必選參數默認參數可變參數關鍵字參數,這4種參數都可以一起使用。

請註意,參數定義的順序必須是:必選參數默認參數可變參數關鍵字參數

比如定義一個函數,包含上述4種參數:

def func(a, b, c=0, *args, **kw):

  print ‘a =‘, a, ‘b =‘, b, ‘c =‘, c, ‘args =‘, args, ‘kw =‘, kw

在函數調用的時候,Python解釋器自動按照參數位置和參數名把對應的參數傳進去。

>>> func(1, 2)

a = 1 b = 2 c = 0 args = () kw = {}

>>> func(1, 2, c=3)

a = 1 b = 2 c = 3 args = () kw = {}

>>> func(1, 2, 3, ‘a‘, ‘b‘)

a = 1 b = 2 c = 3 args = (‘a‘, ‘b‘) kw = {}

>>> func(1, 2, 3, ‘a‘, ‘b‘, x=99)

a = 1 b = 2 c = 3 args = (‘a‘, ‘b‘) kw = {‘x‘: 99}

最神奇的是通過一個tuple和dict,你也可以調用該函數:

>>> args = (1, 2, 3, 4)

>>> kw = {‘x‘: 99}

>>> func(*args, **kw)

  a = 1 b = 2 c = 3 args = (4,) kw = {‘x‘: 99}


所以,對於任意函數,都可以通過類似func(*args, **kw)的形式調用它,無論它的參數是如何定義的。


小結:

Python的函數具有非常靈活的參數形態,既可以實現簡單的調用,又可以傳入非常復雜的參數。

默認參數一定要用不可變對象,如果是可變對象,運行會有邏輯錯誤!

要註意定義可變參數和關鍵字參數的語法:

*args是可變參數,args接收的是一個tuple

**kw是關鍵字參數,kw接收的是一個dict

以及調用函數時如何傳入可變參數和關鍵字參數的語法:

可變參數既可以直接傳入:func(1, 2, 3),又可以先組裝list或tuple,再通過*args傳入:func(*(1, 2, 3))

關鍵字參數既可以直接傳入:func(a=1, b=2),又可以先組裝dict,再通過**kw傳入:func(**{‘a‘: 1, ‘b‘: 2})


使用*args**kw是Python的習慣寫法

python2.7 函數的參數學習