1. 程式人生 > >列表推導式和生成器

列表推導式和生成器

一.列表推導式

列表推導是構建列表(list)的快捷方式,而生成器表示式則可以建立其他任何型別的序列,如果你的程式碼裡並不

經常使用它們,你有可能錯過很多可讀性很好的而且更高效的程式碼的機會

示例1: 把一個字串變成Unicode碼位的列表

 

示例2:把字串變成Unicode碼位的另外一種寫法(列表生成式)

 

python2.x中,在列表推導中for關鍵詞之後的賦值操作可能會影響列表推導的

上下文中的同名變數。像下面這個python2.7控制檯對話

如你所見,x原本的值被取代了,但是這種在python3不會出現

 

列表推導,生成器表示式,以及同它們很相似的集合(set)推導和字典(dict)推導,在python3中都有了

自己的區域性作用域,就像函式似的。表示式內部的變數和賦值只在區域性作用,

表示式的上下文裡的同名變數還可以被正常引用,區域性變數並不會影響到他們。

這是python3程式碼:

 

2.列表推導同filter和map的比較

filter和map合起來能做的事情,列表推導也可以做,而且還不需要藉助難以理解

和閱讀的lambda表示式。

示例3:用列表推導和map/filter組合來建立同樣的表單

 

3.列表推導生成笛卡爾積

 

第一種得到的結果是以顏色排列,再以尺碼排列,如果想依照尺碼後顏色的順序來排列,

只需要調整從句的順序。

 

.生成器表示式

雖然也可以用列表推導來初始化元組,陣列或其他序列型別,但是生成器表示式式更好的

選擇。這是因為生成器表示式背後遵守了迭代器協議,可以逐個的產出元素,而不是先建

立一個完整的列表,然後再把這個列表傳遞到某個建構函式裡。前面那種方式顯然能夠節省記憶體。

生成器表示式的語法跟列表推導差不多,只不過把方括號換成圓括號而已。

示例5:用生成器表示式初始化元組和陣列

·如果生成器表示式是一個函式呼叫過程中的唯一引數,那麼不需要額外再用括號把它圍起來

·array的構造方法需要兩個引數,因此括號式必須的。array構造方法的第一個引數指定裡陣列中數字的儲存方式

示例6:使用生成器表示式計算笛卡爾積

使用生成器,不會一次性生成6個組合的列表,因為生成器在每次for迴圈執行時才生成一個組合。生成器可以省掉for迴圈的開銷