第21讲:lambda表达式

一 lambda表达式

1 功能: lambda 表达式,又称匿名函数,常用来表示内部仅包含 1 行表达式的函数

2 概念:https://www.runoob.com/python/python-functions.html

  • lambda只是一个表达式,函数体比def简单很多。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

3 语法:name = lambda [list] : 表达式

其中,定义 lambda 表达式,必须使用 lambda 关键字;冒号前面[list] 作为可选参数,等同于定义函数是指定的参数列表;冒号右边的返回值,name为该表达式的名称,可用name调用该表达式。

4 lamnda与命名函数的区别(https://blog.csdn.net/answer3lin/article/details/86352009

  • lambda不创建接收变量
    • def创建的方法是有名称的,而lambda没有,可以立刻传递(无需变量)。
    • python lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def则会把函数对象赋值给一个变量(函数名)。
  • python中的lambda只是一个表达式,而def是一个语句
    • lambda表达式运行起来像一个函数,当被调用时创建一个框架对象。因此语句嵌套用def,表达式嵌套用lambda。
    • 因为这一点,lambda能够出现在Python语法不允许def出现的地方。例如,在一个列表常量中或者函数调用的参数中。
    • 此外,作为一个表达式,lambda返回了一个值(一个新的函数),可以选择性的赋值给一个变量名。相反,def语句总是得在头部将一个新的函数赋值给一个变量名,而不是将这个函数作为结果返回。
  • 在内部只能包含一行代码
    • lambda表达式” : “后面,只能有一个表达式,def则可以有多个。 lambda表达式内部只能包含一行代码,而命名函数内对此无限制。
    • lambda的主体是一个单个的表达式,而不是一个代码块。这个lambda的主体简单得就好像放在def主体的return语句中的代码一样
    • 它限制了程序的嵌套:lambda是一个为编写简单的函数而设计的,而def用来处理更大的任务。
  • 自动返回结果
    • 返回lambda表达式中最后一个表达式的值。
  • lambda可以直接作为python列表或python字典的成员
  • 嵌套问题
    • 像if或for或print等语句不能用于lambda中,def可以。
    • 在def中,用return可以返回的也可以放在lambda后面,不能用return返回的也不能定义在python lambda后面。
  • 目的不同
    • lambda一般用来定义简单的函数,而def可以定义复杂的函数。 
  • 不可重用
    • lambda函数不能共享给别的程序调用,def可以。 

5 使用lambda表达式的优缺点

  • 优点
    • 对于单行函数,使用lambda可以省去定义函数的过程,让代码更加精简。
    • 在非多次调用的函数的情况下,lambda表达式即用即得,提高性能。
      • 注意:如果for..in..if(python中另外一个简单表达式)能做的,最好不要选择lambda。
    • 使用Python写一些执行脚本时,使用lambda可以省去定义函数的过程,让代码更加精简。
    • 对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。
    • 使用lambda在某些时候让代码更容易理解。
    • 代码简洁,不增加额外变量。
  • 缺点
    • 对很多 Python 程序员来说, lambda 表达式是一种古怪而又陌生的语法。
    • lambda 函数本身缺少名称和文档, 意味着了解它们功能的唯一方式就是读代码,让代码变得更加晦涩。
    • lambda 表达式只能包含一条语句, 因此某些提高可读性的语言功能, 如元组拆包, 不能与它们一起使用。
    • lambda 函数通常可以被替换为标准库中已存在的函数或 Python 内置的函数,利用已有函数是更好的选择。

6 使用lambda注意事项

  • lambda 函数可以接收任意多個参数 (包括可选参数) 并且返回单个表达式的值。 
  • lambda 函数不能包含命令,包含的表达式不能超过一个。
  • 即使是print语句也不能用在 lambda形式中,只能使用表达式。并且匿名函数中不能出现if或者for等一些条件判断,循环的语句。
  • lambda表达式返回的函数直接返回这一句表达式的值。没有return,最后一个表达式的值即返回值。
  • 匿名函数(lambda表达式),只能写在一行上,所以也有人也叫他单行函数。
  • 参数列表不需要用括号。
  • 冒号不是用来开始新语句块的。
  • lambda 定义了一个匿名函数
  • lambda 并不会带来程序运行效率的提高,只会使代码更简洁。
  • 如果可以使用for...in...if来完成的,坚决不用lambda。
  • 如果使用lambda,lambda内不要包含循环,如果有,我宁愿定义函数来完成,使代码获得可重用性和更好的可读性。
  • 在def中,用return可以返回的也可以放在lambda后面,不能用return返回的也不能定义在python lambda后面。因此,像if或for或print这种语句就不能用于lambda中,lambda一般只用来定义简单的函数。
  • lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
  • 由于可读性方面的考虑,应该避免使用嵌套lambda。
    • 直接调用
    • 普通函数所支持的参数的变化,匿名函数都支持的

二 两个内置函数BIF

1 filter()函数

  • 功能:filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。
  • 语法:newIter = filter(function, iterable)
  • 参数:
    • function:可传递一个用于判断的函数,也可以将该参数设置为 None。
    • iterable:可迭代对象,包括列表、元组、字典、集合、字符串等。
    • newIter:在 Python 2.x 中,该函数返回过滤后得到的新列表;而在 Python 3.x 中,该函数返回一个迭代器对象,可以用 list()、tuple() 等方法获取过滤后得到的新序列。
  • filter()和map一样,接收一个函数和一个序列。和map不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素

2 map()函数

  • 功能:map() 会根据提供的函数对指定序列做映射。第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
  • 语法:map(function, iterable, ...)
  • 参数:
    • function -- 函数
    • iterable -- 一个或多个序列
  • 返回值:
    • Python 2.x 返回列表。
    • Python 3.x 返回迭代器。
  • 应用:https://blog.csdn.net/yu_1628060739/article/details/102695207
    • map()函数可以做类型转换
    • map()函数可以格式化输入一行整数
    • map()函数可以把一个list,转换为另一个新的list,它并不改变原来的list
    • list可以包含任意的类型,因此map()函数可以处理任意类型的list,前提条件是f函数包含这种类型
    • map()函数可以并行的处理每一个list (list中的元素种类必须一致)
posted @ 2020-07-13 18:17  洛兰123  阅读(613)  评论(0编辑  收藏  举报