Python学习系列之lambda表达式

2022-11-02 17:15:43 浏览数 (1)

一、lambda定义与用法

lambda表达式是一行的函数。它们在其他语言中也被称为匿名函数。即,函数没有具体的名称,而用def创建的方法是有名称的。如果你不想在程序中对一个函数使用两次,你也许会想用lambda表达式,它们和普通的函数完全一样。而且当使用函数作为参数的时候,lambda表达式非常有用,可以让代码简单,简洁。

lambda表达式返回的是function类型,说明是一个函数类型。

“””命名的foo函数”””

代码语言:javascript复制
def foo():return 'beginman'  #Python中单行参数可以和标题写在一行

“””lambda关键字创建匿名函数,该表达式同以上函数”””

代码语言:javascript复制
lambda:'beginman'   

上面的只是简单的用lambda创建一个函数对象,并没有保存它也没有调用它,时刻会被回收了。这里我们保存并调用: 保存之后,函数对象相当于函数名。

代码语言:javascript复制
bar = lambda:'beginman'
print bar()     #beginman

原型

lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值。lambda语句构建的其实是一个函数对象。

如果没有参数,则lambda冒号前面就没有,如以上例子。

代码语言:javascript复制
lambda 参数:操作(参数)
lambda [arg1[,arg2,arg3....argN]]:expression

例子

代码语言:javascript复制
    add = lambda x, y: x   y

    print(add(3, 5))
    # Output: 8

这还有一些lambda表达式的应用案例,可以在一些特殊情况下使用:

列表排序

代码语言:javascript复制
    a = [(1, 2), (4, 1), (9, 10), (13, -3)]
    a.sort(key=lambda x: x[1])

    print(a)
    # Output: [(13, -3), (4, 1), (1, 2), (9, 10)]

列表并行排序

代码语言:javascript复制
    data = zip(list1, list2)
    data = sorted(data)
    list1, list2 = map(lambda t: list(t), zip(*data))

二、lambda与命名函数的区别

1、lambda不创建接收变量。

def创建的方法是有名称的,而lambda没有,可以立刻传递(无需变量)。python lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def则会把函数对象赋值给一个变量(函数名)。 如:

代码语言:javascript复制
>>> def foo():return 'foo()'
>>> foo
<function foo at 0x011A34F0>

2、python lambda它只是一个表达式,而def则是一个语句。

lambda表达式运行起来像一个函数,当被调用时创建一个框架对象。

因此语句嵌套用def,表达式嵌套用lambda。

比如:

代码语言:javascript复制
a = 2
if a > 1 :
  def info ():
    print 'haha'
else :
  def test ():
    print 'test'
代码语言:javascript复制
g = lambda x : x 2
info = [g(x) for x in range(10)]
print info

因为这一点,lambda能够出现在Python语法不允许def出现的地方。例如,在一个列表常量中或者函数调用的参数中。此外,作为一个表达式,lambda返回了一个值(一个新的函数),可以选择性的赋值给一个变量名。相反,def语句总是得在头部将一个新的函数赋值给一个变量名,而不是将这个函数作为结果返回。

3、在内部只能包含一行代码

lambda表达式” : “后面,只能有一个表达式,def则可以有多个。 lambda表达式内部只能包含一行代码,而命名函数内对此无限制。lambda的主体是一个单个的表达式,而不是一个代码块。这个lambda的主体简单得就好像放在def主体的return语句中的代码一样。简单地将结果写成一个顺畅的表达式,而不是明确的返回。因为它仅限于表达式,lambda通常要比def功能要小:你仅能够在lambda主体中封装有限的逻辑进去,连if这样的语句都不能够使用。 这是有意设计的——它限制了程序的嵌套:lambda是一个为编写简单的函数而设计的,而def用来处理更大的任务。

4、自动返回结果

返回lambda表达式中最后一个表达式的值。

5、lambda可以直接作为python 列表或python 字典的成员

6、嵌套问题

像if或for或print等语句不能用于lambda中,def可以。

因为def是语句,不是表达式不能嵌套在里面,lambda表达式在“:”后只能有一个表达式。也就是说,在def中,用return可以返回的也可以放在lambda后面,不能用return返回的也不能定义在python lambda后面。因此,像if或for或print这种语句就不能用于lambda中,lambda一般只用来定义简单的函数。

