所謂迭代,就是乙個迴圈,厲遍資料結構(列表,字典,元組等)內元素的過程。字串,列表,字典,元組,集合都是可迭代物件。
而迭代器是用與迭代操作(for迴圈)的物件。可迭代物件通過__iter__方法轉變成迭代器,迭代器可以通過next()方法不斷返回下乙個元素直至結束。迭代器的優勢在於它不像列表那樣會預先就把列表內的所有元素載入到記憶體裡,而是只在需要的時候(呼叫next的時候)才進行計算。
用斐波那契數枚舉例:
class
fib:
def__init__
(self)
: self.prev =
0 self.curr =
1def
__iter__
(self)
:#轉化成迭代器
return self
def__next__
(self)
: self.prev,self.curr = self.curr,self.prev + self.curr
return self.curr
fib = fib(
)for i in
range(10
):print
(next
(fib)
)
可以看到最後還是要用for迴圈不斷呼叫 next()方法來返回下乙個值
生成器是一種更高階的迭代器,它用yield來返回值,它讓**以更簡潔的形式呈現。每次執行到 yield 的時候,函式會暫停,並且儲存當前的執行狀態,返回當前的數值,並在下一次執行 next 方法的時候,又從當前位置繼續往下走。
def
test()
:for i in
range(3
):print
("before yield"
,i)yield i
print
("after yield"
,i)print
("end"
)f= test(
)next
(f)
這裡第一次呼叫next方法時,輸出為「before yield 0」
第二次再呼叫next方法時,輸出為after yield 0 以及 before yield 1
可見每次執行到yield時都會暫停
再舉個例子,比如我們要寫乙個返回平方數的函式,如果用普通方法寫,又要建立空的列表,還要把每次的計算結果放進去
def
square
(n):
sq=for i in
range
(n):2)
return sq
for i in square(5)
:print
(i)
如果用生成器寫:
def
square
(n):
for i in
range
(n):
yield i**
2for i in square(5)
:print
(i)
兩者的區別在於,普通方法是先全部計算好再吧結果呈現出來,而生成器是先計算一次呈現一次,用網上某位網友的話說,就是一桌菜全部炒完再上和炒乙個上乙個的區別
同樣再來看剛才的斐波那契數列的例子,用生成器寫:
def
fib():
prev, curr =0,
1while
true
:yield curr
curr, prev = prev + curr, curr
f = fib(
)for i in
range(10
):print
(next
(f))
python之生成器和迭代器
迭代 遍歷挨個取元素 a 1,2,3,4,5,6 for i in a print i 1,2,3,4,5,6 可迭代物件 實現了迭代器的物件 在產生這個物件的類中定義了 iter 方法 迭代器 迭代器在類中實現了兩個物件 iter 方法 返回迭代器物件本身 next 方法 返回下乙個元素 這裡需要...
python之迭代器和生成器
要將生成器,先講一下列表生成式。列表生成式 如果我們要建立乙個有規律的列表,比如說1 10 list1 1,2,3,4,5,6,7,8,9,10 list1 i for i in range 1,11 列表生成式 print list1 print list1 2 1,2,3,4,5,6,7,8,9...
python之生成器和迭代器
生成器表示式 返回乙個物件,這個物件只有在需要的時候才產生結果 生成器函式 為什麼叫生成器函式?因為它隨著時間的推移生成了乙個數值佇列。一般的函式在執行完畢之後會返回乙個值然後退出,但是生成器函式會自動掛起,然後重新拾起急需執行,他會利用yield關鍵字關起函式,給呼叫者返回乙個值,同時保留了當前的...