Найти - Пользователи
Полная версия: Не могу разобраться - почему работает неправильно.
Начало » Python для новичков » Не могу разобраться - почему работает неправильно.
1 2 3 4 5 6
FishHook
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
FishHook, спасибо огромное. Меня что-то переклинило - думал, с лямбдами должно быть по-другому. Теперь я смогу спать спокойно)
Ed
fata1ex
весь интерес - победить лямбды!
Ну, учитывая их врожденную ущербность в питоне наверное вариант с дефолтовым значением будет на мой взгляд наименее ужасным:
def gen1(a, b):
return [lambda x,y=i: x+y for i in xrange(a, b+1)]
fata1ex
Ed, против этого варианта высказался py.user.next, и я с ним согласен :) Видимо, кроме partial нормальных вариантов нет.
Ed
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
Ну или так, если уж хочется одних лямбд:
def gen(a, b):
return [(lambda x: lambda y: x+y)(i) for i in xrange(a, b+1)]
dimy44
Блин. Чем вариант с “замораживанием” каждого значения итерации (параметра по-умолчанию) не устроил, хз, очевидный вариант, частенько применяю… Мы ж знаем, что хотим, а не пишем с рассчетом обнаружения кода марсианами. Имхо конечно.
fata1ex
dimy44, да ладно вам. Надо же развлекаться как-нибудь.
vault
Хм, после этого примера второй раз за время изучения питона испытал, что он может вести себя не самым очевидным образом. Первый раз был, когда я метом проб и ошибок узнавал, что деструктор не вызывается при удалении представителя объекта)
Спасибо всем, кто помог в этой ситуации.
fata1ex
vault, вы ошиблись. Деструктор вызывается как раз при удалении объекта. И это вполне очевидно, если подумать. Не говоря уже о том, что об этом написано в документации и в огромной куче других мест )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB