On Fri, Feb 12, 2010 at 11:49 PM, Eduardo Vieira
<[email protected]> wrote:
> Hello! I was reading the latest version of Mark Pilgrim's "Dive into
> Python" and am confused with these example about the pluralization
> rules. See http://diveintopython3.org/examples/plural3.py and
> http://diveintopython3.org/generators.html#a-list-of-patterns
> Here is part of the code:
> import re
>
> def build_match_and_apply_functions(pattern, search, replace):
> def matches_rule(word):
> return re.search(pattern, word)
> def apply_rule(word):
> return re.sub(search, replace, word)
> return (matches_rule, apply_rule)
>
> patterns = \
> (
> ('[sxz]$', '$', 'es'),
> ('[^aeioudgkprt]h$', '$', 'es'),
> ('(qu|[^aeiou])y$', 'y$', 'ies'),
> ('$', '$', 's')
> )
> rules = [build_match_and_apply_functions(pattern, search, replace)
> for (pattern, search, replace) in patterns]
>
> def plural(noun):
> for matches_rule, apply_rule in rules:
> if matches_rule(noun):
> return apply_rule(noun)
>
> this example works on IDLE: print plural("baby")
> My question is "baby" assigned to "word" in the inner function? It's a
> little mind bending for me...
It is a little mind bending when you first start seeing functions used
as first-class objects. In Python functions are values that can be
passed as arguments, returned, and assigned just like any other value.
This can simplify a lot of problems.
In this case I think the use of functions makes the code needlessly
complicated. Without build_match_and_apply_functions() and the rules
list it would look like this:
def plural(noun):
for (pattern, search, replace) in patterns:
if re.search(pattern, noun):
return re.replace(search, replace, noun)
which is not much longer that the original plural(), doesn't require
all the helper machinery and IMO is easier to understand.
Kent
_______________________________________________
Tutor maillist - [email protected]
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor