生成器應用 ,越懶越優秀

2021-08-31 07:33:48 字數 1473 閱讀 2688

生成器基礎: 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...