Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 12, 2009 09:38:21

Octans
От:
Зарегистрирован: 2009-11-12
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

непонятки с lambda

С виду пример кажется несколько надуманным, но все же результат первого варианта непонятен. Пожет кто-нибудь пояснить?

def out0(x):
print 0
def out1(x):
print 1

m = [out0,out1]

l = [lambda: x(0) for x in m]

l[0]()
l[1]()
результат:
>>>
1
1


def out0(x):
print 0
def out1(x):
print 1

m = [out0,out1]

l = [lambda: m[0](0),lambda: m[1](0)]

l[0]()
l[1]()
результат:
>>>
0
1



Отредактировано (Ноя. 12, 2009 09:53:30)

Офлайн

#2 Ноя. 12, 2009 10:40:00

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

непонятки с lambda

Octans
def out0(x):
print 0
def out1(x):
print 1

m = [out0,out1]

l = [lambda: x(0) for x in m]

l[0]()
l[1]()
результат:
>>>
1
1
x - находится во внешней по отношению к лямбде области видимости. После формирования списка x равно последнему значению из m, т.е. out1. Так что все логично.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Ноя. 12, 2009 12:01:04

Octans
От:
Зарегистрирован: 2009-11-12
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

непонятки с lambda

Понятно. Тогда такой вопрос, к примеру у меня есть список функций, длина которого определяется во время выполнения , где a, b, c, d… - это функции принимающие один входной параметр, например a(x)
Как преобразовать этот список в список функций, которым передан этот параметр т.е. в список функций вида ? Через цикл for не выходит, получается что все элементы списка ссылаются на последнюю функцию.



Отредактировано (Ноя. 12, 2009 12:03:30)

Офлайн

#4 Ноя. 12, 2009 13:09:00

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

непонятки с lambda

Переделывая ваш пример

from functools import partial

def out0(x):
print 0, x

def out1(x):
print 1, x

m = [out0,out1]
l = [partial(x, 0) for x in m]

In [52]: l[0]()
0 0
In [53]: l[1]()
1 0
если версия питона меньше 2.5, то partial можно определить самому
def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*(args + fargs), **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#5 Ноя. 12, 2009 13:10:44

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

непонятки с lambda

[lambda x=x,y=y: x(y) for x, y in zip(funs, pars)]
без x=x, y=y не обойтись
или
map(lambda x, y: lambda : x(y), funs, pars)



Офлайн

#6 Ноя. 12, 2009 13:41:42

Octans
От:
Зарегистрирован: 2009-11-12
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

непонятки с lambda

Большое спасибо, выручили:)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version