提问者:小点点

如何使用lambda作为函数参数?


这个问题顶部答案的作者使用了一个lamda函数作为这个函数的参数:

>>> d1 = {'one':1, 'both':3, 'falsey_one':False, 'falsey_both':None}
>>> d2 = {'two':2, 'both':30, 'falsey_two':None, 'falsey_both':False}


def dict_ops(d1, d2, setop):
...     """Apply set operation `setop` to dictionaries d1 and d2
... 
...     Note: In cases where values are present in both d1 and d2, the value from
...     d1 will be used.
...     """
...     return {k:d1.get(k,k in d1 or d2[k]) for k in setop(set(d1), set(d2))}

像这样:

>>> print "d1 - d2:", dict_ops(d1, d2, lambda x,y: x-y)

返回:

d1 - d2: {'falsey_one': False, 'one': 1}

我试图做同样的事情,但不是作为函数,因为我想了解setop部分是如何工作的。

{k:d1.get(k,k in d1 or d2[k]) for k in lambda d1,d2: set(d1) - set(d2)}

但是,此代码返回一个语法错误。

但这是有效的:

l = lambda d1,d2: set(d1) - set(d2)
{k:d1.get(k,k in d1 or d2[k]) for k in l(d1,d2)}

为什么第二种解决方案有效,而第一种不行?

如果我用这些参数(d1,d2,lambda x,y:x-y)调用dict_ops函数,setop(set(d1)-set(d2)看起来如何?


共1个答案

匿名用户

如果你做一个精确的替换,它就会起作用。 你有:

{... for k in setop(set(d1), set(d2))}

setop传入的值为:

lambda x,y: x-y

setop的直接替换是:

{... for k in (lambda x,y: x-y)(set(d1), set(d2))|

这会管用的。

对于第二个版本,您有:

{... for k in l(d1,d2)}

其中L是:

lambda d1,d2: set(d1) - set(d2)

这里的直接替代产生:

{... for k in (lambda d1,d2: set(d1) - set(d2))(d1,d2)}

这也会奏效的。