我正在从一个站点学习 Python,他们在那里提到了这些代码行来解释 lambda 函数
def first_number(n):
return lambda first : first * n
second_num = first_number(2)
print(second_num(20))
输出为 40
代码为什么会打印 40 以及变量“first”和“n”将采用什么值,谁能解释一下。
只是简单地解释一下这段代码在你的情况下是如何工作的:在这一行上分配first_number(2)
时:second_num
second_num = first_number(2)
您调用了该函数first_number
并替换n
为 2。结果分配给second_num
。
现在,该函数first_number
不只是像常量一样返回一个值:它返回一个函数,因为lambda
它是一个没有名称的函数(进一步了解 lambda 的工作原理),您只需将该函数n
替换为.2
second_num
一个函数返回一个函数……你不觉得有点奇怪和酷吗?;)
所以你可以说这一行:
second_num = first_number(2)
实际上变成(或者你至少可以这样解释):
def second_num(first):
return first * 2 #the 2 you passed in first_number
所以在运行之后second_num(20)
,它显然返回 40。
那么什么是lambda:
如前所述,lambda 是一个未命名的函数,因此是一个没有名称的函数。你可以解释这一行:
lambda first: first * n
作为一个函数,如:
def thisisafunction(first):
return first*n
所以紧随其后lambda
的是参数,以逗号分隔。而冒号之后:
是函数体。
应用 lambda 函数的另一种方法是保存一些代码。就像 Python 的filter
函数(https://docs.python.org/3/library/functions.html#filter)一样,它要求一个函数作为参数。它以这种方式为您节省了很多代码:
numbers_list = [2, 6, 8, 10, 11, 4, 12, 7, 13, 17, 0, 3, 21]
filtered_list = list(filter(lambda num: (num > 7), numbers_list))
print(filtered_list)
对比
numbers_list = [2, 6, 8, 10, 11, 4, 12, 7, 13, 17, 0, 3, 21]
def filterfunction(num):
return num > 7
filtered_list = list(filter(filterfunction, numbers_list))
print(filtered_list)
希望这能让事情变得清楚!
只看 lambda
lambda first : first * n
相当于一个函数:
def fn(first):
return first * n
first
是参数,然后它返回冒号后面的表达式的结果。n
来自不是特定于 lambda 的闭包。
n
是2
和first
是20
。请注意
def first_number(n):
return lambda first : first * n
是一个本身返回函数的函数(函数是 Python 中的一等对象)!因此
second_num = first_number(2)
大致相当于
def second_num(first):
return first * 2
其中n
第一个函数内部的执行时间固定为2
并且仍然可以作为闭包变量访问。
def first_number(n):
return lambda first : first * n
类似于
def first_number(n):
def lambda_fuc(first):
return first * n
return lambda_fuc
所以,
second_num = first_number(2) ==> means n=2
print(second_num(20)) ==> means first=20
类似于
def first_number(n=2):
def lambda_fuc(first=20):
return first * n
return lambda_fuc
我们得到 40