Python之列表表达式及高阶函数lamda、zip、enumerate、map和filter方法
生活随笔
收集整理的這篇文章主要介紹了
Python之列表表达式及高阶函数lamda、zip、enumerate、map和filter方法
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、列表表達(dá)式[List Comprehension]
- 顧名思義,這個(gè)表達(dá)式作用是以一個(gè)快捷的方法對(duì)列表進(jìn)行操作或運(yùn)算,返回新的列表。其使用方式為[表達(dá)式 for 變量 in 列表] 或者 [表達(dá)式 for 變量 in 列表 if 條件]。
- 一個(gè)最簡單的列表表達(dá)式,如下所示:
- 列表表達(dá)式也可以遍歷元組生成新的列表(如 list5),然而卻不能直接生成新的元組。比如 list6 實(shí)際上是個(gè)生成器表達(dá)式,不屬于列表表達(dá)式了。對(duì)于生成器表達(dá)式可以通過使用 list6.next() 方法一次一次取值。
- 統(tǒng)計(jì)字符串列表中每個(gè)字符串的長度:
- 利于列表表達(dá)式求兩個(gè)列表的交集:
- 打印出 100 以內(nèi)所有十位數(shù)比個(gè)位數(shù)大 1 位的數(shù)字:
二、匿名函數(shù) lambda 函數(shù)
- Lambda 函數(shù)又稱匿名函數(shù),也有人稱為 lambda 表達(dá)式。顧名思義,匿名函數(shù)就是沒有名字的函數(shù)。函數(shù)沒有名字也行嗎?當(dāng)然可以啦。有些函數(shù)如果只是臨時(shí)一用,而且它的業(yè)務(wù)邏輯也很簡單時(shí),就沒必要非給它取個(gè)名字不可。
- lambda 匿名函數(shù)的格式是 lambda 參數(shù): 表達(dá)式,冒號(hào)前是參數(shù),可以有多個(gè),用逗號(hào)隔開,冒號(hào)右邊的為表達(dá)式。其實(shí) lambda 返回值是一個(gè)函數(shù)的地址,也就是函數(shù)對(duì)象。
- 如下所示,是一個(gè)最簡單的 lambda 函數(shù):
- 既然是匿名函數(shù),為什么還要給它取個(gè)叫 add 的名字?這的確是多次一舉。其實(shí) lambda 最常用的還是和 sorted, map、reduce、filter 這些高級(jí)函數(shù)結(jié)合使用。
- 再來看兩個(gè)使用 lambda 函數(shù)結(jié)合 sorted 方法排序的經(jīng)典例子:一個(gè)按絕對(duì)值大小排序,一個(gè)按字符串長度排序:
- 如下所示,是一道關(guān)于 lambda 函數(shù)的經(jīng)典面試題,flist[0] 結(jié)果輸出什么呢?
- 這個(gè)主要考函數(shù)對(duì)象列表,千萬不要和列表表達(dá)式搞混了,答案是 flist[0] 輸出的是函數(shù)對(duì)象。
三、zip 函數(shù)
- zip() 函數(shù)來可以把 2 個(gè)或多個(gè)列表合并,并創(chuàng)建一個(gè)元組對(duì)的列表,元組對(duì)的數(shù)量以合并列表的最短長度為準(zhǔn)
- python 3中 zip 方法合并列表后生成的是 zip 對(duì)象,使用 list 方法可以將其變成列表,使用 dict 方法可以將其變成字典:
- 實(shí)際上 zip 方法支持所有可迭代對(duì)象(字符串、列表、元祖、字典),而不僅僅是列表。利用這個(gè)特性,可以很容易創(chuàng)建各種字典,包括很復(fù)雜的字典。
- 來看 2 個(gè)經(jīng)典例子,如下所示,注意 zip 對(duì)象支持直接遍歷,不需要先轉(zhuǎn)成 list 或 dict:
- 利用 zip(*some_list) 方法可以實(shí)現(xiàn)元組列表的反向解壓,如下所示:
- 注意 unzip 只支持元組列表,不支持 dict 直接解壓。
四、enumerate() 函數(shù)
- enumerate() 函數(shù)用于將一個(gè)可遍歷的數(shù)據(jù)對(duì)象(如列表、元組或字符串)組合為一個(gè)索引序列,同時(shí)列出數(shù)據(jù)和數(shù)據(jù)下標(biāo),常見用于 for 循環(huán)。一般只有需要同時(shí)用到索引 index 和 value 值的時(shí)候才用 enumerate 方法。
- 直接使用 enumerate 方法生成是個(gè) enumerate 對(duì)象,可以遍歷。
五、map 函數(shù)
- map 函數(shù)是個(gè)非常有用的方法,其語法是 map(function, iterable, …)。map 方法可以接收函數(shù)作為參數(shù),并將其映射于列表的多個(gè)元素。
- Python 2 中返回列表,Python 3 中返回迭代器,需要使用 list 方法再生成列表。
- map 函數(shù)不僅支持自定義的函數(shù)和 lambda 函數(shù),還支持 Python 自帶的函數(shù)。
- 如下所示,map 函數(shù)應(yīng)用,將計(jì)算平方的 lambda 函數(shù)映射于列表中的每個(gè)元素:
- map 函數(shù)還支持多個(gè)列表的映射和計(jì)算,如下所示:
- lambda 函數(shù)中的 x, y, z 分別對(duì)應(yīng)列表 l1、l2 和 l3 中的元素,計(jì)算后的生成的列表長度取決于各個(gè)列表的最短長度。
- 下面來看一道關(guān)于 map 函數(shù)的經(jīng)典考題:有兩個(gè)字符串 A 和 B,現(xiàn)在要統(tǒng)計(jì)字符串 A 中有多少個(gè)字符也在字符串 B 中可以找到,常規(guī)函數(shù)解法如下:
- 使用 map 函數(shù)經(jīng)典解法如下:
- 來分析下上面這段代碼,Python 自帶的 string.count(char) 函數(shù)的作用是統(tǒng)計(jì)一個(gè)字符串 string 含有字符 char 的數(shù)量,在本例中 strB 相當(dāng)于 char 的一個(gè)參數(shù)列表 [“a”, “A”],map 函數(shù)先統(tǒng)計(jì) strA 中字符 a 的數(shù)量,再統(tǒng)計(jì) strA 中字符 A 的數(shù)量,獲得列表 [1, 3],然后將它們相加,即可獲得字符串 A 中總共有多少字符可以在 B 中找到。
六、reduce 函數(shù)
- reduce() 函數(shù)會(huì)對(duì)參數(shù)序列中元素進(jìn)行累積,該方法第一個(gè)參數(shù)必需是函數(shù),而且傳入的函數(shù)必需要有 2。個(gè)參數(shù),否則出現(xiàn)錯(cuò)誤。該方法將一個(gè)數(shù)據(jù)集合(列表,元組等)中的所有數(shù)據(jù)進(jìn)行下列操作:用傳給 reduce 中的函數(shù) function 先對(duì)集合中的第 1、2 個(gè)元素進(jìn)行操作,得到的結(jié)果再與第三個(gè)數(shù)據(jù)用 function 函數(shù)運(yùn)算,最后得到一個(gè)結(jié)果。
- reduce 函數(shù)很適合連續(xù)計(jì)算(比如列表求和或連乘計(jì)算階乘),經(jīng)典代碼如下:
- Python 3 中 reduce() 函數(shù)已經(jīng)被從全局名字空間里移除了,它現(xiàn)在被放置在 fucntools 模塊里,如果想要使用它,則需要通過引入 functools 模塊來調(diào)用 reduce() 函數(shù)。
七、filter 函數(shù)
- Python 的 filter() 函數(shù)用于過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。該方法與 map 和 reduce 類似,第一個(gè)參數(shù)都是函數(shù),作用于可以迭代的對(duì)象比如列表和元組,但不同的是 filter 方法傳入的函數(shù)是判斷性函數(shù),只有符合條件的列表元素才會(huì)加入新的列表。Python 2 中返回列表,Python 3 中返回 filter 對(duì)象,使用 list 方法可以轉(zhuǎn)化為列表。
- 如下所示,使用 filter 方法打印出 10 以內(nèi)偶數(shù),只有滿足 x % 2 == 0 的列表元素才會(huì)加入新的列表:
- 利用 filter 方法刪除字符串列表里的空白字符串,只有滿足 s and s.strip() = True 的字符串才會(huì)加入新的列表:
- 如下所示,是一道關(guān)于 filter 方法的經(jīng)典面試題,利用 filter 方法篩選出一個(gè)列表中的素?cái)?shù):
總結(jié)
以上是生活随笔為你收集整理的Python之列表表达式及高阶函数lamda、zip、enumerate、map和filter方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python之字典类型数据常见操作及排序
- 下一篇: Python之精心整理的二十五个文本提取