[note]how a generator works
2015-12-26 23:20
405 查看
how a generator works
A Sentence class was discussed in the previous blog.however, the versions of Sentence haven been created are not pythonic.
Let's see another version.
import re, reprlib RE_WORD = re.compile("\w+") class Sentence(object): def __init__(self, txt): self.words = RE_WORD.findall(txt) def __repr__(self): return "Sentence({})".format(reprlib.repr(self.words)) def __iter__(self): for ele in self.words: yield ele return # do not needthe return above is not needed. the function just fall thought and return automatically.
Either way, a generator function doesn't raise StopIteration Exception: it just exits when it's done producing values.
the __iter__ function above is a generator function, which return a generator and that is also an iterator.
what is a generator function?
any python function that has theyield keyword in its body is a generator function:
a function which, when called, returns a generator object. In other words,
a generator function is a generator factory.
for example:
def gen_123(): yield 1 yield 2 yield 3
>>> gen_123 # gen_123 is still a function object
<function gen_123 at 0x...>
>>> gen_123() # that is a generator now.
<generator object gen_123 at 0x...>
>>> for i in gen_123():
ptint(i)
1
2
3
>>> g = gen_123()
>>> next(g)
1
>>> next(g)
2
>>> next(g)
3
>>> next(g) # when generator is exhausted and applied next function, a StopIteration will be raised.
Traceback (most recent call last):
...
StopIteration
finally, when the function body returns, the enclosing generator object raises StopIteration, in accordance with the Iterator Protocol.
And the yield keyword in generator function suspends the process.
The following case will demonstrate it well.
>>> def gen_AB():
print("start...")
yield 'A'
print("continue")
yield 'B'
print("end")
>>> for c in gen_AB():
print('--->', c)
start...
---> A
continue
---> B
end
>>>
Obviously, the for loop machinery code catches the StopIteration Exception, and the loop terminates clearly.
So, the pythonic Sentence class is created:
class Sentence(object): def __init__(self, txt): self.txt = txt def __repr__(self): return "Sentence({})".format(reprlib.repr(self.text)) def __iter__(self): for match in RE_WORD.finditer(self.txt): yield match.group()the finditer method also return an Iterator, that saves more memory.
相关文章推荐
- GC算法
- 第二百六十八天 how can I坚持
- ssh下:系统初始化实现ServletContextListener接口时,获取spring中数据层对象无效的问题
- Eclipse 使用自己的签名包进行签名
- phpmyadmin 各种技巧拿 webshell
- 懒加载数据,在取出数据时容易出的bug....
- Java局部变量final
- 机器视觉开源代码集合
- 文章标题
- wget
- 一个用Python编写的股票数据(沪深)爬虫和选股策略测试框架
- android studio 生成aar并使用
- Oracle-SQL Plus学习总结
- Flask 基础
- java thread源码分析
- 自我总结(五)---(学习j2ee)
- MySql5.7.10初始化
- android导出CSV,中文乱码问题
- wlan 相关 华为技术论坛
- Linux环境下安装部署AWStats日志分析系统实例