classa:
def__init__
(self)
: self.count=
10def
__iter__
(self)
:print
('執行 __iter__'
)return self
def__next__
(self)
:print
('執行 __next__'
)if self.count>0:
self.count-=
1return self.count
else
:print
('停止迭代'
)raise stopiteration
for i in a():
print
('i='
,i)#################################列印的結果
'''執行 __iter__ #先執行__iter__,返回乙個可迭代物件
執行 __next__
i= 9..
.執行 __next__
i= 1
執行 __next__
i= 0
執行 __next__
停止迭代
'''
class
fibonacciterator
(object):
def__init__
(self,n)
: self.n=n
self.current=
0 self.num1=
1 self.num2=
1def
__iter__
(self)
:return self
def__next__
(self)
:if self.current < self.n:
x=self.num1
self.num1,self.num2=self.num2,self.num1+self.num2
self.current +=
1return x
else
:raise stopiteration
def
foo():
print
(111
)yield
222#yield會讓出直譯器的控制權,掛起
print
(333
)yield
444print
(555
)n=foo(
)#含有yield就是乙個特殊的函式,僅僅是在封裝乙個生成器物件
#並不會執行任何結果
next
(n)#只有next呼叫才會有結果
x =next
(n)# 列印 111,返回 222
y =next
(n)# 列印 333,返回 444
z =next
(n)# 列印 555,丟擲 異常
練習:使用生成器實現斐波那契數列
def
gen_fib
(n):
num1=num2=
1 current=
0while current < n:
yield num1
num1,num2=num2,num1+num2
current+=
1f=gen_fib(12)
for i in f:
print
(i)
class
range
:def
__init__
(self, start, end=
none
, step=1)
:if end is
none
: self.start =
0 self.end = start
else
: self.start = start
self.end = end
self.step = step
def__iter__
(self)
:return self
def__next__
(self)
:if self.start < self.end:
current = self.start
self.start += self.step
return current
else
:raise stopiteration
for i in range(5)
:print
(i)for i in range(5,
10):print
(i)for i in range(10,
20,3)
:print
(i)
in [4]
: x=
range
(10000
)in [5]
: y=
[i for i in
range
(10000)]
#列表推導式
in [6]
:import sys
in [7]
: sys.getsizeof(x)
out[7]
:48in [8]
: sys.getsizeof(y)
out[8]
:87624
迭代器 可迭代物件 生成器
先上本文主題 迭代器一定是可迭代物件,可迭代物件不一定是迭代器 可迭代物件要滿足什麼條件才能使用 for 正確遍歷 生成器一定是迭代器.是否為迭代器 isinstance t,iterator 是否為可迭代物件 isinstance t,iterable 實現了 iter 魔法方法,就是可迭代物件....
迭代器和迭代物件 生成器
iterator 迭代器物件,必須要實現 next 魔法函式 iterable 可迭代物件,繼承 iterator,必須要實現 iter 魔法函式 迭代器 iterator 與可迭代物件 iterable 的區別 生成器生成器 函式中只要有 yield,這個函式就會變成生成器。每次執行到 yield...
可迭代物件 迭代器,生成器
可迭代物件 iterator 列表 集合 元組 字典 字串 生成器 我們可以使用isintance 判斷乙個物件是否是iterator物件 生成器 通過列表生成式,我們可以直接建立乙個列表,但是,受到記憶體限制,列表容量肯定是有限的,如果我們僅僅需要訪問前面幾個元素,如果列表元素可以按照某種演算法推...