Help with lambda

lallous elias.bachaalany at gmail.com
Thu Feb 18 14:08:03 CET 2010


On Feb 18, 1:56 pm, "D'Arcy J.M. Cain" <da... at druid.net> wrote:
> On Thu, 18 Feb 2010 04:28:00 -0800 (PST)
>
> lallous <elias.bachaal... at gmail.com> wrote:
> > def make_power(n):
> >     return lambda x: x ** n
>
> Hint: type(make_power(2))
>
> Did you expect that to return "int"?
>

No, I expect to see a specialized function.

> > # Create a set of exponential functions
> > f = [lambda x: x ** n for n in xrange(2, 5)]
> > g = [make_power(n) for n in xrange(2, 5)]
>
> The result of make_power(n) is a function that raises it's argument to
> the power of n.  I don't know what you are trying to do.  Maybe this?
>
> g = [make_power(n)(2) for n in xrange(2, 5)]
> or
> g = [make_power(2)(n) for n in xrange(2, 5)]
>


What I am trying to do is generate different functions.

If you're curious, I was playing with ctypes and wanted to see how it
handles C<->Python callbacks:

CB_T = WINFUNCTYPE(c_int, c_int)
many_cb_t = CFUNCTYPE(c_int, c_int, CB_T)
many_cb   = many_cb_t(addressof(c_void_p.in_dll(dll, "many_cb")))
#ANY_SIMPLER

def make_power(n):
    return lambda x: x ** n

cbs = [CB_T(make_power(n)) for n in xrange(0, 1000)]
cbs.append(None)

many_cb(3, *cbs)

And the C code in a shared lib:

int many_cb(int value, ...)
{
  va_list va;
  va = va_start(va, value);
  cb_t cb;
  int s = 0;
  while ( (cb = va_arg(va, cb_t)) != NULL)
  {
    printf("calling %p", cb);
    int r = cb(value);
    s += r;
    printf(", r=%d\n", r);
  }
  va_end(va);
  return s;
}

Speaking of that, anyone has an idea how to make simpler the line with
#ANY_SIMPLER?

I try: many_cb = CB_T.in_dll(dll, "many_cb") <- but that seems to work
with data items only.



More information about the Python-list mailing list