From:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00137473843313062a8b0e7c19b40aa8f31bdc4db5f6498000
if 語句文法:
if <條件判斷1>: <執行1>elif <條件判斷2>: <執行2>elif <條件判斷3>: <執行3>else: <執行4>
函數定義例子:
def my_abs(x): if x >= 0: return x else: return -x
空函數
def nop(): pass
函數可以返回多個值
>>> x, y = move(100, 100, 60, math.pi / 6)>>> print x, y151.961524227 70.0
但其實這隻是一種假象,Python函數返回的仍然是單一值:
>>> r = move(100, 100, 60, math.pi / 6)>>> print r(151.96152422706632, 70.0)
原來傳回值是一個tuple。但是,在文法上,返回一個tuple可以省略括弧,而多個變數可以同時接收一個tuple,按位置賦給對應的值,所以,Python的函數返回多值其實就是返回一個tuple,但寫起來更方便。 函數可以有預設參數
有坑:
def add_end(L=[]): L.append('END') return L
>>> add_end()['END']
再次調用add_end()時,結果就不對了:
>>> add_end()['END', 'END']>>> add_end()['END', 'END', 'END']
原因解釋如下:
Python函數在定義的時候,預設參數L的值就被計算出來了,即[],因為預設參數L也是一個變數,它指向對象[],每次調用該函數,如果改變了L的內容,則下次調用時,預設參數的內容就變了,不再是函數定義時的[]了。
所以,定義預設參數要牢記一點:預設參數必須指向不變對象。
要修改上面的例子,我們可以用None這個不變對象來實現:
def add_end(L=None): if L is None: L = [] L.append('END') return L
為什麼要設計str、None這樣的不變對象呢。因為不變對象一旦建立,對象內部的資料就不能修改,這樣就減少了由於修改資料導致的錯誤。此外,由於對象不變,多任務環境下同時讀取對象不需要加鎖,同時讀一點問題都沒有。我們在編寫程式時,如果可以設計一個不變對象,那就盡量設計成不變對象。
可變參數 正常list或tuple參數傳輸(非可變參數方式):
def calc(numbers): sum = 0 for n in numbers: sum = sum + n * n return sum
但是調用的時候,需要先組裝出一個list或tuple:
>>> calc([1, 2, 3])14>>> calc((1, 3, 5, 7))84
把函數的參數改為可變參數:
def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum
定義可變參數和定義list或tuple參數相比,僅僅在參數前面加了一個*號。在函數內部,參數numbers接收到的是一個tuple,因此,函數代碼完全不變。但是,調用該函數時,可以傳入任意個參數,包括0個參數:
>>> calc(1, 2)5>>> calc()0
如果已經有一個list或者tuple,要調用一個可變參數怎麼辦。可以這樣做:
>>> nums = [1, 2, 3]>>> calc(nums[0], nums[1], nums[2])14
這種寫法當然是可行的,問題是太繁瑣,所以Python允許你在list或tuple前面加一個*號,把list或tuple的元素變成可變參數傳進去:
>>> nums = [1, 2, 3]>>> calc(*nums)14
這種寫法相當有用,而且很常見。 關鍵字參數
可變參數允許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝為一個tuple。而關鍵字參數允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict。請看樣本:
def person(name, age, **kw): print 'name:', name, 'age:', age, 'other:', kw
函數person除了必選參數name和age外,還接受關鍵字參數kw。在調用該函數時,可以只傳入必選參數:
>>> person('Michael', 30)name: Michael age: 30 other: {}
也可以傳入任意個數的關鍵字參數:
>>> person('Bob', 35, city='Beijing')name: Bob age: 35 other: {'city': 'Beijing'}>>> person('Adam', 45, gender='M', job='Engineer')name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
參數組合
在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的函數具有非常靈活的參數形態,既可以實現簡單的調用,又可以傳入非常複雜的參數。
預設參數一定要用不可變對象,如果是可變對象,運行會有邏輯錯誤。
要注意定義可變參數和關鍵字參數的文法: