Форум сайта python.su
vaultFishHook
Лямбда - это функция.
Сколько раз функцию вызываешь, столько раз она и вычисляется.
Я же не про вычисление значения функции, а про вычисление самой функции. В моем примере, судя по циклу, в списке размещены функции: x+a, x+a+1, x+a+2,…,x+b. А потом в списке внезапно оказываются функции x+b,x+b,x+b… Если тут дело в отложенных вычислениях, то, если я правильно понимаю, после того, как вычислились лямбды в цикле, они должны сами по себе и храниться, а не переопедределяться каждый раз при их вызове.
def gen(b): print a,b a=5 f=gen(4) a=9 f=gen(34)
Офлайн
FishHook, спасибо огромное. Меня что-то переклинило - думал, с лямбдами должно быть по-другому. Теперь я смогу спать спокойно)
Офлайн
fata1exНу, учитывая их врожденную ущербность в питоне наверное вариант с дефолтовым значением будет на мой взгляд наименее ужасным:
весь интерес - победить лямбды!
def gen1(a, b):
return [lambda x,y=i: x+y for i in xrange(a, b+1)]
Офлайн
Ed, против этого варианта высказался py.user.next, и я с ним согласен :) Видимо, кроме partial нормальных вариантов нет.
Отредактировано fata1ex (Июнь 22, 2012 15:22:58)
Офлайн
fata1exУгу, согласен. Вот еще вариант. Он прозрачный, но нормальным я бы его тоже не назвал.
Видимо, кроме partial нормальных вариантов нет.
def gen1(a, b):
def foo(x): return lambda y: y+x
return [foo(i) for i in xrange(a, b+1)]
Отредактировано Ed (Июнь 22, 2012 15:51:18)
Офлайн
Ну или так, если уж хочется одних лямбд:
def gen(a, b):
return [(lambda x: lambda y: x+y)(i) for i in xrange(a, b+1)]
Офлайн
Блин. Чем вариант с “замораживанием” каждого значения итерации (параметра по-умолчанию) не устроил, хз, очевидный вариант, частенько применяю… Мы ж знаем, что хотим, а не пишем с рассчетом обнаружения кода марсианами. Имхо конечно.
Офлайн
dimy44, да ладно вам. Надо же развлекаться как-нибудь.
Офлайн
Хм, после этого примера второй раз за время изучения питона испытал, что он может вести себя не самым очевидным образом. Первый раз был, когда я метом проб и ошибок узнавал, что деструктор не вызывается при удалении представителя объекта)
Спасибо всем, кто помог в этой ситуации.
Офлайн
vault, вы ошиблись. Деструктор вызывается как раз при удалении объекта. И это вполне очевидно, если подумать. Не говоря уже о том, что об этом написано в документации и в огромной куче других мест )
Офлайн