1. 程式人生 > >再一次重新學習Python——函式

再一次重新學習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除了必選引數nameage外,還接受關鍵字引數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})