Найти - Пользователи
Полная версия: непонятки с lambda
Начало » Python для новичков » непонятки с lambda
1
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


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
PooH
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. Так что все логично.
Octans
Понятно. Тогда такой вопрос, к примеру у меня есть список функций, длина которого определяется во время выполнения , где a, b, c, d… - это функции принимающие один входной параметр, например a(x)
Как преобразовать этот список в список функций, которым передан этот параметр т.е. в список функций вида ? Через цикл for не выходит, получается что все элементы списка ссылаются на последнюю функцию.
PooH
Переделывая ваш пример
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
Dimka665
[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)
Octans
Большое спасибо, выручили:)
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