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