lambda 表达式是现代编程语言争相引入的一种语法,如果说函数是命名的、方便复用的代码块,那么 lambda 表达式则是功能更灵活的代码块,它可以在程序中被传递和调用。

回顾局部函数

回顾《Python函数高级用法》一节中,get_math_func() 函数将返回三个局部函数之一。该函数代码如下:

def get_math_func(type) :
    # 定义三个局部函数
    …
    # 返回局部函数
    if type == "square" :
        return square
    if type == "cube" :
        return cube
    else:
        return factorial

由于局部函数的作用域默认仅停留在其封闭函数之内,因此这三个局部函数的函数名的作用太有限了,即仅仅是在程序的 if 语句中作为返回值使用。一旦离开了 get_math_func() 函数体,这三个局部函数的函数名就失去了意义。

既然局部函数的函数名没有太大的意义,那么就考虑使用 lambda 表达式来简化局部函数的写法。

使用 lambda 表达式代替局部函数

如果使用 lambda 表达式来简化 get_math_func() 函数,则可以将程序改写成如下形式:

  def get_math_func(type) :      result=1      # 该函数返回的是Lambda表达式      if type == 'square':          return lambda n: n * n  # ①      elif type == 'cube':          return lambda n: n * n * n  # ②      else:          return lambda n: (1 + n) * n / 2 # ③  # 调用get_math_func(),程序返回一个嵌套函数  math_func = get_math_func("cube")  print(math_func(5)) # 输出125  math_func = get_math_func("square")  print(math_func(5)) # 输出25  math_func = get_math_func("other")  print(math_func(5)) # 输出15.0

在上面代码中,return 后面的部分使用 lambda 关键字定义的就是 lambda 表达式,Python 要求 lambda 表达式只能是单行表达式。

注意:由于 lambda 表达式只能是单行表达式,不允许使用更复杂的函数形式,因此上面 ③ 号代码处改为计算 1+2+3+…+n 的总和。

lambda 表达式的语法格式如下:

lambda [parameter_list] : 表达式

从上面的语法格式可以看出 lambda 表达式的几个要点:

  • lambda 表达式必须使用 lambda 关键字定义。
  • 在 lambda 关键字之后、冒号左边的是参数列表,可以没有参数,也可以有多个参数。如果有多个参数,则需要用逗号隔开,冒号右边是该 lambda 表达式的返回值。

实际上,lambda 表达式的本质就是匿名的、单行函数体的函数。因此,lambda 表达式可以写成函数的形式。例如,对于如下 lambda 表达式:

lambda x , y:x + y

可改写为如下函数形式:

def add(x, y): return x+ y

上面定义函数时使用了简化语法:当函数体只有一行代码时,可以直接把函数体的代码放在与函数头同一行。

总体来说,函数比 lambda 表达式的适应性更强,lambda 表达式只能创建简单的函数对象(它只适合函数体为单行的情形)。但 lambda 表达式依然有如下两个用途:

  • 对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁。
  • 对于不需要多次复用的函数,使用 lambda 表达式可以在用完之后立即释放,提高了性能。

下面代码示范了通过 lambda 表达式来调用 Python 内置的 map() 函数:

  # 传入计算平方的lambda表达式作为参数  x = map(lambda x: x*x , range(8))  print([e for e in x]) # [0, 1, 4, 9, 16, 25, 36, 49]  # 传入计算平方的lambda表达式作为参数  y = map(lambda x: x*x if x % 2 == 0 else 0, range(8))  print([e for e in y]) # [0, 0, 4, 0, 16, 0, 36, 0]

正如从上面代码所看到的,内置的 map() 函数的第一个参数需要传入函数,此处传入了函数的简化形式:lambda 表达式,这样程序更加简洁,而且性能更好。

总结

本节所介绍的 lambda 表达式是 Python 编程的核心机制之一。Python 语言既支持面向过程编程,也支持面向对象编程。而 lambda 表达式是 Python 面向过程编程的语法基础,因此读者必须引起重视。

Python 的 lambda 表达式只是单行函数的简化版本,因此 lambda 表达式的功能比较简单。

推荐学习目录:Python项目实战之绕圈圈面试题

