這一篇教程,我們一起了解列表推導式(List Comprehension)和lambda表達式。
第一部分,我們先來了解列表推導式。
列表推導式的官方定義:一種採用簡潔的方式來處理序列中的全部或部分元素,並返回結果列表。
定義中的序列實際上是指可迭代對象。
我們先來看一個例子,創建一個整數1~6平方的列表。
示例代碼:
lst = [x * x for x in range(1, 7)] # 列表推導式:循環獲取範圍1~6的整數,計算乘積後添加到新列表。 print(lst) # 顯示輸出結果爲:[1, 4, 9, 16, 25, 36]
上方代碼中,創建列表時使用了列表推導式。
後方的for循環能夠從1~6的範圍取出整數,前方的計算公式將取出的整數自身相乘。
每一次循環都會取出數字和計算乘積,添加到一個新的列表中。
除了迭代取出元素和設定計算方法形成列表,列表推導式還能夠設置條件,滿足條件的元素才能夠經過計算添加到列表。
例如,我們只需要1~6中偶數的平方。
示例代碼:
lst = [x * x for x in range(1, 7) if x % 2 == 0] # 列表推導式:循環獲取範圍1~6的整數,符合條件時,計算乘積後添加到新列表。 print(lst) # 顯示輸出結果爲:[4, 16, 36]
上方代碼中,我們加入了條件,當取出的元素取餘2爲0時,進行計算。
由此我們能夠看出列表推導式的組成爲:[元素(或計算方法) for循環(允許多個) if語句]
再來看個例子,從整數列表中取出小於3的元素,並從平方列表中取出對應的元素,組成算式列表。
期待顯示輸出結果爲:[‘1²=1’, ‘2²=4’, ‘3²=9’]
示例代碼:(錯誤示例)
number = [1, 2, 3, 4, 5, 6] # 整數列表 square = [1, 4, 9, 16, 25, 36] # 平方列表 lst = ['{0}²={1}'.format(str(x), str(y)) for x in number for y in square if x <= 3] print(lst)
上方代碼運行結果爲:
運行的結果和我們期待的不一樣。
實際上,在列表推導式中有多個循環時,會出現嵌套循環的效果,而不是同步循環的效果。
也就是說,當前面的循環取出第1個元素,後方的循環會進行一輪迭代;當前面的循環取出第2個元素,後方的循環又會進行一輪迭代;以此類推,直到前方的循環完成一輪迭代爲止。(可以觀察顯示結果的列表元素和排列順序)
那麼,如何能夠得到正確的結果呢?
我們需要增加條件,當前方循環取出元素的平方等於後方循環取出元素的時候,再添加到列表。
示例代碼:(正確)
number = [1, 2, 3, 4, 5, 6] # 整數列表 square = [1, 4, 9, 16, 25, 36] # 平方列表 lst = ['{0}²={1}'.format(str(x), str(y)) for x in number for y in square if x <= 3 and x * x == y] print(lst) # 顯示輸出結果爲:['1²=1', '2²=4', '3²=9']
以上代碼等同於下方代碼。
示例代碼:
number = [1, 2, 3, 4, 5, 6] square = [1, 4, 9, 16, 25, 36] lst = [] # 此部分用列表推導式替代 for x in number: # 此部分用列表推導式替代 for y in square: # 此部分用列表推導式替代 if x <= 3 and x * x == y: # 此部分用列表推導式替代 lst.append('{0}²={1}'.format(str(x), str(y))) # 此部分用列表推導式替代 print(lst)
通過上方代碼,大家可以看出,創建同樣的列表,使用列表推導式更加簡潔。
第二部分,我們再來了解lambda表達式。
lambda表達式的官方定義:一個匿名內聯函數,由一個表達式組成,在函數被調用時求值。
創建lambda函數的語法: lambda [參數] : 表達式
lambda表達式可用於函數的參數。
例如,我們從一個整數列表中篩選所有的偶數,可以使用filter函數。
這個函數的參數是function和iterable,也就是1個函數和1個可迭代對象。
示例代碼:
def iseven(n): # 定義驗證數字是否偶數的函數 if n % 2 == 0: # 判斷參數是否爲偶數 return True # 符合條件返回真值 else: return False #否則返回假值 lst = list(filter(iseven, number)) # 通過函數iseven對每個number的元素進行驗證,驗證爲真的保留,並將最終結果轉換爲list。 print(lst) # 顯示輸出結果爲:[2, 4, 6]
從上面的示例中,我們能夠看到函數(iseven)可以作爲另外一個函數(filter)的參數,並通過這個函數對其它參數進行處理。
filter函數會把number的每一個元素作爲函數iseven的參數傳入,進行計算,並將返回結
不過這樣的代碼,很明顯看上去有些複雜。
我們可以使用lambda表達式這種匿名函數作爲參數,起到同樣的作用。
number = [1, 2, 3, 4, 5, 6] # 整數列表 lst = list(filter(lambda x: x % 2 == 0, number)) # 通過lambda表達式對每個number的元素進行驗證,並將所有驗證結果轉換爲list。 print(lst) # 顯示輸出結果爲:[2, 4, 6]
上方代碼中,每一個number的元素都會作爲lambda表達式的參數(冒號前面的x)進行驗證,如果符合條件(冒號後方的表達式),則會保留元素。
很顯然,在這種情況下通過lambda表達式可以讓代碼非常簡化。
本節知識點:
1、列表推導式;
2、lambda表達式。
本節英文單詞與中文釋義:
1、square:平方
2、even:偶數
3、comprehension:理解
4、lambda:希臘字母λ的英文名稱,大名鼎鼎的遊戲半條命裏面的logo就是這個。
練習:
從姓名集合中篩選出姓氏爲“李”的姓名。
name_set = {‘邢佳棟’, ‘李學慶’, ‘高昊’, ‘潘粵明’, ‘戴軍’, ‘薛之謙’, ‘賈宏聲’, ‘于波’, ‘李連杰’, ‘王斑’, ‘藍雨’, ‘劉恩佑’,’任泉’, ‘李光潔’, ‘姜文’, ‘黑龍’, ‘張殿菲’, ‘鄧超’, ‘張傑’, ‘楊坤’, ‘沙溢’, ‘李茂’, ‘黃磊’, ‘于小偉’, ‘劉冠翔’,’秦俊傑’, ‘張琳’, ‘陳坤’, ‘黃覺’, ‘邵峯’, ‘陳旭’, ‘馬天宇’, ‘楊子’, ‘鄧安奇’, ‘趙鴻飛’, ‘馬可’, ‘黃海波’,’黃志忠’, ‘李晨’, ‘後弦’, ‘王挺’, ‘何炅’, ‘朱亞文’, ‘胡軍’, ‘許亞軍’, ‘張涵予’, ‘賈乃亮’, ‘陸虎’, ‘印小天’,’於和偉’, ‘田亮’, ‘夏雨’, ‘李亞鵬’, ‘胡兵’, ‘王睿’, ‘保劍鋒’, ‘於震’, ‘甦醒’, ‘胡夏’, ‘張豐毅’, ‘劉翔’,’李玉剛’, ‘林依輪’, ‘袁弘’, ‘朱雨辰’, ‘丁志誠’, ‘黃徵’, ‘張子健’, ‘許嵩’}
答案:(見原文評論1樓)
轉載自:魔力 • Python » Python3萌新入門筆記(22)