回顧在Python進階記錄之基礎篇(十一)中,我們介紹了Python中迭代器與生成器的相關知識點,需要重點掌握迭代器與生成器的概念與基本用法。今天我們來講一下Python中的幾個高階函數(shù)。 Python中的高階函數(shù)所謂高階函數(shù),指的是至少滿足下列條件之一的函數(shù):接收一個或多個函數(shù)作為輸入;輸出一個函數(shù)。簡單來說,高階函數(shù)就是一個接受函數(shù)作為輸入或輸出的函數(shù)。高階函數(shù)是函數(shù)式編程的一種。Python中內(nèi)置的高階函數(shù)包括:map( )函數(shù)、reduce( )函數(shù)、filter( )函數(shù)和sorted( )函數(shù)。 map( )函數(shù)/reduce( )函數(shù)MapReduce是一種編程模型,用于大規(guī)模數(shù)據(jù)集(大于1TB)的并行運算。概念'Map(映射)'和'Reduce(歸約)'是它們的主要思想,而這一思想正是借助了我們的map( )函數(shù)和reduce( )函數(shù)。 我們首先看一下map()函數(shù)。map( )函數(shù)接收兩個參數(shù),第一個參數(shù)為函數(shù),第二個參數(shù)為序列,功能是將傳入的函數(shù)依次作用于傳入序列的每個元素,并把結果作為新的列表返回。 假設現(xiàn)在有這樣一個需求:將列表[1, 2, 3, 4, 5, 6, 7, 8, 9]中的每個元素做平方運算。按之前所學的知識,我們可以使用for-in循環(huán)來實現(xiàn)這一需求。 for-in循環(huán)實現(xiàn) 可以看到,使用for-in循環(huán)需要新建一個列表,并通過循環(huán)將原列表中的每個元素進行計算后新增到新列表中?,F(xiàn)在我們使用map( )函數(shù)來實現(xiàn)這一需求。 map()函數(shù)實現(xiàn) map( )函數(shù)接受一個函數(shù)和序列,注意傳的是函數(shù)名,不要帶括號,map( )函數(shù)會自動將序列中的每個元素傳入函數(shù),并返回經(jīng)過函數(shù)處理后的結果。當然,map( )函數(shù)返回的是一個map對象,我們需要把它轉(zhuǎn)成列表才能得到最后的結果。map( )函數(shù)作為高階函數(shù),事實上它只是把運算規(guī)則抽象化了,我們不僅可以做一些數(shù)學運算,還能對傳入的序列做很多其他非運算型操作。 map()函數(shù) 上述代碼中,我們將str( )函數(shù)傳入map( )函數(shù),就將原列表中的數(shù)字轉(zhuǎn)化成了字符串。此外,我們也可以使用匿名函數(shù)作為參數(shù)傳入map()函數(shù)。 接下來我們看一下reduce( )函數(shù)。與map()函數(shù)一樣,reduce( )函數(shù)也是接收兩個參數(shù),第一個參數(shù)為函數(shù),第二個參數(shù)為序列。區(qū)別在于,reduce( )函數(shù)接收的函數(shù)必須有兩個參數(shù),reduce( )函數(shù)會把每次作用結果繼續(xù)和序列的下一個元素做累積計算。這樣看起來可能有點難以理解,我們用一個表達式來表示如下: reduce(f, [x1, x2, x3, ... , xn]) = f(...f(f(x1, x2), x3), ... , xn) 舉一個簡單的例子,我們對一個序列做累加或累乘運算,就可以使用reduce()函數(shù)。 reduce()進行累加和累乘 需要注意的是,Python3開始,reduce( )函數(shù)已經(jīng)不在全局名字空間里了,我們需要通過引入functools模塊才能調(diào)用reduce( )函數(shù)。 filter( )函數(shù)filter( )函數(shù)也是Python中內(nèi)置的一個高階函數(shù),主要用于過濾序列。filter( )函數(shù)同樣接收一個函數(shù)和一個序列,不同的是,filter( )函數(shù)接收的函數(shù)返回值必須是布爾值。filter( )函數(shù)將序列的每個元素作用于傳入的函數(shù),然后根據(jù)返回值是True還是False決定是保留還是舍棄該元素。例如我們要取出一個序列中的所有偶數(shù)就可以使用filter( )函數(shù)。 filter()函數(shù) filter( )函數(shù)的功能與它的名字一樣,就是用于過濾與篩選。所以使用filter( )函數(shù)其實就是實現(xiàn)一個過濾篩選功能。 sorted( )函數(shù)Python中還有一個內(nèi)置的高階函數(shù)——sorted()函數(shù)。sorted( )函數(shù)的主要功能就是排序,從參數(shù)格式上與前面三個高階函數(shù)有所區(qū)別,sorted( )函數(shù)支持只接收一個序列。 sorted()函數(shù)基本用法 上述代碼中sorted()函數(shù)默認是正序排序的,如果我們想要倒序排序,只需設置reverse=True即可。不難發(fā)現(xiàn),sorted( )函數(shù)與我們之前介紹序列時序列內(nèi)部的sort( )函數(shù)基本一樣。 sorted()函數(shù) 以上代碼比較了sort( )函數(shù)和sorted( )函數(shù)的用法區(qū)別,takeSecond函數(shù)的功能是指定序列元素中元組的第二個元素做比較。事實上,序列內(nèi)置的sort( )函數(shù)和全局高階函數(shù)sorted( )函數(shù)的功能都是排序,且傳參和用法都很相似。 總結以上內(nèi)容介紹了高階函數(shù)的基本概念與Python中的幾個高階函數(shù)。需要重點理解高階函數(shù)的特點,掌握map( )函數(shù)、reduce( )函數(shù)、filter( )函數(shù)和sorted( )函數(shù)的用法和主要用途。高階函數(shù)是函數(shù)式編程的重要工具,我們要不斷練習去理解掌握好它。感謝大家的支持與關注,歡迎一起學習交流~ |
|
來自: copy_left > 《python相關》