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

Reply via email to