python小课堂28_python小课堂28
前言
嗨!大家好哇,一星期没见了,后台收到朋友的留言以为我停更了....哇哈哈哈时间永远留不住,在春节期间,拥有这么多空闲时间的你,有木有好好充电呢?让我们继续回归python小课堂之路,本章为进阶篇,介绍的是匿名函数与高阶函数。
匿名函数之 lambda 表达式
见名知意,所谓的匿名函数就是没有名字的函数。我们平时所写的函数都是带有名字和参数的,并且有返回值,而匿名函数的写法却非常简洁,对于初学者而言,代码的阅读性可能会较差一些,但是多加实践,看习惯了之后就能明白所谓的lambda表达式是什么意思了!接下来还是用示例说话,场景是这样的:有个函数,传入两个参数a和b,在函数内部将他们做差,并将结果返回。
示例1 - 普通函数:
示例2 - 匿名函数:
解释一下上面的案例,使用 python 中的 lambda 关键词来定义匿名函数,参数在冒号前面,表达式在冒号后面,将整个 lambda 表达式赋予一个变量sub,通过调用sub传入参数得到结果result,与普通函数得到一致的结果。
匿名函数的写法,通过关键词 lambda 来表示匿名,基于数学中的λ演算得名。lambda表达式完整的写法公式如下:
什么意思呢?通过 lambda 后面跟上传入的参数,加上冒号,以及冒号后面的表达式组成了匿名函数,注意:冒号后面一定要是表达式!
表达式意味着,如果我们写成赋值语句或者for循环语句等非表达式语句,那么 lambda 表达式则会报错!如下:
所以由此引出了匿名函数 lambda 中常用的三元表达式。
示例3 - Python的三元表达式:
假设现在有两个变量,a = 1,b = 2,请使用一行代码来判断 a 小于 b ,若 a 小于 b 为真,则将 a 的值返回。
result 这一行就是所谓的 Python 中的三元表达式,用中文描述一下就是:
高阶函数
高阶函数,Python中自带了一些高阶特性的函数,在某些特定场景下非常实用,这里举几个常用的,当然也会结合具体场景去说,毕竟要结合使用不能滥用!
1. map 函数
map 函数,map中文意思是地图的意思,但是在程序中代表映射的意思。高中学过的映射,不知大家是否还记得!跟那个意思差不多。。。
场景如下:现在有一个 list_a ,它其中的包含着 1~6 的数字,请将此集合中的数字都乘以 2 ,最终得到的结果组成一个新的 list_b。
不使用 map ,你会怎么做呢?思考一下,然后再看下面的答案:
通过 for 循环取出 list 每个值,在对其调用乘2的函数,最后将结果进行拼接,得到 list_b 。
使用 map 函数之前,先了解下 map 函数语法:
map(function, iterable, ...)
map() 会根据提供的函数对指定序列做映射。 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
可以看到,素质三连print!得到的结果,map返回的结果是一个 map 对象,而它本身的类型就是 map,将其转化为 list,可以得到与不用 map 函数时的一样结果!
实际上,如果会活学活用的话,还可以将上述代码进行缩减,用我们刚学过的 lambda 表达式来完成!
将普通函数注释掉,使用匿名函数来完成,实际上就3行代码即可完成,如下:
如果有多个参数作为匿名函数的入参如何写呢?
可以使用 pycharm 自带的源码查看功能,查看 map 函数的定义,按住 Ctrl 点击 map 即可:
map 第一个参数传入函数名称,第二个传入的是一个可以迭代的对象,例如list,而用红框标出来的其中包括了一个 * 号,在Python中参数前面跟一个星号代表多个形参的意思。所以我们可以写法如下,当有两个相同 list 时,多次传入 map 函数中即可:
现在是相同的个数的 list ,如果要是不同个数内容的 list 会如何?做个实验,将 list_b 的个数改为 10 个观察下:
可以看到,即使两个不同内容的list进行map计算,最终结果也会根据内容少的list得到最终结果,也就是只进行前6位的计算。
2. reduce 函数
reduce 函数不能直接进行引用,在 Python3 中,reduce() 函数已经被从全局命名空间里移除了,它现在被放置在 functools 模块里,如果想要使用它,则需要通过引入 functools 模块来调用 reduce() 函数,还是先来看下 reduce 函数的语法使用:
reduce(function, iterable[, initializer])
function -- 函数,有两个参数
iterable -- 可迭代对象
initializer -- 可选,初始参数
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
老规矩,点进去看源码,其中有官方的文档注释:
咱们就用它注释中的例子来实践一下,作为 reduce 的第一个函数,入参必须是两个参数,否则会报错,例如下面:
改成官方例子:
素质二连,print出结果,可以看到这次与 map 函数不同,返回的结果是一个计算后的整数 15 !这个 reduce 函数是怎么算出来的呢?仔细看过注释的同学一定知道怎么来的了,实际上就是这样来的:
第一次计算时,x = 1,y = 2,于是将 1 + 2 = 3 的结果作为下一次调用时入参的x,而第二次计算时的 y 则是列表中的数字3 ......以此类推。
(1+2) --> ((1+2)+3) --> .... --> ((((1+2)+3)+4)+5)
reduce 函数是一个连续计算的函数!
再来看下 reduce 函数的第三个参数,初始化第一个入参值:
这个计算的顺序则是第一次 x = 10,y = 1,将 x+y 的值 11 赋予第二次计算的 x 作为入参,第二次计算时的 y = 2,第二次计算结果等于 11 + 2 = 13 .... 以此类推。
(10+1) --> (10+1)+2) --> ((10+1)+2)+3) .... --> ((((10+1)+2)+3)+4)+5)
3. filter 函数
filter 函数,这个英文单词的中文含义是过滤的意思。依然是看下官方语法:
filter(function, iterable)
function -- 判断函数。
iterable -- 可迭代对象。
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
示例,请将下面的 list 中为小写字母的字符串提取出来,生成一个新的列表:
思考一下再看答案哟:
结果如上图,通过字符串的自带函数,islower() 可以判断字符串是否是小写字母,若是小写字母则返回一个 True ,可以看到笔者的 lambda 表达式用了一个三元表达式的写法,来过滤掉了原列表的大写字母,是不是很简洁呢!毕竟人生苦短,我用Python啊!
map - reduce 扩展知识
map / reduce 实际上是大数据中的一个编程模型,其中 map 代表映射的意思,reduce 代表归约的意思,而这个模型主要是用来进行并行计算的!可以用一张图来看生动的看下 hadoop (Hadoop是一个由Apache基金会所开发的分布式系统基础架构。)中的 map / reduce:
做三明治,用到了各种蔬菜,首先我们先将每个蔬菜切碎,通过map 映射成碎片,在使用 reduce 进行并行计算使之合体!
总结
说一些学习上的技巧,对于一个新的函数,首先学习看它的语法,第一时间可以去找官方文档看,比如点进去看它的官方注释,如果英文看不懂的话呢,可以去菜鸟教程上搜下,上面也是有不少官方文档的定义,都是中文教程。写到现在,大部分Python小课堂上的小实例都是非常简单的,入门与进阶通俗易懂,但是不要小瞧这些小 demo ,如果你真的把它们都弄明白了,就像前期种下一颗种子一样,稳定根基之后必将作为长成参天大树的必要前提!
著作权归作者所有
python小课堂28_python小课堂28相关推荐
- 计算机毕业设计Python+uniapp学生课堂考勤小程序(小程序+源码+LW)
计算机毕业设计Python+uniapp学生课堂考勤小程序(小程序+源码+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区版+ pyth ...
- 计算机毕业设计Java课堂管理系统小程序用户端(源码+mysql数据库+系统+lw文档)
计算机毕业设计Java课堂管理系统小程序用户端(源码+mysql数据库+系统+lw文档) 计算机毕业设计Java课堂管理系统小程序用户端(源码+mysql数据库+系统+lw文档) 本源码技术栈: 项目 ...
- 计算机毕业设计JAVA课堂管理系统小程序用户端mybatis+源码+调试部署+系统+数据库+lw
计算机毕业设计JAVA课堂管理系统小程序用户端mybatis+源码+调试部署+系统+数据库+lw 计算机毕业设计JAVA课堂管理系统小程序用户端mybatis+源码+调试部署+系统+数据库+lw 本源 ...
- 十一课堂|通过小游戏学习Ethereum DApps编程(5)
2019独角兽企业重金招聘Python工程师标准>>> 1 ERC721 tokens 在这个游戏里面,我们使用ERC721 tokens标准,通常的情况下,使用的是ERC20 to ...
- 小课堂?小视频?小商店?
今天,没有什么特别内容可更新,就来随便聊聊吧. 01 雄雄的小课堂 这是一个公众号,内容主要有两大类. 一类是以分享编程技术为主,一方面是为了提升自己,另一方面也是为了帮助别人,希望阅者有益,平时也会 ...
- 精品微信小程序校园第二课堂在线学习网+后台系统|前后分离VUE
<微信小程序校园第二课堂+后台管理系统|前后分离VUE>该项目含有源码.论文等资料.配套开发软件.软件安装教程.项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统,该后台采 ...
- 小L的算法课堂——博弈论
嗨!这里是小L的算法课堂!我是小L 今天我们学习一下博弈论 我们先来讲一个故事: 小L和小Z喜欢玩石头剪刀布. 小L总是打不过小Z赢,于是,小L问小Z:"你是怎么赢我的?" 小Z告 ...
- 小甲鱼python课后习题【26,27,28,29,30】
[学习笔记,仅供学习交流使用,知识源于鱼c论坛] 作业26: 测试题: 0.python的字典是否支持一键多值? 不支持,对相同的键再次赋值直接覆盖 >>> dict2 = {1 ...
- java计算机毕业设计ssm学生课堂考勤小程序947n4(附源码、数据库)
java计算机毕业设计ssm学生课堂考勤小程序947n4(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ ...
最新文章
- ctf图片隐写之修改图片高度
- idea 这么还原debug_看源码,我为什么推荐IDEA ?
- 国外学python的软件_全球开发者调查报告:IT人最想学习 Go 和 Python、美国开发者收入最高...
- 基于jquery的上传插件Uploadify 3.1.1在MVC3中的使用
- mysql7.5安装教程_CentOS7.5下yum安装MySQL8图文教程
- 一点一滴岗位测试答案_心理测试:凭直觉,选你最喜欢的一件睡衣,测你的野心是什么级别...
- nfs挂载出错:mount.nfs: access denied by server while mounting
- 基于XAMPP的Testlink安装方法
- c# json转换实例
- jQuery动态网址标签
- 常用的一些集合工具类
- 笔记:《深入浅出统计学》第十三章:假设检验(显著性检验)
- 支持向量机(Vladimir Vapnik)
- 【问】SQL 2008安装一直提示重启计算机失败
- 呼吸系统疾病病人的护理题库【2】
- 如何设置普通网页的微信分享图标
- VS Code 安装和配置 ESLint
- 网络效应VS平台效应,如何选择主要价值引擎?
- 字符串 转16进制 sscanf
- AssertJ使用教程(一)
热门文章
- web前端html怎么求最大值和最小值,求js数组的最大值和最小值的四种方法
- Arduino 控制RFID读写器读写 IC卡
- Vue ElementUI el-scrollbar 嵌套 el-tree 出现横向纵向滚动条
- 两圆的外切线与内切线的切点算法
- elasticsearch-8.0.0报错总结(ES)-持续更新
- 中国浓缩咖啡机行业市场供需与战略研究报告
- 顶刊实证复现:排污权交易机制是否提高了企业全要素生产率 (思路梳理+全数据源+python代码)
- React Hooks 详解
- Javascript判断是否是ipad的浏览器
- 设备管理---要点练习及总结