Форум сайта python.su
Решал задачку 3 отсюда из темы “функции”: http://pyobject.ru/blog/2010/02/04/python-quiz/
Написал:
def gen(a,b): lst = [] for i in xrange(a,b+1): lst.append(lambda x: x+i) return lst
Отредактировано vault (Июнь 21, 2012 23:01:59)
Офлайн
>>> 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
Офлайн
Спасибо. А почему мой код работает неправильно?
Офлайн
Видимо, lambda-выражение вычисляется после выполнения цикла for, когда значение i равно b.
Офлайн
Хм.
>>> 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 (Июнь 21, 2012 23:32:06)
Офлайн
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
Офлайн
Извините, а можно пояснить? Желательно на моем последнем примере - в массиве же хранятся конкретные лямбды, так почему в выводе внутри функции все комильфо, в массиве то что нужно, а возвращается совсем другой массив?
Офлайн
http://math.andrej.com/2009/04/09/pythons-lambda-is-broken/
http://mail.python.org/pipermail/python-bugs-list/2005-March/027801.html
http://bytes.com/topic/python/answers/169732-lambda-functions-within-list-comprehensions
vault, а чего пояснять, я сам в шоке :)
Для print всё ясно - у вас в лямбде и в принте разные i!
Отредактировано fata1ex (Июнь 21, 2012 23:55:09)
Офлайн
То есть, насколько я понял со своим английским, это тупо баг?
Не понял про разные i - я жеж обращаюсь вроде к одному и тому же элементу массива. В случае принта из функции нулевого элемента получаю 1, а в случае принта вне функции - 3. Массив-то, вроде, один и тот же. Извините, если туплю.
Офлайн