繁体   English   中英

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

[英]Is there any difference between using lambda as a function and using lambda with 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]

这行很简单:

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

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


更新并纠正:

我的第一个答案是描述带有一个可迭代对象的情况,但这是一个带有两个可迭代对象的地图。

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

返回一个将函数应用于所有iterable的迭代器,并产生结果。 如果传递了其他可迭代参数,则函数必须采用那么多参数,并且并行地将其应用于所有可迭代对象的项。 对于多个可迭代对象,迭代器在最短可迭代对象耗尽时停止。

我已经重新格式化了这一行:

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

第一次通话加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])))

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM