FishHook
Июнь 22, 2012 13:16:25
vault
FishHook
Лямбда - это функция.
Сколько раз функцию вызываешь, столько раз она и вычисляется.
Я же не про вычисление значения функции, а про вычисление самой функции. В моем примере, судя по циклу, в списке размещены функции: 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)
Что будет выведено на печать?
vault
Июнь 22, 2012 13:49:03
FishHook, спасибо огромное. Меня что-то переклинило - думал, с лямбдами должно быть по-другому. Теперь я смогу спать спокойно)
Ed
Июнь 22, 2012 14:31:29
fata1ex
весь интерес - победить лямбды!
Ну, учитывая их врожденную ущербность в питоне наверное вариант с дефолтовым значением будет на мой взгляд наименее ужасным:
def gen1(a, b):
return [lambda x,y=i: x+y for i in xrange(a, b+1)]
fata1ex
Июнь 22, 2012 15:22:43
Ed, против этого варианта
высказался py.user.next, и я с ним согласен :) Видимо, кроме partial нормальных вариантов нет.
Ed
Июнь 22, 2012 15:50:44
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 16:02:07
Ну или так, если уж хочется одних лямбд:
def gen(a, b):
return [(lambda x: lambda y: x+y)(i) for i in xrange(a, b+1)]
dimy44
Июнь 22, 2012 20:38:31
Блин. Чем вариант с “замораживанием” каждого значения итерации (параметра по-умолчанию) не устроил, хз, очевидный вариант, частенько применяю… Мы ж знаем, что хотим, а не пишем с рассчетом обнаружения кода марсианами. Имхо конечно.
fata1ex
Июнь 22, 2012 20:55:07
dimy44, да ладно вам. Надо же развлекаться как-нибудь.
vault
Июнь 22, 2012 21:23:49
Хм, после этого примера второй раз за время изучения питона испытал, что он может вести себя не самым очевидным образом. Первый раз был, когда я метом проб и ошибок узнавал, что деструктор не вызывается при удалении представителя объекта)
Спасибо всем, кто помог в этой ситуации.
fata1ex
Июнь 22, 2012 21:29:36
vault, вы ошиблись. Деструктор вызывается как раз при удалении объекта. И это вполне очевидно, если подумать. Не говоря уже о том, что об этом написано в документации и в огромной куче других мест )