Python lambda函数

定义

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。

如果大家觉得有用,就点个赞让更多的人看到吧~

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勤奋的大熊猫

你的鼓励将是我写作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值