Найти - Пользователи
Полная версия: Не могу разобраться - почему работает неправильно.
Начало » Python для новичков » Не могу разобраться - почему работает неправильно.
1 2 3 4 5 6
vault
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
vault
Ребят, решение вроде как тут есть:
http://dimonvideo.ru/blogs/blog/Virtuos86/955

Собственно, ко всем задачкам до классов)
Ed
И что же делать? )
Забыть про ущербные питоновые лямбды?
from operator import add
from functools import partial
def gen1(a, b):
    return [partial(add, i) for i in xrange(a, b+1)]
FishHook
fata1ex
FishHook, задание в первом посте
Да не, просто ТС посчитал, что ему удобней работать со списком, а не генератором.
ИМХО в реальной задаче этот список не нужен.
fata1ex
Ed, ты опять победил :( хотя весь интерес - победить лямбды!
FishHook, в реальной задаче как раз и написано - “список”.
Написать фабрику, аналогичную п.2, но возвращающей список таких функций
vault
Товарищи, так как все-таки быть с тем, что массив хранит разные лямбды? Это как-то объясняется отложенными вычислениями?
FishHook
vault
Товарищи, так как все-таки быть с тем, что массив хранит разные лямбды? Это как-то объясняется отложенными вычислениями?
Именно так.
vault
FishHook
Именно так.
А можете пояснить? Ведь лямбды в моем последнем примере вычисляются еще в цикле. Нафига их питон пересчитывает потом?
FishHook
vault
FishHook
Именно так.
А можете пояснить? Ведь лямбды в моем последнем примере вычисляются еще в цикле. Нафига их питон пересчитывает потом?
Лямбда - это функция.
Сколько раз функцию вызываешь, столько раз она и вычисляется.
vault
FishHook
Лямбда - это функция.
Сколько раз функцию вызываешь, столько раз она и вычисляется.

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