python列表解析式與生成式表示式
一、列表解析式
語法: [返回值 for 元素 in 可迭代物件 if 條件]
使用中括號[],內部是for迴圈,if條件語句可選 返回一個新的列表
列表解析式是一種語法糖,編譯器會優化,不會因為簡寫而影響效率,反而因優化提高了效率,減少程式設計師工作量,減少出錯 ,簡化了程式碼,但可讀性增強
[expr for item in iterable if cond1 if cond2] 與[expr for item in iterable if cond1 and cond2] 等價
例:有一個列表lst = [1,4,9,16,2,5,10,15],生成一個新列表,要求新列表元素是lst相鄰2項的和
[lst[i]+lst[i+1] for i in range(len(lst)-1)]
二、生成器表示式
語法:(返回值 for 元素 in 可迭代物件 if 條件)
列表解析式的中括號換成小括號就行了,返回一個生成器
例:有一個列表lst = [1,4,9,16,2,5,10,15],生成一個新列表,要求新列表元素是lst相鄰2項的和
(lst[i]+lst[i+1] for i in range(len(lst)-1))
生成器表示式與列表解析式的區別:
生成器表示式是按需計算(或稱惰性求值、延遲計算),需要的時候才計算值 ,生成器是可迭代物件,是迭代器,可以迭代,使用next(),從前到後走完一遍後,不能回頭,但從返回值本身來說,生成器表示式省記憶體,本身並沒有返回任何值,只是返回了一個生成器物件,使用的時候,一個個返回資料,合起來佔用的記憶體也差不多
列表解析式是立即返回值 ,返回的是可迭代物件列表,不是迭代器,從前到後走完一遍後,可以重新回頭迭代,列表解析式構造並返回一個新的列表,構造新的列表需要佔用記憶體。
生成器和迭代器是不同的物件,但都是可迭代物件
三、集合解析式
語法:{返回值 for 元素 in 可迭代物件 if 條件}
列表解析式的中括號換成大括號{}就行了 ,立即返回一個集合
例:{(x,x+1) for x in range(10)}
四、字典解析式
語法: {返回值 for 元素 in 可迭代物件 if 條件}
列表解析式的中括號換成大括號{}就行了,使用key:value形式 ,立即返回一個字典
例: {x:(x,x+1) for x in range(10)}
{str(x):y for x in range(3) for y in range(4)}