[Edu-sig] Factory functions: synthesizing top-level names

kirby urner kirby.urner at gmail.com
Thu May 27 07:44:14 CEST 2010


On Wed, May 26, 2010 at 7:21 PM, Andre Roberge <andre.roberge at gmail.com> wrote:

>
> Ok, here's my solution:
>
>>>> def make_root(i):
> ...    def _root(x):
> ...         return pow(x, 1.0/i)
> ...    return _root
> ...
>>>> for i in range(1, 11):
> ...     locals()['root' + str(i)] = make_root(i)
> ...
>>>> root2(4)
> 2.0
>>>> root4(64)
> 2.8284271247461903
>>>> root6(64)
> 2.0
>
> Cheers,
> André
>

Much appreciated André!

I think our solutions are similar:

"""
http://mail.python.org/pipermail/edu-sig/2010-May/009998.html
http://mail.python.org/pipermail/edu-sig/2010-May/009999.html
"""

def makeroot(N):
    try:
        assert type(N)==type(1) and N>=0
    except:
        raise ValueError("0 <= N <= integer")

    fname = "root" + str(N)

    if N==0:
        fdef = "globals()['%s'] = lambda x: pow(x, 0)" % fname
    else:
        fdef = "globals()['%s'] = lambda x: pow(x, float(1)/%s)" % (fname,N)

    exec(fdef)

Kirby


More information about the Edu-sig mailing list