迭代器1:
import time
class
classmates
(object):
def__init__
(self)
: self.names =
list()
defadd
(self, name)
:def
__iter__
(self)
:"""如果想要乙個物件成為乙個可以迭代的物件,即可以使用for,那麼必須實現__iter__方法"""
return classiterator(self)
class
classiterator
(object):
def__init__
(self, obj)
: self.obj = obj
self.current_num =
0def
__iter__
(self)
:pass
def__next__
(self)
:if self.current_num <
len(self.obj.names)
: ret = self.obj.names[self.current_num]
self.current_num +=
1return ret
else
:raise stopiteration
classmate = classmates(
)classmate.add(
"張三"
)classmate.add(
"李四"
)classmate.add(
"王五"
)"""迴圈遍歷乙個物件:
for name in classmate:
pass
這兩行**可以解讀為:
1.判斷classmate是否可以迭代
2.在第1步成立的前提下,自動呼叫iter函式,得到classmate物件的__iter__方法的返回值
3.__iter__方法的返回值是乙個迭代器
4.__iter__方法返回的是哪乙個物件的引用,就執行哪乙個物件對應的類中的__next__方法
"""for name in classmate:
print
(name)
time.sleep(
1)
迭代器2:
import time
class
classmate
(object):
def__init__
(self)
: self.names =
list()
self.current_num =
0def
add(self, name)
:def
__iter__
(self)
:return self
def__next__
(self)
:if self.current_num <
len(self.names)
: ret = self.names[self.current_num]
self.current_num +=
1return ret
else
:raise stopiteration
classmate = classmate(
)classmate.add(
"張三"
)classmate.add(
"老王"
)classmate.add(
"李四"
)"""
for name in classmate:
print(name)
解讀:1.先判斷classmate物件是否是可迭代物件(就看這個物件對應的類裡面有沒有__iter__方法)
2.如果是可迭代物件,自動呼叫iter函式進入到__iter__方法中,檢視__iter__方法的返回值
3.__iter__方法返回什麼(哪個物件),就執行它(哪個物件對應的類)下面的__next__方法**(這裡返回自身,就執行自己內部的__next__方法)
4.把__next__方法的返回值賦給name,此時name 就表示__next__方法的返回值
"""for name in classmate:
print
(name)
time.sleep(
1)
迭代器的作用(重點):
"""使用for...in 來遍歷fibonacci數列的前10個值
法一:使用列表先把斐波那契數列的前10個數存起來,再遍歷
**如下:
nums = list()
a = 0
b = 1
i = 0
while i < 10:
a, b = b, a + b
i += 1
for num in nums:
print(num)
法二:用迭代器實現,**如下
比較:使用列表的方式要先往列表中存入數,數值太多時會占用大量的儲存空間;
而使用迭代器的好處是 節省儲存空間,因為迭代器裡面儲存的是不是資料本身,而是生成資料的方法,
只占用生成資料方法的幾行**空間,所以占用記憶體少
"""class
fibonacci
(object):
def__init__
(self, all_num)
: self.all_num = all_num
self.current_num =
0 self.a =
0 self.b =
1def
__iter__
(self)
:return self
def__next__
(self)
:if self.current_num < self.all_num:
ret = self.a
self.a, self.b = self.b, self.a + self.b
self.current_num +=
1return ret
else
:raise stopiteration
if __name__ ==
"__main__"
: fibo = fibonacci(10)
for num in fibo:
print
(num)
迭代器的作用
迭代器就是把不同的資料結構 相同功能 的函式裝到乙個名字相同的函式裡,這樣的話你在寫演算法的時候就可以不管你要操作的資料結構的邏輯結構了。比如不管是鍊錶,陣列還是別的什麼,統一都用迭代器進行訪問的話可能都是 next 表示下乙個元素 pre 表示上乙個元素等等 其實意思就是,不管你用的是鍊錶,2叉樹...
STL中迭代器的作用,有指標為何還要迭代器
1 迭代器 iterator 迭代器 模式又稱cursor 游標 模式,用於提供一種方法順序訪問乙個聚合物件中各個元素,而又不需暴露該物件的內部表示。或者這樣說可能更容易理解 iterator模式是運用於聚合物件的一種模式,通過運用該模式,使得我們可以在不知道物件內部表示的情況下,按照一定順序 由i...
python迭代器的作用 python的迭代器
迭代是指能夠從序列中訪問出素的一種方式,在我們遍歷使用for.in.的物件都是可迭代物件。這裡需要補充一點的是python中一切都是物件。判斷乙個物件是否是可迭代物件可以通過instance函式 像我們常用的列表,字典,字串,集合,元組都是可迭代物件。那麼我們是否可以自定義乙個可迭代物件呢,答案是肯...