生成器和迭代器

2021-10-01 13:08:18 字數 1959 閱讀 5073

1.如果乙個函式中包含yield關鍵字,那麼這個函式就不再是乙個 普通函式,而是乙個生成器

2.生成器是乙個返回迭代器的函式,只能用於迭代操作,更加簡單點理解生成器就是乙個迭代器。

3.在呼叫生成器執行的過程中,每次遇到 yield 時函式會暫停並儲存當前所有的執行資訊,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續執行。 呼叫乙個生成器函式,返回的是乙個迭代器物件

生成器的工作原理:

1)生成器(generator)能夠迭代的關鍵是它有乙個next()方法, 工作原理就是通過重複呼叫next()方法,直到捕獲乙個異常。

2)可用next()呼叫生成器物件來取值。next 兩種方式 t. next () 或者

next(t)。

3)yield相當於 return 返回乙個值,並且記住這個返回的位置,下次迭代時, **從yield的下一條語句開始執行。

4).send() 和next()一樣,都能讓生成器繼續往下走一步(下次遇到yield 停),但send()能傳乙個值,這個值作為yield表示式整體的結果——換句話 說,就是send可以強行修改上乙個yield表示式值。比如函式中有乙個yield賦 值,a = yield 5,第一次迭代到這裡會返回5,a還沒有賦值。第二次迭代時, 使用.send(10),那麼,就是強行修改yield 5表示式的值為10,本來是5的, 那麼a=10

#用yield簡單生成斐波那契數列

deffd

(n):

a,b,i=0,

1,0while iyield b

a,b=b,a+b

i+=1f=fd(10)

for i in f:

print

(i)112

35813

2134

55

生成器產生的值只能通過for 迴圈 或者next(物件) 來獲取裡面的值

generator=

(i*i for i in

range(10

))#簡單生成器

print

(generator)

#at 0x000002491178d938> 直接輸出是它的記憶體位址

for i in generator:

print

(i)014

9162536

4964

81

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

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

- iter(iterable)

從可迭代物件中返回乙個迭代器,iterable必須是能提供乙個迭代器的物件

- next(iterator)

- 注意

1.迭代器只能往前取值,不會後退

2.用iter函式可以返回乙個可迭代物件的迭代器

a=[1

,2,3

,4,5

]b=iter

(a)#迭代a

print

(type

(b))

#檢視b的型別

<

class

'list_iterator'

>

print

(next

(b))

# next()每次獲取乙個值

1print

(next

(b))

2print

(next

(b))

3print

(next

(b))

4print

(next

(b))

5for i in b:

#也可以for迴圈遍歷

print

(i)123

45

生成器和迭代器

可以直接作用於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...