事件循环机制:JavaScript被设计为单线程,那如何做到异步的呢?
简介 返回函数,所谓返回函数,顾名思义,就是把函数作为返回值。高阶函数除了可以将函数作为参数之外,还可以将函数作为结果进行返回。
<p class="f_center" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: center; line-height: 20px; color: #666666; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif;"><img style="box-sizing: inherit; border: 0px; margin-bottom: 10px;" src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2022%2F0707%2F1afb37d6j00remmok0037c000xc00imm.jpg&thumbnail=660x2147483647&quality=80&type=jpg" /><br style="box-sizing: inherit;" /><br style="box-sizing: inherit;" /></p>
<p id="10L168H1" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">返回函数</p>
<p id="10L168H2" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">所谓返回函数,顾名思义,就是把函数作为返回值。高阶函数除了可以将函数作为参数之外,还可以将函数作为结果进行返回。下面来实现一个可变参数的连乘,求积函数可定义为:</p>
<p id="10L168H3" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">def calc_fac(*args):<br style="box-sizing: inherit;" />fx = 0<br style="box-sizing: inherit;" />for n in args:<br style="box-sizing: inherit;" />fx = fx * n<br style="box-sizing: inherit;" />return fx</p>
<p id="10L168H4" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">很多时候当求积函数定义好后我们并不需要立即求积,而是会根据后面的计算再行调用。这时,我们就可以先不返回函数的结果,而是将函数本身返回,如下可见:</p>
<p id="10L168H5" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">def lazy_fac(*args):<br style="box-sizing: inherit;" />def fac():<br style="box-sizing: inherit;" />fx = 0<br style="box-sizing: inherit;" />for n in args:<br style="box-sizing: inherit;" />fx = fx * n<br style="box-sizing: inherit;" />return fx<br style="box-sizing: inherit;" />return fac</p>
<p id="10L168H6" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">重新定义求积函数后,当我们调用lazy_fac()时,返回的就不是求积的结果啦,而是求积函数:</p>
<p id="10L168H7" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">>>> a=lazy_fac(1,2,3,4)<br style="box-sizing: inherit;" />>>> a</p>
<p id="10L168H8" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">.fac at 0x002a5dr42></p>
<p id="10L168H9" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">而当调用函数 a 时,求积过程才被执行:</p>
<p id="10L168HA" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">>>> a()<br style="box-sizing: inherit;" />24</p>
<p id="10L168HB" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">此例中,我们在函数lazy_fac中又定义了函数fac,fac可称做内部函数,而lazy_fac为外部函数。内部函数fac可以引用外部函数的的参数和局部变量。参数和变量都保存在我们最后返回的内部函数fac中。这种程序结构在Python上我们称之为闭包。</p>
<p id="10L168HC" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">在闭包结构中,函数作为结果返回时,函数过程并没有被立刻执行,而是等我们调用 a( )后才执行。</p>
<p id="10L168HD" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">总之,在函数式编程里,函数除了可以返回一个计算结果之外,也可以返回一个未执行的函数。当返回函数时,始终牢记该函数并未被执行,返回函数中尽量不要引入循环变量等可能引起变化的变量。</p>
<p id="10L168HE" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">匿名函数</p>
<p id="10L168HF" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">当我们在传入函数时或者代码结构过于复杂时,我们可以通过匿名函数来代替显式的函数定义。此时,匿名函数会大大简化代码结构,可以使之更为精炼。</p>
<p id="10L168HG" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">以之前介绍的 map 函数为例来计算 x3 看看匿名函数的功能:</p>
<p id="10L168HH" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">>>> list(map(lambda x: x * x * x, [1, 2, 3]))<br style="box-sizing: inherit;" />[1, 8, 27]</p>
<p id="10L168HI" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">对比可以看出,匿名函数lambda x : x*x*x 就相当于:</p>
<p id="10L168HJ" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">def f(x):<br style="box-sizing: inherit;" />return x * x * x</p>
<p id="10L168HK" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">lambda作为匿名函数的关键字,冒号前面的 x 表示匿名函数的参数。匿名函数只能有一个表达式,无需像定义函数那样写 return。因为匿名函数没有函数名,在使用过程中就不需要担心函数名的冲突。匿名函数作为一个函数对象,也符合向变量进行赋值的规则:</p>
<p id="10L168HL" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">>>> fx = lambda x: x * x * x<br style="box-sizing: inherit;" />>>> fx</p>
<p id="10L168HM" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">at 0x101c6ef28><br style="box-sizing: inherit;" />>>> f(4)<br style="box-sizing: inherit;" />64</p>
<p id="10L168HN" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">同样,匿名函数作为一个函数也可以被被当成返回函数:</p>
<p id="10L168HO" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">def f(x):<br style="box-sizing: inherit;" />return lambda: x * x * x</p>
<p id="10L168HP" style="box-sizing: inherit; margin-top: 34px; margin-bottom: 34px; text-align: justify; color: #404040; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif; font-size: 18px;">来源: Python编程学习圈</p>
分享到:
转载:
https://www.163.com/dy/article/HBLOLNVK05313LFD.html
喜欢 1
收藏
暂无评论信息
- 相关文章
- 文章推荐
-
半导体短缺即将结束?分析师:如果没有 1 美元芯片会影响更多
德勤咨询(Deloitte Consulting)的芯片分析师认为,随着芯片行业资本支出的增加,需求度较高的工厂已经开工,预示着短缺情况即将结束。
-
淘宝 NPM 镜像站喊你切换新域名啦
淘宝 NPM 镜像站(npm.taobao.org)自 2014 年 正式对外服务,一开始只是想简单地做 NPM 的中国镜像站点,回馈国内前端社区,不知不觉竟然一直运行到现在。当年参考 Ruby Gems 淘宝镜像 的方式,跟阿里开源组织申请了 taobao.org 的二级域名,镜像站点名称也自然而然地取名为 淘宝 NPM 镜像站 (下称 CNPM)。
-
HTML 面试知识点总结
本部分主要是笔者在复习 HTML 相关知识和一些相关面试题时所做的笔记,如果出现错误,希望大家指出!
-
Node 配置sequelize + mysql,根据模型自动创建数据库表
研究了一下午的node + sequelize + mysql。
- 点击排行
- 站长推荐
- 猜你喜欢
- 网站信息
- 站内问答:12篇
- 站内文章:213篇
- 建站时间:已运行1258天
- 备案号: 浙ICP备2022018799号
- 语言:
- English(USA)
- French(FR)
- Chinese(ZH)
无数据