带双参数Lambda配合map报错:<lambda>()缺少必选参数'y'原因解析
问题:带双参数lambda的map函数触发TypeError的原因
任务背景:给定一份薪资列表,输入全员奖金金额,将所有薪资增加该奖金后输出结果列表。
可正常运行的代码:
salaries = [2000, 1800, 3100, 4400, 1500] bonus = int(input()) salaries = list(map(lambda x: x+bonus, salaries)) print(salaries)
修改后触发TypeError: <lambda>() missing 1 required positional argument: 'y'的代码:
salaries = [2000, 1800, 3100, 4400, 1500] bonus = int(input()) salaries = list(map((lambda x,y: x+y), (salaries,bonus))) print(salaries)
错误原因解析
- map函数的工作逻辑:map接收一个处理函数,以及一个或多个可迭代对象。它会从每个可迭代对象中按顺序取出对应位置的元素,一起传给处理函数的参数。比如
map(func, iter1, iter2)会每次取iter1[i]和iter2[i],传给func(iter1[i], iter2[i])。 - 你的代码问题:你把
(salaries, bonus)作为map的第二个参数,但bonus是单个整数,不是可迭代对象。当map尝试从第二个"可迭代对象"(bonus)中取元素时,整数无法被迭代,导致lambda函数只拿到了来自salaries的第一个元素(x=2000),却拿不到y参数,直接触发TypeError。 - 正确写法的逻辑:原代码里的lambda只需要一个参数x,map遍历salaries的每个元素传给x,bonus作为外部变量直接在lambda中引用,不需要作为map的参数传入,这样每个薪资都能加上同一个bonus。
如果非要用双参数lambda实现,需要把bonus转换成和salaries长度一致的可迭代对象,比如:
salaries = list(map(lambda x,y: x+y, salaries, [bonus]*len(salaries)))
这样map会每次从salaries取一个薪资,从重复bonus的列表取一个奖金,传给lambda的x和y,就能正常完成薪资加奖金的计算。
内容的提问来源于stack exchange,提问作者Artur Kv
相关产品推荐
相关产品推荐

