01:求结果
def multipliers(): return [lambda x:i*x for i in range(4)] print([m(2) for m in multipliers()])
def a(): return [lambda x:i*x for i in range(4)] b=a() #返回个列表函数 # b[2](1) print(b[1](1)) # print(type(b),b) print([m(1) for m in a()]) print([i*i for i in [1,2,3]]) [3, 3, 3, 3] [1, 4, 9] ''' def multipliers(): return [lambda x:i*x for i in range(4)] print([m(2) for m in multipliers()]) #解释: 函数返回值为一个列表表达式,经过4次循环结果为包含四个lambda函数的列表, 由于函数未被调用,循环中的i值未被写入函数,经过多次替代,循环结束后i值为3, 故结果为:6,6,6,6 func=lambda x:x+1 print(func(1)) #2 print(func(2)) #3 #以上lambda等同于以下函数 def func(x): return(x+1) '''
拓展:
def multipliers(): return [lambda x:i*x for i in range(4)] print([m(2) for m in multipliers()])以上代码的输出是 [6, 6, 6, 6] (而不是 [0, 2, 4, 6])。 这个的原因是 Python 的闭包的后期绑定导致的 late binding,这意味着在闭包中的变量是在内部函数被调用的时候被查找。所以结果是,当任何 multipliers() 返回的函数被调用,在那时,i 的值是在它被调用时的周围作用域中查找,到那时,无论哪个返回的函数被调用,for 循环都已经完成了,i 最后的值是 3,因此,每个返回的函数 multiplies 的值都是 3。因此一个等于 2 的值被传递进以上代码,它们将返回一个值 6 (比如: 3 x 2)。 (顺便说下,正如在 The Hitchhiker’s Guide to Python 中指出的,这里有一点普遍的误解,是关于 lambda 表达式的一些东西。一个 lambda 表达式创建的函数不是特殊的,和使用一个普通的 def 创建的函数展示的表现是一样的。) 。 通过修改产生期望的结果 0,2,4,6 最普遍的解决方案是创建一个闭包,通过使用默认参数立即绑定它的参数。例如: def multipliers(): return [lambda x, i=i : i * x for i in range(4)] 结果是:[0,2,4,6]