1. 程式人生 > >生成式和生成器

生成式和生成器

表達式 引用 clas 偶數 生成 接口 border com tmp

列表生成式 ( List Comprehensions ) 是Python內置的非常簡單卻強大的可以用來創建list的生成式。 通過一句簡潔的語法就可以對一組元素進行過濾,還可以對得到的元素進行轉換處理 生成[1x1, 2x2, 3x3, ..., 10x10]
L = []
 for x in range(1, 11):
    L.append(x * x)
print (L)
結果
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

利用列表生成式
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
for循環+if判斷
a = [x*x for x in xrange(10) if x*x%2 == 0]    ##if判斷x*x是偶數,就保留
print(type(a))
print(a)
結果:
<type list>
[0, 4, 16, 36, 64]

生成器(Generator) 列表生成式是創建出一個列表。 由於內存限制,一個列表的長度是有限的。 使用生成器,可以不用創建完整的列表,而是在循環的過程中(列表生成式是循環)算出我們所需要位置的值 yield()函數 一個帶有 yield 的函數就是一個 generator,它和普通函數不同,生成一個 generator 看起來像函數調用,但不會執行任何函數代碼,直到對其調用 next()(在 for 循環中會自動調用 next())才開始執行。雖然執行流程仍按函數的流程執行,但每執行到一個 yield 語句就會中斷,並返回一個叠代值,下次執行時從 yield 的下一個語句繼續執行。看起來就好像一個函數在正常執行的過程中被 yield 中斷了數次,每次中斷都會通過 yield 返回當前的叠代值 生成器:將列表生成式的[] 換為 ()即可
a = (x*x for x in xrange(10) if x*x%2 == 0)
print(type(a))
print(a.next())
print(a.next())
print(aaaaaaa)
for i in a:
print(i)
結果:
<type generator>
0
4
aaaaaaa
16
36
64
##generator保存的是算法,每次調用next(),就計算出下一個元素的值,直到計算到最後一個元素為止
def fib(n):
    sum = 0
    i = 0
    while(i<n):
        sum 
= sum +i i+=1 yield sum for x in fib(10): print(x) print(type(fib(10)))
結果
0
1
3
6
10
15
21
28
36
45
<type generator>
包含yield語句的函數會被特地編譯成生成器。當函數被調用時,他們返回一個生成器對象,這個對象支持叠代器接口。每當遇到yield關鍵字的時候,你可以理解成函數的return語句,yield後面的值,就是返回的值 生成式和生成器區別: 一個直接返回了表達式的結果列表, 而另一個是一個對象,該對象包含了對表達式結果的計算引用, 通過循環可以直接輸出 生成器不會一次性列出所有的數據,當你用到的時候,在列出來,更加節約內存的使用率。

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

生成式和生成器