python - 使用 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]
解决方案
这条线很简单:
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
和y
)的函数。如果存在三个或更多可迭代对象,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])))
并用不同的数据测试程序。
推荐阅读
- c# - Xamarin Forms - 重复的工具栏出现在页面问题上
- python-3.x - PyArrow OSError: [WinError 193] %1 不是有效的 win32 应用程序
- here-api - 这里 API - 不需要参数的自动建议(在文档中)
- python - 为什么数据在 t-SNE 可视化中显示为线/圆而不是“球”?
- typescript - TouchableOpacity onPress() 只有一个按钮在工作
- c - 返回数组中的最大数
- unit-testing - Mockk:无法为方法调用指定答案
- jquery - 在不使用 Cookie 的情况下,使用 JQuery 下载带有加载器或进度表的 Excel 或其他二进制文件
- loops - 如何一次获取字符串的 4 个字符向后迭代
- apache-spark-sql - Databricks“外部输入需要EOF”错误