上一篇談論到Lambda匿名函式,跟串列運算式一樣都是可以創立新的列表,我個人是覺得會比map
與filter
結合Lambda匿名函式
,來得簡單易讀,但還是因人而異,看所在的群組對哪個接受度較高,就用哪個吧。
本文將介紹串列運算式的應用,同樣的功能也用Lambda匿名函式的方法呈現,比較其差異性,看大家對哪一個接受度較高。
常見的應用是基於一個序列或 iterable(可疊代物件),將每一個元素經過某個運算的結果串接起來成為新的 list。
new_list = [expression for item in iterable if condition]
expression
: 評估為新列表的每個元素的運算式。
item
: 可迭代對象(例如列表、元組、字典的鍵或值等)中的每個元素。
iterable
: 可迭代對象,提供要遍歷的元素。
condition
(可有可無): 一個條件,只有當條件為真時,expression 才會被應用。
for迴圈取出numbers每個元素,代入到x這個變數,在執行x**2這個運算式,將結果回傳收集起來並產新的列表來儲存這些結果。
numbers = [1, 2, 3, 4, 5]
squared = [x**2 for x in numbers]
# 輸出: [1, 4, 9, 16, 25]
for x in numbers
: 使用 for
迴圈遍歷 numbers
列表中的每個元素,用 x
來表示當前元素。x**2
: 對每個 x
的值計算平方。[x**2 for x in numbers]
表示將每個 x
的平方結果收集起來,形成一個新的列表。這個串列運算式可以用一般的 for
迴圈表示如下:
numbers = [1, 2, 3, 4, 5]
squared = []
for x in numbers:
squared.append(x**2)
# 輸出: [1, 4, 9, 16, 25]
print(squared)
用lambda
函式 + Map
函式來表示如下:
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared) # 輸出: [1, 4, 9, 16, 25]
for迴圈取出numbers每個元素,代入到x這個變數,判斷x餘除為0,在執行x**2這個運算式,將結果回傳收集起來並產新的列表來儲存[4, 16]這個結果。
numbers = [1, 2, 3, 4, 5]
even_squares = [x**2 for x in numbers if x % 2 == 0]
# 輸出: [4, 16]
for x in numbers
: 使用 for
迴圈遍歷 numbers
列表中的每個元素,用 x
來表示當前元素。if x % 2 == 0
: 使用 if
條件篩選,只有當 x
是偶數時,才進行後續的操作。x**2
: 對每個滿足條件的 x
的值計算平方。[x**2 for x in numbers if x % 2 == 0]
表示將每個滿足條件的 x
的平方結果收集起來,形成一個新的列表。一般的 for
迴圈表示如下:
numbers = [1, 2, 3, 4, 5]
even_squares = []
for x in numbers:
if x % 2 == 0:
even_squares.append(x**2)
print(even_squares)
# 輸出: [4, 16]
用lambda
函式 +map
與filter
函式來表示如下:
numbers = [1, 2, 3, 4, 5]
# 定義匿名函式
square = lambda x: x**2
# 使用 map 函數應用匿名函式
even_squares = list(map(square, filter(lambda x: x % 2 == 0, numbers)))
# 輸出: [4, 16]
print(even_squares)
# 生成二維列表,其中包含所有 x 和 y 的乘積,並僅包含乘積為偶數的元素
result = [(x, y, x * y) for x in range(1, 4) for y in range(1, 4) if x * y % 2 == 0]
# 輸出: [(1, 2, 2), (1, 4, 4), (2, 2, 4), (2, 4, 8), (3, 2, 6), (3, 4, 12)]
print(result)
一般的 for
迴圈表示如下:
result = []
for x in range(1, 4):
for y in range(1, 4):
if x * y % 2 == 0:
result.append((x, y, x * y))
print(result)
# 輸出: [(1, 2, 2), (1, 4, 4), (2, 2, 4), (2, 4, 8), (3, 2, 6), (3, 4, 12)]
這樣看起來在比較複雜的情況下就不建議用串列運算式來表示了,用一般的for迴圈加if比較好閱讀程式碼,超過兩層以上的運算式,就建議用一般for迴圈來表示吧。