再一次重新學習Python——函式
-
資料型別轉換
Python內建的常用函式還包括資料型別轉換函式,比如int()
函式可以把其他資料型別轉換為整數:
>>> int('123')
123
>>> int(12.34)
12
>>> float('12.34')
12.34
>>> str(1.23)
'1.23'
>>> unicode(100)
u'100'
>>> bool(1)
True
>>> bool('')
False
函式名其實就是指向一個函式物件的引用,完全可以把函式名賦給一個變數,相當於給這個函式起了一個“別名”:
>>> a = abs # 變數a指向abs函式
>>> a(-1) # 所以也可以通過a呼叫abs函式
1
-
定義函式
在Python中定義函式要用def語句,依次寫出函式名、括號、引數和冒號,然後在縮排塊中編寫函式體
pass語句可以充當佔位符,讓程式碼先執行起來
引數檢查可以用內建函式isinstance實現
Python中函式可以返回多個值
import math def move(x, y, step, angle=0): nx = x + step * math.cos(angle) ny = y - step * math.sin(angle) return nx, ny
這樣我們就可以同時獲得返回值:
>>> x, y = move(100, 100, 60, math.pi / 6)
>>> print x, y
151.961524227 70.0
其實返回的是一個tuple。但是,在語法上,返回一個tuple可以省略括號,而多個變數可以同時接收一個tuple,按位置賦給對應的值,所以,Python的函式返回多值其實就是返回一個tuple,但寫起來更方便。
- 預設引數
定義預設引數要牢記一點:預設引數必須指向不變物件!
為什麼要設計str、None這樣的不變物件呢?因為不變物件一旦建立,物件內部的資料就不能修改,這樣就減少了由於修改資料導致的錯誤。此外,由於物件不變,多工環境下同時讀取物件不需要加鎖,同時讀一點問題都沒有。我們在編寫程式時,如果可以設計一個不變物件,那就儘量設計成不變物件。
- 可變引數(即傳入的引數個數不確定)
定義可變引數和定義list或tuple引數相比,僅僅在引數前面加了一個*
號。在函式內部,引數numbers
接收到的是一個tuple,因此,函式程式碼完全不變。但是,呼叫該函式時,可以傳入任意個引數,包括0個引數:
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
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'}
引數定義的順序必須是:必選引數、預設引數、可變引數和關鍵字引數。
比如定義一個函式,包含上述4種引數:
def func(a, b, c=0, *args, **kw):
print 'a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw
最神奇的是通過一個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)
的形式呼叫它,無論它的引數是如何定義的。
*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})
。