在python中,函數是一等對象。編程語言理論家把「一等對象」定義爲知足如下條件的程序實體:python
在python中,整數、字符串和字典都是一等對象,沒有什麼特別之處。編程
標題「一等函數」是「把函數視做一等對象」的簡稱,雖然並不完美,但只是一種稱謂。數據結構
>>> def factorial(n): ... '''returns n''' ... return 1 if n < 2 else n * factorial(n - 1) ... >>> factorial(42) 1405006117752879898543142606244511569936384000000000 >>> type(factorial) <class 'function'> >>> fact = factorial >>> fact <function factorial at 0x00000228D7391EA0> >>> fact(5) 120 >>> map(factorial, range(11)) <map object at 0x00000228D92236D8> >>> list(map(factorial, range(11))) [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800] >>>
程序中定義了一個階乘函數 factorial, 其自己是一個遞歸函數,能夠理解爲函數能夠做爲函數的返回值(的一部分),能夠作正常運算,也能夠複製給另外一個變量fact,也能夠做爲高等函數map 的一個參數。app
接受函數做爲參數,或者把函數做爲結果返回的函數是高等函數編程語言
python中經常使用的高等函數包括map, filter, sorted, reduce等等函數
>>> fruits = ['strawberry', 'apple', 'banana', 'peach', 'fig', 'cherry'] >>> sorted(fruits) ['apple', 'banana', 'cherry', 'fig', 'peach', 'strawberry'] >>> def reverse(word): ... return word[::-1] ... >>> reverse('testing') 'gnitset' >>> sorted(fruits, key=reverse) ['banana', 'apple', 'fig', 'peach', 'strawberry', 'cherry']
sorted 是一個高級函數,其能夠接受函數 reverse 做爲參數ui
>>> from functools import reduce >>> from operator import add >>> reduce(add, range(100)) 4950 >>> sum(range(100)) 4950
從python3.0 起,reduce再也不是內置函數,其做用被減弱,可輕易被替代。上例是計算0~99 的和。sum 和 reduce 的通用思想是把某個操做連續運用到序列的元素上,累積計算,把一系列值規約成一個值。code
lambda關鍵字在python表達式內建立匿名函數對象
然而,python簡單的句法限制了 lambda 函數的定義體只能使用純表達式,即lambda 函數的定義體中不能賦值,不能使用while、try等python語句。遞歸
匿名函數適合用於做爲函數的參數
>>> fruits ['strawberry', 'apple', 'banana', 'peach', 'fig', 'cherry'] >>> sorted(fruits, key=lambda word: word[::-1]) ['banana', 'apple', 'fig', 'peach', 'strawberry', 'cherry']