1.語法格式:
基礎語法格式
[exp
for iter_var in iterable]
工作過程:
相當於這樣的過程:
l =
for iter_var in iterable:
帶過濾功能語法格式
[exp for iter_var in iterable if_exp]工作過程:
相當於這樣的過程:
l =
for iter_var in iterable:
if_exp:
迴圈巢狀語法格式
[exp工作過程:for iter_var_a in iterable_a for iter_var_b in iterable_b]
每迭代iterable_a中的乙個元素,就把ierable_b中的所有元素都迭代一遍。
相當於這樣的過程:
l =
for iter_var_a in iterable_a:
for iter_var_b in iterable_b:
應用場景
其實列表生成式也是python中的一種「語法糖」,也就是說列表生成式應該是python提供的一種生成列表的簡潔形式,應用列表生成式可以快速生成乙個新的list。它最主要的應用場景是:根據已存在的可迭代物件推導出乙個新的list。
使用例項
我們可以對幾個生成列表的要求分別通過「不使用列表生成式」和「使用列表生成式」來實現,然後做個對比總結。
例項1:生成乙個從3到10的數字列表
list1 =list(range(3, 11))
list2 = [x for x in
range(3, 11)]
例項2:生成乙個2n+1的數字列表,n為從3到11的數字
list3 =
for n in
range(3, 11):
list4 = [2*n + 1例項3:過濾掉乙個指定的數字列表中值大於20的元素for n in
range(3, 11)]
l = [3, 7, 11, 14,19, 33, 26, 57, 99]
list5 =
for x in l:
if x < 20:
list6 = [x for x in l if x < 20]例項4:計算兩個集合的全排列,並將結果作為儲存至乙個新的列表中
l1 = [『香蕉』, 『蘋果』, 『橙子』]
l2 = [『可樂』, 『牛奶』]
list7 =
for x in l1:
for y in l2:
list8 = [(x, y) for x in l1 for y in l2]例項5:將乙個字典轉換成由一組元組組成的列表,元組的格式為(key, value)
d =
list9 =
for k, v in d.items():
list10 = [(k, v) for k, v in d.items()]可見,使用列表生成式確實要方便、簡潔很多,使用一行**就搞定了。
列表生成式與map()、filter()等高階函式功能對比
我覺得,大家應該已經發現這裡說的列表生成式的功能與之前 這篇文章 中講到的map()和filter()高階函式的功能很像,比如下面兩個例子:
例項1:把乙個列表中所有的字串轉換成小寫,非字串元素原樣保留
l = [『tom』, 『peter』, 10, 『jerry』]
list1 = [x.lower() if isinstance(x, str) else x for x in l]
list2 = list(map(lambda x: x.lower() if isinstance(x, str) else x, l))
例項2:把乙個列表中所有的字串轉換成小寫,非字串元素移除
l = [『tom』, 『peter』, 10, 『jerry』]
list3 = [x.lower() for x in l if isinstance(x, str)]map()和filter()
list4 = list(map(lambda x: x.lower(), filter(lambda x: isinstance(x, str), l)))
對於大部分需求來講,使用列表生成式和使用高階函式都能實現。但是map()和filter()等一些高階函式在python3中的返回值型別變成了iteraotr(迭代器)物件(在python2中的返回值型別為list),這對於那些元素數量很大或無限的可迭代物件來說顯然是更合適的,因為可以避免不必要的記憶體空間浪費。
四、可迭代物件(iterable)
我們經常在python的文件中看到「iterable」這個此,它的意思是「可迭代物件」。那麼什麼是可迭代物件呢?
可直接用於for迴圈的物件統稱為可迭代物件(iterable)。
目前我們已經知道的可迭代(可用於for迴圈)的資料型別有:
集合資料型別:如list、tuple、dict、set、str等
生成器(generator)
可以使用isinstance()來判斷乙個物件是否是iterable物件:
from collections import iterable
print(isinstance(, iterable))
五、迭代器(iterator)很明顯上面講的生成器也是迭代器。當然,我們可以使用isinstance()來驗證一下:
from collections import iterator
print(isinstance((x for x in range(5)), iterator))
輸出結果為:true
對迭代器的理解
實際上,python中的iterator物件表示的是乙個資料流,iterator可以被next()函式呼叫被不斷返回下乙個資料,直到沒有資料可以返回時丟擲stopiteration異常錯誤。可以把這個資料流看做乙個有序序列,但我們無法提前知道這個序列的長度。同時,iterator的計算是惰性的,只有通過next()函式時才會計算並返回下乙個資料。(此段內容來自 這裡)
生成器也是這樣的,因為生成器也是迭代器。
六、iterable、iterator與generator之間的關係
生成器物件既是可迭代物件,也是迭代器: 我們已經知道,生成器不但可以作用與for迴圈,還可以被next()函式不斷呼叫並返回下乙個值,直到最後丟擲stopiteration錯誤表示無法繼續返回下乙個值了。也就是說,生成器同時滿足可迭代物件和迭代器的定義;
迭代器物件一定是可迭代物件,反之則不一定: 例如list、dict、str等集合資料型別是可迭代物件,但不是迭代器,但是它們可以通過iter()函式生成乙個迭代器物件。
也就是說:迭代器、生成器和可迭代物件都可以用for迴圈去迭代,生成器和迭代器還可以被next()方函式呼叫並返回下乙個值。
**:
列表生成器
coding utf 8 並不會一次性的將所有的結果計算出來,存放到記憶體當中,而是在使用某一些值得時候,才會去動態計算結果並返回,而沒有使用的值是不會計算的。print xrange 1,10 print range 1,10 generator x x for x in xrange 1,4 p...
python列表生成式與列表生成器
列表生成式 會將所有的結果全部計算出來,把結果存放到記憶體中,如果列表中資料比較多,就會占用過多的記憶體空間,可能會導致memoryerror記憶體錯誤或者導致程式在執行時出現卡頓的情況 列表生成器 會建立乙個列表生成器物件,不會一次性的把所有結果都計算出來,如果需要獲取資料,可以使用next 函式...
列表生成式,列表生成器
coding utf 8 列表生成式是快速生成乙個列表一些公式 numbers for x in range 0,101 print numbers 要放入列表資料 簡單的表示式 1 表示式 2 x for x in range 0,101 for 迴圈遍歷出來的值,放入列表中 numbers x ...