导航:起始页 > Dive Into Python > 动态函数 > plural.py, 第 6 阶段 | << >> | ||||
深入 Python :Dive Into Python 中文版Python 从新手到专家 [Dip_5.4b_CPyUG_Release] |
现在你已准备好探讨生成器 (Generator) 了。
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
这里使用了被称作生成器的技术,我不打算在你看过一个简单例子之前试图解释它。
>>> 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 工作得很好。
>>> 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 函数看看如何可以把它用起来。
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 阶段中,你读取整个规则文件并在使用第一条规则之前构建一个所有规则组成的列表。现在有了生成器,你可以更舒适地做到这一切:你打开并读取第一条规则,根据它创建函数并使用之,如果它适用则根本不去读取规则文件剩下的内容,也不去建立另外的函数。
<< plural.py, 第 5 阶段 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
小结 >> |