Написал:
def gen(a,b): lst = [] for i in xrange(a,b+1): lst.append(lambda x: x+i) return lst
def gen(a,b): lst = [] for i in xrange(a,b+1): lst.append(lambda x: x+i) return lst
>>> fab_adders = lambda a, b: (lambda x: x + off for off in xrange(a, b + 1)) >>> for adder in fab_adders(0, 5): ... print adder(10) ... ... 10 11 12 13 14 15
>>> fab_adders = lambda a, b: [lambda x: x + off for off in xrange(a, b + 1)] >>> for adder in fab_adders(0, 5): ... print adder(10) ... ... 15 15 15 15 15 15
fata1ex
Видимо, lambda-выражение вычисляется после выполнения цикла for, когда значение i равно b.
>>> def gen(a,b): lst = [] for i in xrange(a,b+1): lst.append(lambda x: x+i) print lst[i-a](1) return lst >>> l = gen(0,2) 1 2 3 >>> l >>> l[0](1) 3
def foo(): fab_adders = lambda a, b: [lambda x: x + off for off in xrange(a, b + 1)] for adder in fab_adders(0, 1): print adder(0) foo()
[00:40] home:~/dev pdb lmbd.py
> /home/fata1ex/dev/lmbd.py(3)<module>()
-> def foo():
(Pdb) b foo
Breakpoint 1 at /home/fata1ex/dev/lmbd.py:3
(Pdb) r
> /home/fata1ex/dev/lmbd.py(4)foo()
-> fab_adders = lambda a, b: [lambda x: x + off for off in xrange(a, b + 1)]
(Pdb) s
> /home/fata1ex/dev/lmbd.py(5)foo()
-> for adder in fab_adders(0, 1):
(Pdb)
--Call--
> /home/fata1ex/dev/lmbd.py(4)<lambda>()
-> fab_adders = lambda a, b: [lambda x: x + off for off in xrange(a, b + 1)]
(Pdb)
> /home/fata1ex/dev/lmbd.py(4)<lambda>()
-> fab_adders = lambda a, b: [lambda x: x + off for off in xrange(a, b + 1)]
(Pdb)
> /home/fata1ex/dev/lmbd.py(4)<lambda>()
-> fab_adders = lambda a, b: [lambda x: x + off for off in xrange(a, b + 1)]
(Pdb)
> /home/fata1ex/dev/lmbd.py(4)<lambda>()
-> fab_adders = lambda a, b: [lambda x: x + off for off in xrange(a, b + 1)]
(Pdb)
--Return--
> /home/fata1ex/dev/lmbd.py(4)<lambda>()->[<functio...b7384ed4>, <functio...b7384e2c>]
-> fab_adders = lambda a, b: [lambda x: x + off for off in xrange(a, b + 1)]
(Pdb)
> /home/fata1ex/dev/lmbd.py(6)foo()
-> print adder(0)
(Pdb)
--Call--
> /home/fata1ex/dev/lmbd.py(4)<lambda>()
-> fab_adders = lambda a, b: [lambda x: x + off for off in xrange(a, b + 1)]
(Pdb)
> /home/fata1ex/dev/lmbd.py(4)<lambda>()
-> fab_adders = lambda a, b: [lambda x: x + off for off in xrange(a, b + 1)]
(Pdb)
--Return--
> /home/fata1ex/dev/lmbd.py(4)<lambda>()->1
-> fab_adders = lambda a, b: [lambda x: x + off for off in xrange(a, b + 1)]
(Pdb)
1
> /home/fata1ex/dev/lmbd.py(5)foo()
-> for adder in fab_adders(0, 1):
(Pdb)
> /home/fata1ex/dev/lmbd.py(6)foo()
-> print adder(0)
(Pdb)
--Call--
> /home/fata1ex/dev/lmbd.py(4)<lambda>()
-> fab_adders = lambda a, b: [lambda x: x + off for off in xrange(a, b + 1)]
(Pdb)
> /home/fata1ex/dev/lmbd.py(4)<lambda>()
-> fab_adders = lambda a, b: [lambda x: x + off for off in xrange(a, b + 1)]
(Pdb)
--Return--
> /home/fata1ex/dev/lmbd.py(4)<lambda>()->1
-> fab_adders = lambda a, b: [lambda x: x + off for off in xrange(a, b + 1)]
(Pdb)
1
> /home/fata1ex/dev/lmbd.py(5)foo()
-> for adder in fab_adders(0, 1):
(Pdb)
--Return--
> /home/fata1ex/dev/lmbd.py(5)foo()->None
-> for adder in fab_adders(0, 1):
(Pdb)
--Return--
> /home/fata1ex/dev/lmbd.py(9)<module>()->None
-> foo()
(Pdb)
--Return--
> <string>(1)<module>()->None