生成式和生成器
阿新 • • 發佈:2017-11-04
表達式 引用 clas 偶數 生成 接口 border com tmp 列表生成式 ( List Comprehensions )
是Python內置的非常簡單卻強大的可以用來創建list的生成式。
通過一句簡潔的語法就可以對一組元素進行過濾,還可以對得到的元素進行轉換處理
生成[1x1, 2x2, 3x3, ..., 10x10]
for循環+if判斷
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]
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;">
生成式和生成器