1. 程式人生 > 實用技巧 >Python 函式物件的本質

Python 函式物件的本質

Python 函式物件本質上是 function 類的例項。

1 從示例說起

def factorial(n):
    '''return n!'''
    return 1 if n < 2 else n * factorial(n - 1)


r = factorial(42)
logging.info('r -> %s', r)
logging.info('__doc__ -> %s', factorial.__doc__)
logging.info('type(factorial)  -> %s', type(factorial))
複製程式碼

執行結果:

INFO - r -> 1405006117752879898543142606244511569936384000000000
INFO - __doc__ -> return n!
INFO - type(factorial) -> <class 'function'>
複製程式碼

這個示例首先定義了一個計算斐波那契數列的函式,可以看到 type(factorial) 的返回值是 <class 'function'>。也就驗證了函式物件是 function 類的例項。

示例中還使用函式的 __doc__ 屬性輸出了函式定義中的註釋。這一點比 Java 強大,Java 必須把註釋定義在註解中才能通過程式碼獲取到。

2 help 函式

python 中還有一個 help 函式,它可以接受一個自定義函式作為入參,然後輸出該函式的說明文件。形如:

help(factorial)
複製程式碼

執行結果:

Help on function factorial in module __main__:

factorial(n)
    return n!
複製程式碼

3 函式別名與函式傳參

函式可以賦值給變數,也可以作為其他函式的入參。

f = factorial
logging.info('f -> %s', f)
logging.info('f(5) -> %s', f(5))

r = map(factorial, range(11))
logging.info('r -> %s', r)

r = list(map(f, range(11)))
logging.info('r -> %s', r)
複製程式碼

執行結果:

INFO - f -> <function factorial at 0x0000027278917798>
INFO - f(5) -> 120
INFO - r -> <map object at 0x000002727893F588>
INFO - r -> [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
複製程式碼

示例中首先把之前定義的斐波那契數列函式賦值給變數 f;可以看到這個變數本身就是 factorial 函式的引用。還可以像使用 factorial 函式一樣,直接給 f 函式傳參,計算出想要的斐波那契數列結果。

接著把 factorial 函式傳入 Python 的 map() 函式。map() 函式的語法為:map(function, iterable, ...),它會以引數序列中的每一個元素呼叫 function 函式,返回包含每次 function 函式返回值的新列表2

因為在 Pyhon 3.x 中 map() 函式只返回迭代器,所以示例中對其進行 list 轉換。這樣就輸出了從 0 到 11 作為入參的各自斐波那契結果列表。因為 range() 函式的語法為:range(start, stop[, step]),預設從 0 開始3,所以範圍是從 0 到 11。

函式與整數、字串與字典一樣,它們都是 Python 世界中的一等公民。

交流基地:630390733