Python 把函数视作对象
一等函數
在 Python 中,函數是一等對象。一等對象需要具備以下幾個條件:
1.在運行時創建
2.能賦值給變量或者數據結構中的元素
3.能作為參數傳遞給函數
4.能作為函數的返回值
在 Python 中,整數、字符串、字典以及所有的函數都是一等對象,接下來我們來看把函數作為對象的實際應用。
把函數視作對象
首先我們通過一個簡單的示例來說明函數為什么是對象。
>>> def myFunc(n): ... '''return n!''' ... return n*n ... >>> myFunc(5) 25 >>> myFunc.__doc__ 'return n!' >>> type(myFunc) <class 'function'> >>>首先,我們直接在控制臺創建一個函數。
然后通過函數調用__doc__屬性,而__doc__就是函數對象中眾多屬性的其中一個。
然后通過 type(myFunc)查看函數類型,它是 function 類的一個實例。
由以上示例可以看出函數其實就是一個對象。
OK,接下來再通過一個示例來展示函數對象的”一等“本性。
>>> fun = myFunc >>> fun <function myFunc at 0x1015a2268> >>> fun(5) 25 >>> map(fun,range(5)) <map object at 0x10177a550> >>> list(map(fun,range(5))) [0, 1, 4, 9, 16] >>>這個示例中,通過別的名稱使用函數,再把函數作為參數傳遞。
我們把 myFunc函數賦值給變量 fun,然后通過變量名來調用,還能把它當做參數傳遞給 map 函數,map 函數返回一個可迭代的對象,里面的元素是把第一個參數(一個函數)應用到第二個參數(一個可迭代對象,這里是 range(5))中各個元素上得到結果。
有了一等函數,就可以使用函數式風格編程了。函數式編程的特點之是使用高階函數。
高階函數
高階函數的定義:接收函數為參數,或者把函數作為結果返回的函數。
比如 map函數就是一個高階函數。另外,內置函數 sorted 也是,可選的 key 參數用于提供一個函數,它會應用到各個元素上進行排序。
來看一下 sorted 函數的簡單示例:
>>> fruits = ['strawberry','fig','apple','cherry'] >>> sorted(fruits,key = len) ['fig', 'apple', 'cherry', 'strawberry'] >>>任何單參數函數都能作為 key 參數的值。
在看個示例,為了創建押韻詞典,可以把各個單詞反過來拼寫,然后進行排序。
示例:根據反向拼寫給一個單詞列表進行排序
>>> fruits = ['strawberry','fig','apple','cherry','raspberry'] >>> def reverse(word): ... return word[::-1] ... >>> reverse('testing') 'gnitset' >>> sorted(fruits,key=reverse) ['apple', 'fig', 'raspberry', 'strawberry', 'cherry'] >>>注意,以上示例中列表的單詞并沒有變,只是把反向拼寫當做排序條件。
在函數式編程中,最熟知的高階函數有 map、filter、reduce,不過多數使用場景下都有更好的替代品。
map、filter與reduce的現代替代品
函數式編程通常會提供map、filter與reduce三個高階函數,在 Python3中,map 和 filter 還是內置函數,但是由于引入了列表推導和生成器表達式,它們變得不那么重要了??梢允褂昧斜硗茖Щ蛏善鞅磉_式完全具有可以用來替代這兩個函數,并且更易于閱讀。
接下來看看如何用列表式推導來替代 map 和 filter
>>> list(map(fun,range(6))) [0, 1, 4, 9, 16, 25] >>> [fun(n) for n in range(6)] [0, 1, 4, 9, 16, 25]>>> list(map(fun,filter(lambda n:n%2,range(6)))) [1, 9, 25] >>> [fun(n) for n in range(6) if n%2] [1, 9, 25] >>>Python3中,map 和 filter 返回生成器(一種迭代器),因此現在它們的直接替代品是生成器表達式。filter 的作用是用于過濾列表,上面使用量 Lambda 表達式,其可閱讀性相對來說沒有列表推導的高。
接下來看看 reduce,在 Python2中,reduce 是內置函數,但是在 Python3中放到 functools 模塊中了,這個函數最常用于求和,但是從 Python2.3起,求和函數可以使用內置的 sum 函數,在可讀性和性能方面,有了很大的改善。
示例:使用 reduce 和sum 計算和
>>> from functools import reduce >>> from operator import add >>> reduce(add,range(100)) 4950 >>> sum(range(100)) 4950 >>>以上可以看到,使用 reduce 求和需要導入和創建求和函數,但是使用 sum 就不用,非常簡單。
sum 和 reduce 的通用思想是把某個操作連續應用到序列的元素上,并累計之前的結果,把一系列值歸約成一個值。
此外,all 和 any 也是內置的歸約函數。
1.all(iterable)
如果iterable的每個元素都是真值,返回 True,all([])返回 True
2.any(iterable)
如果iterable中有元素是真值,就返回 True,any([])返回 False
本文參考:《流暢的 Python》.
《流暢的 Python》電子書高清中文版下載地址,在這里
總結
以上是生活随笔為你收集整理的Python 把函数视作对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt C++中 Map 和 List
- 下一篇: Qt for Python Mac下使用