Python3萌新入門筆記(22)

這一篇教程,我們一起了解列表推導式(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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章