1. 程式人生 > >Python學習:列表生成式和列表生成器

Python學習:列表生成式和列表生成器

一、列表生成式
列表生成式:顧名思義就是python中生成列表的表示式。運用列表生成式可以快速的生成列表,程式碼卻很簡潔。
示例一:
如要生成 [1, 2, 3, 4, 5, 6, 7, 8, 9] 列表:

lb = [x for x in  range(1,10)]

輸出結果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]

示例二:
如要生成[1,4,9,16……]列表:

lb = [x * x for x in  range(1,10)]

輸出結果:
[1, 4, 9, 16, 25, 36, 49, 64, 81]

示例三:
加入條件語句:

lb = [ x * x for
x in range(1,10) if x%2==0]

輸出結果:
[4, 16, 36, 64]

二、列表生成器
通過列表生成式,可以直接建立一個列表。但是受記憶體限制,列表容量有限制,而且建立一個100萬元素的的列表不僅佔用很大的記憶體空間。如果我們只需要前幾個元素,那後面的佔用的記憶體就浪費了。
建立一個生成器(Generator)的方法:
1、最簡單的辦法:把原來的生成式的[]換成()就建立了一個生成器。
lg=(x for x in range(1,20) if x%2==0)
print(type(lg))
lg是一個generator,不可以直接獲取值,需要使用next()函式獲取generator的下一個返回值。
print(lg.next

())
2、如果一個函式定義中包含yield關鍵字,那麼這個函式就不再是一個普通的函式而是一個generator。

def fib(n):
    sum = 0
    i = 0
    while (i < n):
        sum = sum + i
        i += 1
        yield (sum)

for i in fib(10):
    print(i)

執行結果和上面的是一樣的,不同的地方是包含yield語句的函式會被特地編譯成生成器,當函式被呼叫時,他會返回一個生成器物件,這個物件執行迭代器介面。每當遇到yield關鍵字時,可以理解為函式的return語句,yield後面的值就是返回值。但是不像一般的函式再return退出,生成器函式在生成值後會自動掛起並暫停他們的執行和狀態。他的本地變數將儲存狀態資訊,這些資訊在函式恢復時將再度有效,下次yield下面的部分開始執行。
解釋:
1、以上函式有關鍵字yield,所以是一個生成器函式。
2、通過for迴圈呼叫生成器,當執行到yield的時候,返回sum的值,sum為0,此時暫停並記錄sum值。
3、列印sum的值,然後繼續執行,此時跳入下一個迴圈while(1<10)
4、直到遇到yield的時候,返回sum的值。
5、反覆執行3,4步,直到迴圈結束,程式退出。

三、生成式和生成器的區別
生成式直接返回一個結果列表,生成器則返回的是一個物件,此物件包含了對錶達式的結果的計算引用,通過迴圈可以直接輸出。
生成器不會一次性返回所有資料,當用的時候再列出來,更加節約記憶體的使用率。
生成式:一次性生成所有的資料,儲存在記憶體中,適合小量資料。
生成器:返回一個可迭代的物件,必須通過next函式一一取出。

迭代器:
可迭代物件:可通過迴圈取出的就是可迭代物件。比如list() 、tuple[]、dict{}
迭代器:必須通過next()呼叫的,被next呼叫不斷返回下一個值的物件稱為迭代器。