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...