def
test()
:yield
1print
('aaaa'
)yield
2print
('bbb'
)r1 = test(
)r1.__next__(
)r1.__next__(
)
我們知道我們可以用列表儲存資料,可是當我們的資料特別大的時候建立乙個列表的儲存資料就會很佔記憶體的。這時生成器就派上用場了。它可以說是乙個不怎麼佔計算機資源的一種方法。
import time
t1 = time.time(
)g =
(i for i in
range
(100000000))
t2 = time.time(
)lst =
[i for i in
range
(100000000)]
t3 = time.time(
)print
(,t2 - t1)
print
(,t3 - t2)
我們可以用列表推導(生成式)來初始化乙個列表:
list5 =
[x for x in
range(5
)]print
(list5)
#output:[0, 1, 2, 3, 4]
我們用類似的方式來生成乙個生成器,只不過我們這次將上面的[ ]換成( ):
gen =
(x for x in
range(5
))print
(gen)
#output: at 0x0000000000aa20f8>
看到上面print(gen) 並不是直接輸出結果,而是告訴我們這是乙個生成器。那麼我們要怎麼呼叫這個gen呢。
有兩種方式:
第一種:
for item in gen:
print
(item)
#output:01
2341
2345
678
第二種:
print
(next
(gen)
)#output:0
print
(next
(gen)
)#output:1
print
(next
(gen)
)#output:2
print
(next
(gen)
)#output:3
print
(next
(gen)
)#output:4
print
(next
(gen)
)#output:traceback (most recent call last):stopiteration
原理
從第乙個用for的呼叫方式的我們可以知道生成器是可迭代的。更準確的說法是他就是個迭代器。
驗證
from collections import iterable, iterator
print
(isinstance
(gen, iterable)
)#output:true
print
(isinstance
(gen, iterator)
)#output:true
str,list,tuple,dict,set這些都是可迭代的,就是可用for來訪問裡面的每乙個元素。但他們並不是迭代器。
什麼是迭代器
有兩個方法:iter
next
生成器和迭代器
可以直接作用於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...