Python编程思想(22):Lambda表达式

Stella981
• 阅读 627

李宁老师已经在「极客起源」 微信公众号推出《Python编程思想》电子书,囊括了Python的核心技术,以及Python的主要函数库的使用方法。读者可以在「极客起源」 公众号中输入 160442 开始学习。

--------------正文--------------

现在几乎所有的现代编程语言都支持lambda表达式,如果说函数是命名的、方便复用的代码块,那么 lambda表达式则是功能更灵活的代码块,它可以在程序中被传递和调用。

1.  先来回顾一下局部函数

在前面的文章已经介绍过了局部函数,现在让我们再回顾一下:

# 定义函数,该函数会返回局部函数的计算结果

由于局部函数的作用域默认仅停留在其封闭函数之内,因此这3个局部函数的函数名的作用太有限了,仅仅是在程序的if语句中作为返回值使用。一旦离开了multi_math_func函数体,这3个局部函数的函数名就失去了意义。既然局部函数的函数名没有太大的意义,那么就可以考虑使用 lambda表达式来简化局部函数的写法

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

如果使用 lambda表达式来简化上面的函数,则可以将程序改写成如下形式。

示例代码:lambda_test. py

# 定义函数,该函数会返回局部函数的计算结果

从这段代码可以看出,return后面的部分使用 lambda关键字定义的就是 lambda表达式,Python要求 lambda表达式只能是单行表达式。

由于 lambda表达式只能是单行表达式,所以不允许使用更复杂的函数形式,因此无法计算斐波那契数列,所以else子句中该成了计算平方的函数。

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

lambda [parameter1ist]:表达式

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

  • lambda表达式必须使用 lambda关键字定义;

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

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

lambda x, y: x+y

可改写为如下函数形式。

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

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

总体来说,函数比 lambda表达式的适应性更强, lambda表达式只能创建简单的函数对象。 但 lambda表达式依然有如下2个用途:

  • 对于单行函数,使用 lambda表达式可以省去定义函数的过程,让代码更加简洁;

  • 对于不需要多次复用的函数,使用 lambda表达式可以在用完之后立即释放,,提高了性能;

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

示例代码: lambda_map_test.py

# 传入计算平方的lambda表达式作为参数

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

往期回顾:

Python编程思想(18):哇!原来Python参数还可以这样用

Python编程思想(19):可变参数也可以这样玩

Python编程思想(20):变量作用域

Python编程思想(21):原来函数内部还可以定义函数(局部函数)

-----------------转发朋友圈,是对我最大的支持---------------------

喜欢作者的文章,请扫描关注  极客起源 公众号

Python编程思想(22):Lambda表达式

本文分享自微信公众号 - 极客起源(geekculture)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这