首页 > 解决方案 > 使用 lambda 作为函数和使用 lambda 和 map 有什么区别吗?

问题描述

当我使用 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]

标签: pythonlambda

解决方案


这条线很简单:

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。每组参数都有两个值,因为传递了两个列表(当然,列表是可迭代的)所以它匹配需要两个参数(xy)的函数。如果存在三个或更多可迭代对象,TypeError则会发生 a。

第一次调用加 1+0,第二次调用加 0+1。结果列表是[1,1]

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

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以查看正在计算的内容。

def g(x, y): 
    print(f"debug: {x} + {y} -> {x+y}")
    return x+y 

函数是否定义为 lambda 没有区别。你可以map这样写:

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

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


推荐阅读