列表推導式和生成器
一.列表推導式
列表推導是構建列表(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迴圈的開銷