Python進階3——列表解析式和生成器表達式

列表解析式相比循環更加簡介易讀

abc='abcdef'
codes1=[]
for code in abc:
	codes1.append(ord(code))#返回字符對應的十進制數。

codes2=[ord(code) for code in abc]

print(codes1)
print(codes2)

同樣的結果,循環三行代碼,而列表解析式只需要一行,更加簡潔易讀

 

在某些情況,用filter和map生成的列表,用列表解析式的話會更加簡潔

codes3=[ord(code) for code in abc if ord(code)>100]
codes4=list(filter(lambda c:c>100, map(ord, abc)))

print(codes3)
print(codes4)

列表生成式比filter和map的組合可讀性更強

filter函數的第一個參數是函數對象,函數對象可以是lambda表達式,也可以是函數名,作用是根據函數對象,對序列進行過濾

map函數的第一個參數也是函數對象,作用是根據函數對象對序列進行映射

上述代碼先通過map函數將abc中的每個字符映射爲十進制數,然後通過lambda表達式過濾出大於100的十進制數,最後放入一個列表中

 

通過列表解析式組合衣服的尺碼和顏色

colors=['black','white','red','yellow']
sizes=['s', 'm', 'l']

clothes1=[(color, size) for color in colors for size in sizes]
clothes2=[(color, size) for size in sizes for color in colors]

print(clothes1)
print(clothes2)

上述兩個clothes列表的個數相同,但是生成過程不同,clothes1先取得每個顏色,然後匹配每個顏色對應的size,clothes2先取得每個size,然後匹配每個size對應的顏色

上述兩個列表的差別在於for循環的順序不同

 

生成器表達式和列表解析式類似,只不過列表解析式的結果是用中括號,而生成器表達式的結果是小括號

codes5=(ord(code) for code in abc)
codes6=tuple(ord(code) for code in abc)
codes7=list(ord(code) for code in abc)
print(codes5)
print(codes6,'\n', codes7)

生成器表達式只返回一個迭代器,如果需要顯示迭代器的內容,需要將迭代器傳入list函數or tuple函數

生成器表達式執行時,會把元素逐個生成,而不會向列表解析式那樣一次生成所有元素,這樣不僅省內存(因爲不會生成所有元素),也省了for循環時間(遍歷生成時間)

 

通過生成器表達式組合衣服的尺碼和顏色

colors=['black','white','red','yellow']
sizes=['s', 'm', 'l']

for clothes in ((size, color)  for size in sizes for color in colors):
	print(clothes)

可見,每個clothes都是一個元組

 

參考:

《流暢的Python》

 

歡迎大家評論交流,作者水平有限,如有錯誤,歡迎指出

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