Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 22, 2012 11:51:47

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

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

sp3, py.user.next, fata1ex спасибо.
Правильно ли я понял, что лажа была в том, что лямбды считаются лениво после цикла?

Но вот здесь же я обращаюсь принтом в цикле к массиву и нахожу в нем одни лямбды, а потом возвращается массив с совсем другими лямбдами. Я не понимаю, как пример ниже ложится в эту логику.

>>> def gen(a,b):
	lst = []
	for i in xrange(a,b+1):
		lst.append(lambda x: x+i)
		print lst[i-a](1) #Каждый раз - разные лямбды
	return lst
>>> l = gen(0,2)
1
2
3
>>> l
>>> l[0](1) #Снова полон массив одинаковых лямбд
3

Офлайн

#2 Июнь 22, 2012 11:54:50

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

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

Ребят, решение вроде как тут есть:
http://dimonvideo.ru/blogs/blog/Virtuos86/955

Собственно, ко всем задачкам до классов)

Офлайн

#3 Июнь 22, 2012 11:54:57

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

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

И что же делать? )
Забыть про ущербные питоновые лямбды?
from operator import add
from functools import partial
def gen1(a, b):
    return [partial(add, i) for i in xrange(a, b+1)]



Офлайн

#4 Июнь 22, 2012 11:57:48

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

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

fata1ex
FishHook, задание в первом посте
Да не, просто ТС посчитал, что ему удобней работать со списком, а не генератором.
ИМХО в реальной задаче этот список не нужен.



Офлайн

#5 Июнь 22, 2012 12:02:13

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

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

Ed, ты опять победил :( хотя весь интерес - победить лямбды!
FishHook, в реальной задаче как раз и написано - “список”.

Написать фабрику, аналогичную п.2, но возвращающей список таких функций



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

Офлайн

#6 Июнь 22, 2012 12:54:15

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

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

Товарищи, так как все-таки быть с тем, что массив хранит разные лямбды? Это как-то объясняется отложенными вычислениями?

Офлайн

#7 Июнь 22, 2012 12:57:16

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

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

vault
Товарищи, так как все-таки быть с тем, что массив хранит разные лямбды? Это как-то объясняется отложенными вычислениями?
Именно так.



Офлайн

#8 Июнь 22, 2012 13:00:37

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

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

FishHook
Именно так.
А можете пояснить? Ведь лямбды в моем последнем примере вычисляются еще в цикле. Нафига их питон пересчитывает потом?

Офлайн

#9 Июнь 22, 2012 13:08:13

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

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

vault
FishHook
Именно так.
А можете пояснить? Ведь лямбды в моем последнем примере вычисляются еще в цикле. Нафига их питон пересчитывает потом?
Лямбда - это функция.
Сколько раз функцию вызываешь, столько раз она и вычисляется.



Офлайн

#10 Июнь 22, 2012 13:12:24

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

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

FishHook
Лямбда - это функция.
Сколько раз функцию вызываешь, столько раз она и вычисляется.

Я же не про вычисление значения функции, а про вычисление самой функции. В моем примере, судя по циклу, в списке размещены функции: x+a, x+a+1, x+a+2,…,x+b. А потом в списке внезапно оказываются функции x+b,x+b,x+b… Если тут дело в отложенных вычислениях, то, если я правильно понимаю, после того, как вычислились лямбды в цикле, они должны сами по себе и храниться, а не переопедределяться каждый раз при их вызове.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version