定义
lambda
函数是一个小的匿名函数,它允许有多个自变量,但是只能有一个表达式。
所谓匿名函数(英語:Anonymous Function)在计算机编程中是指一类无需定义标识符(函数名)的函数或子程序。(定义来源于维基百科,如果没有VPN可能无法打开该匿名函数的超链接)
语法
lambda arguments : expression
arguments
表示的是对应函数的自变量值,expression
表示的是该函数的返回值,并且这个返回值是由这个expression
表达式计算得出的。
示例1—单个参数
x = lambda a : a + 10
print(x(5))
"""
result:
15
"""
我们使用lambda
函数定义了一个函数, 这个函数的参数为a
,并且它的表达式为a+10
。最后我们打印出结果即可。
上述代码等同于下面的:
def x(a):
result = a + 10
return result
print(x(5))
"""
result:
15
"""
可以看到,我们得到了相同的结果。
示例2—多个参数
x = lambda a, b : a * b
print(x(5, 6))
"""
result:
30
"""
上述代码等同于:
def x(a, b):
result = a * b
return result
print(x(5, 6))
"""
result:
30
"""
同理,对于三个及多个参数,均可以使用lambda
函数来定义。
示例3
def multiply(n):
return lambda s : s * n
main = multiply(2)
print(main(5)) # 10
print(main('Inkfish')) # InkfishInkfish
机制:首先在运行main = multiply(2)
时初始化了变量n
的值,然后当我们print(main(5))
时,将5
的值赋给了multiply()
内嵌函数中的s
,所以得到5 * 2=10
。同理对于print(main('Inkfish'))
,因为s
此时是字符串"Inkfish"
,所以*2
变成了对字符串的复制操作,变成了两个Inkfish
,即InkfishInkfish
。
补充:
内嵌函数:可以简单的理解为位于其他函数中的函数。
示例4—字符串
string = 'GeeksforGeeks'
print(lambda string: string)
"""
result:
<function <lambda> at 0x000001E374E20E50>
"""
上述代码等同于:
def string(string):
return string
print(string)
"""
result:
<function string at 0x0000019728130E50>
"""
等同于我们只定义了一个函数,而没有给这个函数给自变量值。因此打印输出时得到的时一个function
对象。
第一种书写方式
如果我们想要得到想应的值,我们可以采取如下代码:
string = "GeeksforGeeks"
print((lambda string: string)(string))
"""
result:
GeeksforGeeks
"""
可以看到,我们这里可以通过复制给函数,来获取我们想要的打印结果。可能这样写还是有些迷惑性,我们可以进一步将其改为:
str1 = "GeeksforGeeks"
print((lambda string: string)(str1))
或许这样还不够清晰,我们可以将其替换为:
def print_string(string):
return string
str1 = "GeeksforGeeks"
print(print_string(str1))
第二种书写方式
在实际使用中,我们也可以这样书写:
string = "GeeksforGeeks"
(lambda string: print(string))(string)
上述代码等同于:
def print_string(string):
print(string)
string = "GeeksforGeeks"
print_string(string)
到这里,大家应该都比较清楚了。
示例5—高级用法1
tables = [lambda x=x: x * 10 for x in range(1, 11)]
print(tables[0])
for table in tables:
print(table())
"""
result:
<function <listcomp>.<lambda> at 0x00000158F8080EE0>
10
20
30
40
50
60
70
80
90
100
"""
相信有不少小伙伴们看到这里就懵逼了。本人第一次看到这个同样也懵了。这和说好的不一样啊,lambda
后面不是说好的跟参数的吗,这里怎么直接跟了一个x=x
的表达式呢?这里我们来深入分析一下,首先tables[0]
毋庸置疑对应的一定是一个函数对象。其次我们看到,这里x=x
的最后面有一个for x in range(1, 11)
。我们先来看一下如下代码:
tables = [x for x in range(1, 11)]
print(tables)
"""
result:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
"""
我们可以看到,通过这种形式我们得到了一个各元素逐渐递增的列表对象。
我们回到之前的问题,因此x=x
加上for x in range(1, 11)
表达的是,我们当前定义的这个函数对像,对其中的自变量已经进行了赋值操作,其中所赋的值分别为1, 2, 3, 4, 5, 6, 7, 8, 9, 10
。所以,在源代码中,当我们每次遍历后直接使用table()
就可以获得想应函数的值,而这里我们看到是无需传递参数的。
为了更加清晰,上述代码可以等同于:
lst = [x for x in range(1, 11)]
iter1 = iter(lst)
def table():
return next(iter1) * 10
tables = [table, table, table, table, table, table, table, table, table, table]
print(tables[0])
for table in tables:
print(table())
"""
result:
<function table at 0x00000223A2050EE0>
10
20
30
40
50
60
70
80
90
100
"""
可能上述代码的形式并不完美,但是大概的意思就是这样子的。
示例5—高级用法2
eps = 0.1
delta = lambda x, eps: 1.0 / eps if -eps / 2.0 < x and x < eps / 2.0 else 0
上述代码等同于:
def delta(x, eps):
if -eps / 2.0 < x < eps / 2.0:
return 1.0 / eps
else:
return 0
eps = 0.1
至此,关于lambda函数的用法基本已经介绍完毕。
最后一次更新时间,2022.06.21。
如果大家觉得有用,就点个赞让更多的人看到吧~