迭代:遍歷挨個取元素
a = [1,2,3,4,5,6]
for i in a:
print(i) #1,2,3,4,5,6
可迭代物件:實現了迭代器的物件
在產生這個物件的類中定義了__iter__()方法
迭代器:迭代器在類中實現了兩個物件
__iter__()方法 返回迭代器物件本身
__next__()方法 返回下乙個元素
這裡需要注意:可迭代物件不一定是迭代器,而迭代器一定是可迭代物件
判斷是否為可迭代物件:
from collections import iterable
a = [1,2,3,4,5,6]
print(isinstance(a,iterable)) #判斷是否是可迭代物件
將可迭代物件轉換為迭代器:
from collections import iterable,iterator
a = [1,2,3,4,5,6]
print(isinstance(a,iterable)) #true
str_a = iter(a)
print(isinstance(str_a,iterator)) #true
類實現乙個可迭代物件:
class die_daiqi(object):
def __init__(self,diedai):
self.diedai = diedai
def __iter__(self):
return iter(self.diedai.split(' '))
ret = die_daiqi('my name is eric')
for i in ret:
print(i) #注意:這裡不能用next獲取元素,因為迭代器沒有next方法,請看下面的
類實現乙個乙個迭代器:
class jiuan(object):
def __init__(self,a,b,c=1):
self.a = a
self.b = b
self.c = c
def __iter__(self):
return self
def __next__(self): #注意和上面區別
if self.a <= self.b:
num = self.a
self.a+= self.c
return num
else:
raise stopiteration('沒有元素了') #stopiteration異常
a = jiuan(1,10)
for i in a:
print(i)
counter:無限序列
from itertools import count,islice,cycle
counter = count(3,2)
for i in counter:
print(i) #無限序列
cycle:將乙個有限序列變成無限序列
from itertools import count,islice,cycle
counter = count(3,2)
re = islice(counter,0,20)
print(list(re))
islice:從無限的迭代器中產生乙個有限的序列
re = [1,2,3,4,5]
result = cycle(re)
for i in range(1,9):
print(next(result))
迭代器實現斐波拉契數列:
class fblq(object):
def __init__(self):
self.a = 0
self.b = 1
def __iter__(self):
return self
def __next__(self):
num = self.a
self.a,self.b = self.b,self.a+self.b
return num
ret = fblq()
re = islice(ret,1,10)
print(list(re))
兩種實現方式:
1.定義乙個函式用yield關鍵字,用了這個關鍵字這個函式就是生成器物件
2.生成器表示式(i for i in rang(10))
判斷是否是生成器物件;
from collections import generator
a = (i for i in range(10))
print(isinstance(a,generator)) #true
生成器函式:
def scq():
st = 1
while true:
yield st
st+=2
print('haha')
rt = scq()
print(next(rt)) #注意這裡列印的是1
print(next(rt)) #注意這裡列印的是haha,3
print(next(rt)) #注意這裡列印的是haha,5
當執行到yield st這裡的時候**會暫停同時把1給返回回去
再次執行的時候還是從這裡開始執行,st+=2結果是3下面列印haha
這時候st+2等於3,執行到yield st把3彈出去,結果就是haha,3
下面也是同樣,st+=2結果是5,執行到print('haha')把haha列印出來
執行到yield st把5彈出來,以此類推。
生成器版本斐波拉契:
def cv():
a = 0
b = 1
while true:
yield b
a,b = b,a+b
ret = cv()
ct = islice(ret,0,10) #0到10個項
print(list(ct))
send()和close():
send():給yield關鍵字傳入引數
def scq():
b = 1
st = 1
while true:
a = yield b
if isinstance(a,int):
st = a
b+=st
print('haha')
rt = scq()
print(next(rt)) #1
print(next(rt)) #haha 3
print(rt.send(2)) #haha,4
close():結束生成器,再用next則報錯
def scq():
b = 1
st = 1
while true:
a = yield b
if isinstance(a,int):
st = a
b+=st
print('haha')
rt = scq()
print(next(rt)) #1
print(next(rt)) #haha 3
print(rt.send(2))
rt.close()
print(next(rt)) #stopiteration
1.共同點:
都可以使用next獲取元素
2.不同點:
生成器有send和close方法
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關鍵字關起函式,給呼叫者返回乙個值,同時保留了當前的...
PYTHON之迭代器和生成器
所謂迭代,就是乙個迴圈,厲遍資料結構 列表,字典,元組等 內元素的過程。字串,列表,字典,元組,集合都是可迭代物件。而迭代器是用與迭代操作 for迴圈 的物件。可迭代物件通過 iter 方法轉變成迭代器,迭代器可以通過next 方法不斷返回下乙個元素直至結束。迭代器的優勢在於它不像列表那樣會預先就把...