Форум сайта python.su
52
vault, вся информация есть в ссылках. Без английского не куда ) В общем, ответ-то угадался сразу - во всём виновато позднее связывание, но с такой проблемой я не встречался.
Еще интересно, что:
>>> fab_adders = lambda a, b: (lambda x: x + off for off in xrange(a, b + 1)) >>> for adder in list(fab_adders(0, 5)): ... print adder(0) ... ... 5 5 5 5 5 5
>>> fab_adders = lambda a, b: [lambda x, off=off: x + off for off in xrange(a, b + 1)] >>> for adder in fab_adders(0, 5): ... print adder(0) ... ... 0 1 2 3 4 5
Отредактировано fata1ex (Июнь 22, 2012 00:11:37)
Офлайн
857
Офлайн
18
>>> def gen(a,b): ... lst = [] ... for i in xrange(a,b+1): ... lst.append(lambda x: x+i) # здесь i переменная из верхней функции ... return lst ... ... for k in gen(1,3): ... print k(1) 4 4 4 >>> def gen(a,b): ... lst = [] ... for i in xrange(a,b+1): ... lst.append(lambda x, i=i: x+i) # а здесь локальная, для каждой лямбды своя ... return lst ... ... for k in gen(1,3): ... print k(1) 2 3 4
Офлайн
857
>> def gen(a,b): ... lst = [] ... for i in range(a, b + 1): ... lst.append(lambda x, i=i: x + i) ... return lst ... >>> lst = gen(0, 5) >>> lst[0](5) 5 >>> lst[1](5) 6 >>> lst[1](5, 4) 9 >>>
Офлайн
568
Решение очевидно.
Непонятки с лямбдой возникают из-за непонимания того, что после завершения цикла, в i хранится значение последней иттерации
for i in range(0, 10): pass print i >>> 9
def gen(a,b): for i in range(a, b+1): yield lambda x: x+i for func in gen(1,3): print func(5)
Офлайн
568
ИМХО самое питонячее решение
Офлайн
52
FishHook, в задании требовался список :) да писали уже такое решение…скажем…в посте #2
py.user.next, это да. И что же делать? )
Отредактировано fata1ex (Июнь 22, 2012 11:27:49)
Офлайн
568
fata1exБлин, я думал сам придумал
да писали уже такое решение
Офлайн
568
fata1exЭээ? напомните задание, пжлст.
в задании требовался список
Офлайн
52
Можно сделать так:
>>> from functools import partial >>> fab_adders = lambda a, b: [partial(lambda x, off: x + off, off=off) for off in xrange(a, b + 1)] >>> for adder in fab_adders(0, 5): ... print adder(0) ... 0 1 2 3 4 5 >>> for adder in fab_adders(0, 5): ... print adder(0), adder(0, 2) ... 0 Traceback (most recent call last): File "<stdin>", line 2, in <module> TypeError: <lambda>() got multiple values for keyword argument 'off'
Отредактировано fata1ex (Июнь 22, 2012 11:53:17)
Офлайн