Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 22, 2012 13:16:25

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

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)

Что будет выведено на печать?



Офлайн

#2 Июнь 22, 2012 13:49:03

vault
Зарегистрирован: 2012-06-21
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

FishHook, спасибо огромное. Меня что-то переклинило - думал, с лямбдами должно быть по-другому. Теперь я смогу спать спокойно)

Офлайн

#3 Июнь 22, 2012 14:31:29

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

fata1ex
весь интерес - победить лямбды!
Ну, учитывая их врожденную ущербность в питоне наверное вариант с дефолтовым значением будет на мой взгляд наименее ужасным:
def gen1(a, b):
return [lambda x,y=i: x+y for i in xrange(a, b+1)]



Офлайн

#4 Июнь 22, 2012 15:22:43

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

Ed, против этого варианта высказался py.user.next, и я с ним согласен :) Видимо, кроме partial нормальных вариантов нет.



Отредактировано fata1ex (Июнь 22, 2012 15:22:58)

Офлайн

#5 Июнь 22, 2012 15:50:44

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

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)

Офлайн

#6 Июнь 22, 2012 16:02:07

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

Ну или так, если уж хочется одних лямбд:

def gen(a, b):
return [(lambda x: lambda y: x+y)(i) for i in xrange(a, b+1)]



Офлайн

#7 Июнь 22, 2012 20:38:31

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Не могу разобраться - почему работает неправильно.

Блин. Чем вариант с “замораживанием” каждого значения итерации (параметра по-умолчанию) не устроил, хз, очевидный вариант, частенько применяю… Мы ж знаем, что хотим, а не пишем с рассчетом обнаружения кода марсианами. Имхо конечно.

Офлайн

#8 Июнь 22, 2012 20:55:07

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

dimy44, да ладно вам. Надо же развлекаться как-нибудь.



Офлайн

#9 Июнь 22, 2012 21:23:49

vault
Зарегистрирован: 2012-06-21
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

Хм, после этого примера второй раз за время изучения питона испытал, что он может вести себя не самым очевидным образом. Первый раз был, когда я метом проб и ошибок узнавал, что деструктор не вызывается при удалении представителя объекта)
Спасибо всем, кто помог в этой ситуации.

Офлайн

#10 Июнь 22, 2012 21:29:36

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

vault, вы ошиблись. Деструктор вызывается как раз при удалении объекта. И это вполне очевидно, если подумать. Не говоря уже о том, что об этом написано в документации и в огромной куче других мест )



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version