迭代器和生成器

2021-08-25 11:55:29 字數 4095 閱讀 4012

可迭代物件

可以被for迴圈迭代的物件為可迭代物件(iterable)

可以使用isinstance()判斷乙個物件是否是iterable物件:

>>> 

from collections import iterable

>>> isinstance(, iterable)

true

>>> isinstance({}, iterable)

true

>>> isinstance('abc', iterable)

true

>>> isinstance((x for x in range(10)), iterable)

true

>>> isinstance(100, iterable)

false

迭代器

迭代器是乙個可以記住遍歷的位置的物件。

迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。

迭代器有兩個基本的方法:iter() 和 next()。

i = iter('asd')

next(i)

>>>'a'

next(i)

>>>'s'

next(i)

>>>'d'

next(i)

traceback (most recent call last):

file

"", line 1, in

stopiteration

當序列遍歷完時,將丟擲乙個stopiteration(停止迭代)異常。

迭代器優點

1、「流式」資料處理方式*少記憶體消耗,節省記憶體空間

2、很方便使用,且只能取所有的資料取一次

迭代器的內部

可迭代物件:

物件裡面包含iter()方法的實現,物件的iter函式經呼叫之後會返回乙個迭代器,裡面包含具體資料獲取的實現

迭代器:

包含有next方法的實現,在正確範圍內返回期待的資料以及超出範圍後能夠丟擲stopiteration的錯誤停止迭代。

迭代器不但可以作用於for迴圈,還可以被next()函式不斷呼叫並返回下乙個值,直到最後丟擲stopiteration錯誤表示無法繼續返回下乙個值了。

生成器都是iterator物件,但list、dict、str雖然是iterable,卻不是iterator

把list、dict、str等iterable變成iterator可以使用iter()函式:

乙個實現了iter方法的物件是可迭代的,乙個實現next方法的物件則是迭代器

生成器

生成器的本質就是迭代器

迭代器 我們知道是用來迭代可迭代物件的,而生成器是用來迭代方法的

我們知道的迭代器有兩種:一種是呼叫方法直接返回的,一種是可迭代物件通過執行iter方法得到的,迭代器有的好處是可以節省記憶體。

如果在某些情況下,我們也需要節省記憶體,就只能自己寫。我們自己寫的這個能實現迭代器功能的東西就叫生成器。

生成器generator:

本質:迭代器(所以自帶了iter方法和next方法,不需要我們去實現)

特點:惰性運算,開發者自定義

1.生成器函式:

常規函式定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回乙個結果,在每個結果中間,掛起函式的狀態,以便下次重它離開的地方繼續執行。

只要有yield的關鍵字的函式就是生成器函式

乙個包含yield關鍵字的函式就是乙個生成器函式。yield可以為我們從函式中返回值,但是yield又不同於return,return的執行意味著程式的結束,呼叫生成器函式不會得到返回的具體的值,而是得到乙個可迭代的物件。每一次獲取這個可迭代物件的值,就能推動函式的執行,獲取新的返回值。直到函式執行結束。

特點

呼叫函式的之後函式不執行,返回乙個生成器

每次呼叫next方法的時候會取到乙個值

直到取完最後乙個,在執行next會報錯

生成器是特殊的迭代器

迭代器需要手動記錄迭代位置

生成器使用yield自動記錄迭代的位置

def

fei(num):

a = 0

b = 1

current_index = 0

print('11111111111')

while current_index < num:

a, b = b, a + b

current_index += 1

yield a, b

# yield b

print('222222222222')

result = fei(5)

print(next(result))

print('第一次next完成')

print(next(result))

print('第二次next完成')

輸出結果

11111111111

(1, 1)

第一次next完成

222222222222

(1, 2)

第二次next完成

yield from

def

gen1

():for c in

'ab':

yield c

for i in range(3):

yield i

print(list(gen1()))

defgen2

():yield

from

'ab'

yield

from range(3)

print(list(gen2()))

輸出結果:

['a', 'b', 0, 1, 2]

['a', 'b', 0, 1, 2]

yield的用法

yield 是乙個類似 return的關鍵字,迭代一次遇到yield時就返回yield後面的值。重點是:下一次迭代時,從上一次迭代遇到的yield後面的**開始執行。

簡要理解:yield就是 return 返回乙個值,並且記住這個返回的位置,下次迭代就從這個位置後開始。

# 斐波那契

deffunc

(n):

a,b = 0,1

while n > 0:

yield b

a,b = b,a+b

n -= 1

defsum

(n):

return list(func(n))

print(sum(5))

輸出的結果:

[1, 1, 2, 3, 5]
def

yield_test

(n):

for i in range(n):

yield call(i)

print("i=",i)

#做一些其它的事情

print("do something.")

print("end.")

defcall

(i):

return i*2

#使用for迴圈

for i in yield_test(5):

print(i,",")

輸出的結果:

0 ,

i= 0

2 ,i= 1

4 ,i= 2

6 ,i= 3

8 ,i= 4

do something.

end.

生成器和迭代器

可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...

迭代器和生成器

1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...

生成器和迭代器

1.iterator 迭代器 舉例 我們對list使用for for i in 1,2,3,4 print i 12 34對string物件使用for for ch in python print ch py thon對字典物件使用for for k in print k yx對檔案使用for fo...