关于列表推导式中Lambda函数的原理与用法技术问询
列表推导式中Lambda函数的常见疑问解析
示例1
def times_two(a): return a * 2 def times_three(a): return a * 3 numbers = [1, 2, 3, 4] both_functions = [times_two, times_three] for number in numbers: print(list(map((lambda x: x(number)), both_functions)))
疑问解答
lambda x: x(number)的作用:这个匿名函数接收一个参数x,然后调用x(number)并返回结果。这里的x是both_functions里的函数对象(times_two或times_three),所以x(number)就是把当前循环的number作为参数传给这个函数,得到计算后的数值。- 第二个
x的本质:x是lambda的入参,类型是函数对象——因为both_functions里存的是函数的引用,map会把列表里的每个函数依次传给这个lambda,再执行函数调用逻辑。
示例2
is_even_list = [lambda a=x: a * 10 for x in range(0, 6)] for item in is_even_list: print(item())
疑问解答
a=x是给lambda的参数a设置默认值。如果直接写lambda a: a*10,所有lambda会共享循环变量x的最终值(也就是5),因为Python闭包是延迟绑定变量的。加上a=x后,每次循环都会把当前x的即时值绑定为a的默认值,这样每个lambda保存的都是循环时对应的x值。- Lambda并非只能有一个无默认值的参数,带默认值的参数是完全合法的写法,这里的
a=x就是为了规避闭包延迟绑定的坑。
示例3
A = [1, 2, 3, 4] B = [lambda: _ for _ in A] C = [_() for _ in B] print(A) print(B) print(C)
疑问解答
_()是调用列表B中的lambda函数。B里的每个元素都是一个无参匿名函数,它的逻辑是返回变量_的值。_()就是执行这个函数,拿到它返回的结果。- 注意:这里因为闭包延迟绑定,所有lambda里的
_都会指向循环的最后一个值4,所以C的输出会是[4, 4, 4, 4]。
内容的提问来源于stack exchange,提问作者PersyArdi
相关产品推荐
相关产品推荐