Python lambda表达式及用法相关推荐

  1. python -lambda表达式的用法

    匿名函数 lambda的意义: 利用lambda我们可以速写函数,不用去定义函数就可以直接使用 y = lambda x,z:5+9*x+8*z print(y(2,4)) 从例子中可以看到,lamb ...

  2. python lambda表达式及用法_Python:lambda表达式和yield关键字理解与使用讲解

    一.lambda表达式 1.1.lambda表达式理解 lambda的主体是一个表达式,而不是一个代码块,仅仅能在lambda表达式中封装有限的逻辑进去.如果要通俗的理解lambda表达式,可以结合C ...

  3. python lambda表达式及用法_python lambda表达式简单用法

    条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即: # 普通条件语句 if 1 == 1: name = 'wupeiqi' else: name = 'alex' # 三元运 ...

  4. Python lambda表达式用法

    python lambda表达式简单用法 lambda表达式简单用法 lambda是什么? lambda表达式在sort函数中的使用 内置函数 lambda是什么? 看个例子: g = lambda ...

  5. python lambda表达式的使用方法(匿名函数)

    文章目录 lambda函数简介 示例1:将存有文件名的字符串列表,运用正则表达式方法提取文件名中的数字,按照数字大小将文件名字符串列表重新排序 示例2:将存有hsv颜色空间的颜色元组列表,转换成rgb ...

  6. 细说Python Lambda函数的用法,建议收藏!

    本文分享自华为云社区<从零开始学python | 什么是Lambda函数以及如何使用它们?>,原文作者:Yuchuan . 名称是用于引用或寻址任何实体的约定.我们周围的几乎所有事物都有名 ...

  7. Python Lambda 的简单用法

    下面代码简单举例介绍以下 lambda的用法. from functools import reduce#1 python lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def ...

  8. Python——lambda函数基本用法

    一.lambda 语法 lambda 函数的语法只包含一个语句,表现形式如下: lambda [arg1 [,arg2,.....argn]]:expression 其中,lambda 是 Pytho ...

  9. LeetCode 905 Sort Array By Parity--Java stream,Python lambda表达式一行 解法

    题目地址:Sort Array By Parity - LeetCode Given an array A of non-negative integers, return an array cons ...

最新文章

  1. mac 搭建php wamp,Linux,Windows,Mac平台php环境配置
  2. NB-IOT环境监测项目需求分析
  3. laravel翻看php日志,关于Laravel的日志用法
  4. 软件测试作业7:构建弱健壮的等价类测试用例
  5. SAP Spartacus Unit List树形数据的加载触发时机
  6. while(true) 循环中使用了sleep休眠了半小时就中断了_线程中断不是你想中断就能的...
  7. 深度学习在美团的应用
  8. 利用物联网技术为市民打造“无忧”生活
  9. 我居然帮初恋用Python去追她男神,这波舔狗真的坐实了啊~
  10. 教您如何在MathType中输入空白区域
  11. java cdt_Eclipse代码提示功能设置(Java Eclipse+CDT C/C++)
  12. c语言linux系统宏,Linux下C语言中的预定义宏
  13. china area part 1
  14. modules node 太大了_解决node_modules文件名太长无法删除的两个方法-文件名太长
  15. vue 日历签到组件
  16. 科力信息:智能交通“新基建”借CRM搭乘数字化快车
  17. java 面试概念题 笔记
  18. 计算机符号系统c,附录c符号计算系统mathematica的.doc
  19. K8S之nfs持久化存储
  20. android 生成多个表单,Android根据word模板文档将表单数据生成word文档的方案整理...

热门文章

  1. rsync运行时出现skipping non-regular file
  2. Apollo决策技术分享20190328
  3. 估计标准误差syx_相关系数与估计标准误差的关系
  4. html生成真正的空图片代码 用canvas和script生成无实质性的空白图像 比图像透明处理还要牛 那种空白透明头像就是这么做出来的
  5. Linux 下的用户、用户组、文件权限设置
  6. 2D骨骼动画工具DragonBones的使用教程
  7. java什么时候触发gc_什么时候触发 GC
  8. 基于51单片机的故障灯检测
  9. 零基础如何学习单片机,一位入门者的进阶路径,可参考
  10. 制作JavaCV应用依赖的基础Docker镜像(CentOS7+JDK8+OpenCV4)