导航: 起始页 > Dive Into Python > 动态函数 > plural.py, 第 6 阶段 | << >> | ||||
Python 研究(Dive Into Python)Python 从新手到高手 [DIP_5_4_CPUG_RELEASE] |
现在你已准备好探讨生成器(Generator )了。
例 17.17. plural6.py
import re def rules(language): for line in file('rules.%s' % language): pattern, search, replace = line.split() yield lambda word: re.search(pattern, word) and re.sub(search, replace, word) def plural(noun, language='en'): for applyRule in rules(language): result = applyRule(noun) if result: return result
这里使用了被称作生成器的技术,我不打算在你看过一个简单例子之前试图解释它。
例 17.18. 介绍生成器
>>> def make_counter(x): ... print 'entering make_counter' ... while 1: ... yield x ... print 'incrementing x' ... x = x + 1 ... >>> counter = make_counter(2) >>> counter <generator object at 0x001C9C10> >>> counter.next() entering make_counter 2 >>> counter.next() incrementing x 3 >>> counter.next() incrementing x 4
这样你就有了成功生成 Fibonacci 数的函数了。 当然你也可以通过递归做到,但是这里的方法更加容易和理解。并且也与 for 工作的很好。
例 17.20. for 循环中的生成器
>>> for n in fibonacci(1000): ... print n, 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
好了,让我们回到 plural 函数看看如何可以把它用起来。
例 17.21. 生成器生成动态函数
def rules(language): for line in file('rules.%s' % language): pattern, search, replace = line.split() yield lambda word: re.search(pattern, word) and re.sub(search, replace, word) def plural(noun, language='en'): for applyRule in rules(language): result = applyRule(noun) if result: return result
你在 第 5 阶段 得到的是什么? 第 5 阶段中,你读取整个规则文件并在使用第一条规则之前构建一个所有规则组成的列表。 现在有了生成器,你可以更舒适地做到这一切:你打开并读取第一条规则,根据它创建函数并使用之,如果它适用则根本不去读取规则文件剩下的内容,也不去建立另外的函数。
进一步阅读
- PEP 255 定义生成器。
- Python Cookbook 有 生成器的例子.
<< plural.py, 第 5 阶段 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
小结 >> |