1. 程式人生 > >python列表解析式與生成式表示式

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)}