生成器基礎: python 生成器基礎
下面的生成器例子都在類中實現.
乙個可迭代的物件, 一般來說有 __iter__ 或者 __getitem__ ,後者的優先順序低.
要先搞清楚 可迭代物件 (__iter__) 與迭代器 (__next__ ) 的區別, 實現了 __iter__ 是乙個可迭代物件, 實現了 __next__ 是乙個迭代器
具體在下面例子中有注釋
import re
reg_word = re.compile('(\w+)')
class findword1:
def __init__(self,text):
self.text = text
#word 是乙個正則返回的list
self.word = reg_word.findall(text);
#看看有多少匹配專案
def __len__(self):
return len(self.word)
#如果不實現 __iter__ 則使用這個函式
def __getitem__(self, item):
return self.word[item]
def __repr__(self):
return "findword1 (%s) " % repr(self.text)
# 這是乙個可迭代物件. 同時是乙個生成器.
# 當然可以 另定義乙個類 : class xx_iterator , 讓 __iter__ 返回即可.這裡直接使用生成器來代替
def __iter__(self):
for item in self.word:
yield item
下面這個例子 稍作修改, 更懶惰
import re
reg_word = re.compile('(\w+)')
#對上面例子中的類修改
class findword2:
#不再構造裡呼叫 正則的匹配函式了.
def __init__(self,text):
self.text = text
def __repr__(self):
return "sentence(%s)" % repr(self.text)
#finditer 返回乙個生成器, 每次迭代出乙個 matchobject , 這樣就更懶惰了
def __iter__(self):
for match in reg_word.finditer(self.text):
yield match.group()
#下面是乙個可以用於替換版本的 __iter__ ,只是乙個生成器表示式而已
def __iter(self):
return (match.group() for match in reg_word.finditer(self.text))
生成器函式應用
在for迴圈中碰到yield會暫停本次迴圈,直到執行下一次 next 才繼續往下執行 def test for i in range 5 print 第 s次執行 i yield i print 開始新的迴圈 g test g.next 第0次執行 g.next 開始新的迴圈 第1次執行 g.nex...
python生成器應用之字典生成
python 生成器,這裡是指包含 yield關鍵字的函式,區別於類似表示式的那種情況,例如 generator x 5 6 for x in range 20 本文主要 生成器函式 如下 在字典生成的應用。def counts n i 0while i n yield i i 1生成字典的函式,需...
python中生成器的應用
生成器的應用 實現多工 import time def task 1 while true print 1 time.sleep 0.1 yield def task 2 while true print 2 time.sleep 0.1 yield task 1 task 2 def main t...