一、生成器
求平方
//傳統方法 浪費時間
square_table =
for i in range
(10000):
for i in range
(10):
print (square_table[i])
生成器(到使用的時候才做真正的計算,節省時間和空間)
square_generator = (x*x for x in
range(50000))//range(50000)為生成器
for i in
range(10):
print(next(square_generator))
示例:斐波那契數列
def
fib(limit):
n,a,b = 0,0,1
while n#print(b)
yield b
a,b = b,a+b
n += 1
return
'done'
import traceback
f = fib(5)
try:
print(next(f))
except stopiteration:
traceback.print_exc()
for i in fib(5):
print(i)
二、yeild關鍵字
乙個帶有 yield 的函式就是乙個 generator,它和普通函式不同,生成乙個 generator 看起來像函式呼叫,但不會執行任何函式**,直到對其呼叫 next()(在 for 迴圈中會自動呼叫 next())才開始執行。雖然執行流程仍按函式的流程執行,但每執行到乙個 yield 語句就會中斷,並返回乙個迭代值,下次執行時從 yield 的下乙個語句繼續執行。看起來就好像乙個函式在正常執行的過程中被 yield 中斷了數次,每次中斷都會通過 yield 返回當前的迭代值。
yield 的好處是顯而易見的,把乙個函式改寫為乙個 generator 就獲得了迭代能力,比起用類的例項儲存狀態來計算下乙個 next() 的值,不僅**簡潔,而且執行流程異常清晰。
詳情請見:
如何判斷乙個函式是否是乙個特殊的 generator 函式?可以利用 isgeneratorfunction 判斷:
from inspect import isgeneratorfunction
isgeneratorfunction(fab)
//true
三、迭代器(惰性計算,生成器是迭代器的一種)
迭代器持有乙個內部狀態的字段,用於記錄下次迭代返回值,它實現了next和iter方法,迭代器不會一次性把所有元素載入到記憶體,而是需要的時候才生成返回結果。
那麼什麼迭代器呢?它是乙個帶狀態的物件,他能在你呼叫next()方法的時候返回容器中的下乙個值,任何實現了iter和next()(python2中實現next())方法的物件都是迭代器,iter返回迭代器自身,next返回容器中的下乙個值,如果容器中沒有更多元素了,則丟擲stopiteration異常,至於它們到底是如何實現的這並不重要。
from collections import iterable
from collections import iterator
//判斷列表和字典是否是可迭代的,結果返回true
print(isinstance([1,2,3],iterable))//true
print(isinstance({},iterabel))//true
print(isinstance(123,iterabel))//false
print(isinstance(『abc',iterabel))//true
print(isinstance([1,2,3],iterator))//陣列是可迭代的,但不是可迭代器
g = (x*x for x in range(10))
print(type(g))
print(isinstance(g,iterable))//true,是可迭代的,便可以用for迴圈來列印
for i in g:
print(i)
//判斷斐波那契函式是否是迭代器
deffib
(limit):
n,a,b = 0,0,1
while n#print(b)
yield b
a,b = b,a+b
n += 1
return
'done'
f = fib(6)
print(type(f))
print(isinstance(f,iterable))//true
print(isinstance(f,iterator))//true
for i in f:
print(i)
003 生成器 迭代器
現在有個需求,列表 1,2,3,4,5,6,7,8,9 將列表裡的每個值加1。a 1,2,3,4,5,6,7,8,9 b for item in a a b print a a 1,2,3,4,5,6,7,8,9 for index,ele in enumerate a,0 a index 1 pr...
python 3 生成器 and 迭代器
迭代器官方文件 大多是的檔案物件可以用for迴圈語句,例如 for element in 1,2,3 print element for element in 1,2,3 print element for key in print key for char in 123 print char fo...
Python入門(七)生成器 迭代器
列表成器示例 an highlighted block 1.列表生成式 a x 2 for x in range 10 生成一到九分別乘以2的這個列表 0,2,4,6,8,10,12,14,16,18 def f n return n 3 a f x for x in range 10 018 27...