列表解析式相比循環更加簡介易讀
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》
歡迎大家評論交流,作者水平有限,如有錯誤,歡迎指出