使用lambda作为函数与将lambda与map一起使用有什么区别吗?

时间:2019-05-12 14:34:19

标签: python lambda

当我使用lambda作为函数时,结果是列表连接。 但是当我将lambda与map一起使用时,结果是两个列表的总和。

res = [[1]]
g = lambda x, y: x + y
print(g(res[-1] + [0], [0] + res[-1]))
print(list(map(lambda x, y: x + y, res[-1] + [0], [0] + res[-1])))
  
    

[1、0、0、1]     [1,1]

  

1 个答案:

答案 0 :(得分:1)

这行很简单:

print(g(res[-1] + [0], [0] + res[-1]))

它仅使用参数[1, 0][0, 1]调用一次函数。这两个列表串联产生[1,0,0,1]


已更新并更正:

我的第一个答案是描述具有一个可迭代项的情况,但这是具有两个可迭代项的映射。

带有map的行为每组参数调用一次函数(lambda或常规,无关紧要)。这些参数的形成方式在文档中有详细说明:

  

返回将函数应用于所有可迭代项的迭代器,   产生结果。如果传递了其他可迭代的参数,   函数必须接受那么多参数,并应用于项目   来自所有可迭代对象的并行操作。有了多个可迭代项,迭代器   当最短的迭代次数用尽时停止。

我已重新格式化该行:

print(list(map(
    lambda x, y: x + y,  # call this function repeatedly
    res[-1] + [0],       # X's are takes from this list,
    [0] + res[-1]        # Y's are taken from this list,
    ))) 

调用将与列表中的值一样多(准确地说,是最短的一次)。第一次调用的参数为1,0;第二个调用的参数为0、1。每个参数集都有两个值,因为传递了两个列表(当然,列表是可迭代的),因此它与需要两个参数的函数(x和{{1} }。如果存在三个或更多的可迭代项,则会发生y

第一个电话加1 + 0,第二个电话加0 + 1。结果列表为TypeError

另一个示例(100 + 1、200 + 2、300 + 3)-> [101,202,303]:

[1,1]

您可以将调试输出添加到print(list(map( lambda x, y: x + y, # call this function repeatedly [100,200,300], # X's are takes from this list, [1,2,3] # Y's are taken from this list, ))) 的定义中,以查看正在计算的内容。

g

该函数是否定义为lambda都没有区别。您可以这样编写def g(x, y): print(f"debug: {x} + {y} -> {x+y}") return x+y

map

并使用不同的数据测试程序。