lambda-funcs problem

2007-09-19 Thread dmitrey . kroshko
hi all,
I need to create a Python list of lambda-funcs that are dependent on
the number of the ones, for example

F = []
for i in xrange(N):
F.append(lambda x: x + i)

however, the example don't work - since i in end is N-1 it yields x+
(N-1) for any func.

So what's the best way to make it valid?
Evaluation speed is also very important to me.

Thank you in advance, D.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: lambda-funcs problem

2007-09-19 Thread Marc 'BlackJack' Rintsch
On Wed, 19 Sep 2007 04:39:44 -0700, dmitrey.kroshko wrote:

 I need to create a Python list of lambda-funcs that are dependent on
 the number of the ones, for example
 
 F = []
 for i in xrange(N):
 F.append(lambda x: x + i)
 
 however, the example don't work - since i in end is N-1 it yields x+
 (N-1) for any func.
 
 So what's the best way to make it valid?

The variable is bound to the name `i` when the lambda function is
created not to the value that `i` had at that time.  The idiomatic way is
to use a default value for an argument because those are evaluated at
definition time of functions::

F.append(lambda x, i=i: x + i)

Ciao,
Marc 'BlackJack' Rintsch
-- 
http://mail.python.org/mailman/listinfo/python-list


RE: lambda-funcs problem

2007-09-19 Thread Ryan Ginstrom
 On Behalf Of [EMAIL PROTECTED]
 F = []
 for i in xrange(N):
 F.append(lambda x: x + i)
 
 however, the example don't work - since i in end is N-1 it yields x+
 (N-1) for any func.

How about:

 def make_adder(i):
def adder(x):
return x+i
return adder

 funcs = [make_adder(i) for i in xrange(10)]
 print [func(10) for func in funcs]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
 

Regards,
Ryan Ginstrom

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: lambda-funcs problem

2007-09-19 Thread Bruno Desthuilliers
[EMAIL PROTECTED] a écrit :
 hi all,
 I need to create a Python list of lambda-funcs that are dependent on
 the number of the ones, for example
 
 F = []
 for i in xrange(N):
 F.append(lambda x: x + i)
 
 however, the example don't work - since i in end is N-1 it yields x+
 (N-1) for any func.
 
 So what's the best way to make it valid?

It's a FAQ. The answer is (using list-comp instead of a for loop):

funcs = [lambda x, i=i : x + i for i in xrange(n)]

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: lambda-funcs problem

2007-09-19 Thread Stéphane Larouche
Ryan Ginstrom software at ginstrom.com writes:
 How about:
 
  def make_adder(i):
   def adder(x):
   return x+i
   return adder
 
  funcs = [make_adder(i) for i in xrange(10)]
  print [func(10) for func in funcs]
 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
  

Or if you want a one liner:

funcs = [(lambda i: lambda x: x+i)(i) for i in xrange(10)]

Stéphane

-- 
http://mail.python.org/mailman/listinfo/python-list

Re: lambda-funcs problem

2007-09-19 Thread Bruno Desthuilliers
Stéphane Larouche a écrit :
(snip)
 
 funcs = [(lambda i: lambda x: x+i)(i) for i in xrange(10)]

A bit more complex than necessary... The canonical solution is
funcs = [lambda x, i=i: x+i for i in xrange(10)]


-- 
http://mail.python.org/mailman/listinfo/python-list