python列表生成器

2021-08-15 19:36:56 字數 3718 閱讀 7553

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

for n in

range(3, 11)]

例項3:過濾掉乙個指定的數字列表中值大於20的元素

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 ...