python中生成器與迭代器

2022-09-15 18:42:08 字數 2392 閱讀 6617

可迭代物件:乙個實現了iter方法的物件是可迭代的

迭代器:乙個實現了iter方法和next方法的物件就是迭代器(iter方法會返回乙個迭代器)

生成器都是iterator物件,但listdictstr雖然是iterable(可迭代物件),卻不是iterator(迭代器)

from collections import iterator  #

迭代器from collections import iterable #

可迭代物件

print(isinstance(s,iterator)) #

判斷是不是迭代器

print(isinstance(s,iterable)) #

判斷是不是可迭代物件

#iter可以

把可迭代物件轉換為迭代器

print(isinstance(iter(s),iterator))

為什麼listdictstr等資料型別不是iterator

這是因為python的iterator物件表示的是乙個資料流,iterator物件可以被next()函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函式實現按需計算下乙個資料,所以iterator的計算是惰性的,只有在需要返回下乙個資料時它才會計算。

iterator甚至可以表示乙個無限大的資料流,例如全體自然數。而使用list是永遠不可能儲存全體自然數的。

生成器:生成器是迭代器的一種

建立生成器的方法有兩種:

1.把乙個列表生成式的中括號改為()小括號

a = [i+1 for i in range(5)]  #

列表生成式

print

(a)b = (i+1 for i in range(5)) #

生成器print

(b)

print

(next(b))

print

(next(b))

print

(next(b))

print

(next(b))

print

(next(b))

print

(next(b))

輸出結果:

[1, 2, 3, 4, 5]

at 0x00000163c820baf0>12

345traceback (most recent call last):

file

"e:/myproj/pytest_demo/b.py

", line 13, in

print

(next(b))

stopiteration

生成器最常用的還是通過for迴圈呼叫:

for i in b:

print(i)

2.定義乙個包含yield語句的函式,通過呼叫該函式得到生成器(生成器函式)

def

fib(max):

n,a,b =0,0,1

while n

yield

b a,b =b,a+b

n = n+1

return

'done

'a =fib(6) # 呼叫包含yield語句的函式並不會立即執行,它只是返回乙個生成器,只有當程式通過next()函式呼叫或者遍歷生成器時,函式才會真正執行

print

(a)for i in fib(6): # 之所以能用for迴圈,是因為fib(6)是個迭代器

print

(i)

輸出結果:11

2358

關於yield:

與return類似,程式執行到yield會返回,等再次呼叫時,程式從上次yield處繼續往下執行

如果對以上執行原理還是不清楚,可以通過debug示例**進一步理解...

python中生成器,迭代器和裝飾器

解析器在實時生成資料,資料不會駐留在記憶體中。因此,其執行效率很高!yield 是乙個類似 return 的關鍵字,只是這個函式返回的是個生成器 當你呼叫這個函式的時候,函式內部的 並不立即執行 這個函式只是返回乙個生成器物件 當你使用for進行迭代的時候,函式中的 才會執行 list1 i 2 f...

個人理解的python中生成器與迭代器

可迭代物件 在python中,列表,元組,字典,字串這些可以用for迴圈遍歷的物件稱為可迭代物件。迭代器 我們建立乙個容器,該容器中可以生成一些資料,這些資料可以遍歷,該容器被我們稱為迭代器。生成器 生成器為迭代器的一種,使用yield返回函式,每次呼叫yield函式程式都會暫停,使用next 或s...

python中生成器

生成器 生成器generator 生成器函式generator m i for i in range 5 定義乙個生成器 print type m 判斷m的型別,是乙個生成器 print next m 使用next函式 def inc 定義乙個inc函式 for i in range 5 yield...