0

我正在从一个站点学习 Python,他们在那里提到了这些代码行来解释 lambda 函数

def first_number(n):
    return lambda first : first * n
    
second_num = first_number(2)

print(second_num(20))

输出为 40

代码为什么会打印 40 以及变量“first”和“n”将采用什么值,谁能解释一下。

4

4 回答 4

1

只是简单地解释一下这段代码在你的情况下是如何工作的:在这一行上分配first_number(2)时:second_num

second_num = first_number(2)

您调用了该函数first_number并替换n为 2。结果分配给second_num

现在,该函数first_number不只是像常量一样返回一个值:它返回一个函数,因为lambda它是一个没有名称的函数(进一步了解 lambda 的工作原理),您只需将该函数n替换为.2second_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)

希望这能让事情变得清楚!

于 2020-12-17T07:56:54.773 回答
0

只看 lambda

lambda first : first * n

相当于一个函数:

def fn(first):
    return first * n

first是参数,然后它返回冒号后面的表达式的结果。n来自不是特定于 lambda 的闭包。

于 2020-12-17T08:01:13.343 回答
0

n2first20。请注意

def first_number(n):
    return lambda first : first * n

是一个本身返回函数的函数(函数是 Python 中的一等对象)!因此

second_num = first_number(2)

大致相当于

def second_num(first):
    return first * 2

其中n第一个函数内部的执行时间固定为2并且仍然可以作为闭包变量访问。

于 2020-12-17T08:03:16.133 回答
0
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

于 2020-12-17T08:07:16.763 回答