7、目的不同

lambda一般用来定义简单的函数,而def可以定义复杂的函数。

8、不可重用

lambda函数不能共享给别的程序调用,def可以。

三、使用lambda的优缺点

lambda 表达式可以写出非常简练的代码,但是缺点也非常明显:难于理解,降低了可读性和性能。特别是对于 Python 新手。

优点:

1、对于单行函数,使用lambda可以省去定义函数的过程,让代码更加精简。 2、在非多次调用的函数的情况下,lambda表达式即用即得,提高性能。 注意:如果for..in..if(python中另外一个简单表达式)能做的,最好不要选择lambda。

3、 使用Python写一些执行脚本时,使用lambda可以省去定义函数的过程,让代码更加精简。

4、对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。

5、使用lambda在某些时候让代码更容易理解。

6、代码简洁,不增加额外变量。

缺点:

1、对很多 Python 程序员来说, lambda 表达式是一种古怪而又陌生的语法。

2、lambda 函数本身缺少名称和文档, 意味着了解它们功能的唯一方式就是读代码,让代码变得更加晦涩。

3、lambda 表达式只能包含一条语句, 因此某些提高可读性的语言功能, 如元组拆包, 不能与它们一起使用。

4、lambda 函数通常可以被替换为标准库中已存在的函数或 Python 内置的函数,利用已有函数是更好的选择。

四、使用lambda的注意项

1、lambda 函数可以接收任意多個参数 (包括可选参数) 并且返回单个表达式的值。

2、lambda 函数不能包含命令,包含的表达式不能超过一个。

3、即使是print语句也不能用在 lambda形式中,只能使用表达式。并且匿名函数中不能出现if或者for等一些条件判断,循环的语句。

4、lambda表达式返回的函数直接返回这一句表达式的值。没有return,最后一个表达式的值即返回值。

5、匿名函数(lambda表达式),只能写在一行上,所以也有人也叫他单行函数。

6、使用lambda来定义的。

7、参数列表不需要用括号。

8、冒号不是用来开始新语句块的。

9、lambda 定义了一个匿名函数

10、lambda 并不会带来程序运行效率的提高,只会使代码更简洁。

11、如果可以使用for…in…if来完成的,坚决不用lambda。

12、如果使用lambda,lambda内不要包含循环,如果有,我宁愿定义函数来完成,使代码获得可重用性和更好的可读性。

13、在def中,用return可以返回的也可以放在lambda后面,不能用return返回的也不能定义在python lambda后面。因此,像if或for或print这种语句就不能用于lambda中,lambda一般只用来定义简单的函数

14、lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数

15、虽然lambda函数看起来只能写一行,却不等同于C或C 的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率

16、由于可读性方面的考虑,应该避免使用嵌套lambda。

(1)直接调用

代码语言:javascript复制
>>> (lambda x: x   3)(3)   第一对函数用来改变优先级,第二队括号表示函数调用
6
因为匿名函数是没有名字的,因此只有函数体和参数组成,直接使用小括号来将函数体括起来,就可以执行了(lambda x: x   3)
函数体后面加上小括号,就是给匿名函数传参(3)

(2)普通函数所支持的参数的变化,匿名函数都支持的

比如默认参数等:

代码语言:javascript复制
默认参数
>>> (lambda x,y=3: x y)(5)
8

五、lambda 使用场景

(1)、lambda起到了一种函数速写的作用,允许在使用的代码内嵌入一个函数的定义。他们完全是可选的(你总是能够使用def来替代它们),但是你仅需要嵌入小段可执行代码的情况下它们会带来一个更简洁的代码结构。

(2)、你所要做的操作是不重要的: 函数不值得一个名称。

(3)、使用 lambda 表达式比你所能想到的函数名称让代码更容易理解

(4)、你很确定还没有一个现有的函数能满足你的需求。

(5)特别适合在map,pcap等函数内需要函数参数的场景下。

(6)、最重要的是你团队的每个人都了解 lambda 表达式, 并且都同意使用它们。很多语言比如java,C#都具有lambda表达式功能。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/180652.html原文链接:https://javaforall.cn

0 人点赞