python之生成器和迭代器

2021-08-31 16:03:54 字數 3873 閱讀 2230

迭代:遍歷挨個取元素

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 方法不斷返回下乙個元素直至結束。迭代器的優勢在於它不像列表那樣會預先就把...