python学习笔记之函数作为返回值

回复“资料”即可获赠Python相关电子资料

最近,小编在学习廖雪峰老师的官方网站上的python教程(2.7版本),以下是其网站的详细链接

(https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000)

前面相对来说都还凑合,虽然有些细节的地方依然不是很明白,但是大概的思路觉得还是理解的,但是小编看到函数作为返回值这一块儿的时候,整体感觉有点懵,于是又看了一遍,觉得有必要认真做个学习笔记,记录自己在学习过程中的所得所惑,和大家一起分享。

文章中提到“如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回求和的结果,而是返回求和的函数!”这句话前面的都还好理解,到这句话的时候小编开始觉得有点难了,这样的应用场景我目前还想象不到,不返回求和的结果而是返回求和的函数干嘛呢?什么地方可以用的到呢?一脸懵逼啊~好吧,暂且先不管到底什么时候什么场合可以用的到,就本着纯粹学知识的心态继续往下看吧,希望之后的例子可以给我一点启发什么的。

这个小例子的实现不是很难,把代码敲到python的交互式命令行中应该就可以了,紧接着看看实验结果,调用lazy_sum()时,确实如同教程中说的那样,返回的并不是求和结果,而是求和函数

13579

functionsumatx10452f668>

调用函数f时,才真正计算求和的结果:

25

实验结果可以和教程中一样完美呈现,但是我还是不懂啊~

后面又接着写道:“在这个例子中,我们在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。”

截止到目前,让我好好理理思路,理解一下:首先,定义了两个函数,一个是lazy_sum,一个是sum,两个函数的关系是嵌套的关系,我从外观上看哈,一个在外面,一个在里面,lazy_sum包裹着sum,后面这句话读起来就有点难以理解了“内部函数sum可以引用外部函数lazy_sum的参数和局部变量”,什么意思?不直观,不具体,不形象啊~内、外函数都搞清楚了,分别是sum,lazy_sum,那么外部函数的参数和局部变量又是什么了?我想只有把这些指代搞清楚,我们才能继续读下去。外部函数(lazy_sum)的参数,args,前面加个*在前几节中我们已经知道*加在参数前代表的是可变参数。因为这个例子比较简单,所以外部函数的局部变量倒是没看到,外部函数直接下来就是内部函数了,但是似乎明白了一点点,反正就是外部函数(lazy_sum)的定义的参数(args)和变量内部函数(sum)可以直接使用,感觉有点继承的思想在里面~

小编好事,又实验了几把,结果如下:

坦白说,我觉得这个有点像父类啊,子类什么的~

但是这样做的意义是什么呢?好处是什么呢?

感觉多了一层包装,调用反而比较麻烦

而且这个例子中只有外层函数需要传入参数,内层函数并没有要求传入函数,如果内层函数也要传入函数呢?这又会是一个什么样子的呢?

对于“当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力”这句话的理解也是一知半解的感觉,相关参数和变量指的是args,返回的函数是指sum,也就是说args保存在sum中,至少字面上是这么看的。当我们调用lazy_sum()时,每次调用都会返回一个新的函数,即使传入相同的参数:

False

f1()和f2()的调用结果互不影响。

尽管例子可以实现,但是理解似乎并没有太多的深入。

对于一个普通函数来说,这里指的是返回的结果是一个值而不是一个函数对象的话,传入相同的参数,两个值是等同的。

从函数返回值为函数和普通数值之间的对比可以看出,返回值为普通数值的函数传入相同的参数,因为数值对象一样,只是指向该对象的变量名不一样而已,而返回值为函数的函数传入相同的参数,因为返回的是函数对象,因为即便传入相同的参数,返回的函数对象也不是同一个,所以变量名指向不同对象,他们的值也就不相同了,体会倒是更深一点了。

看完本文有收获?请转发分享给更多的人

AmazingFighter

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180519A13YI500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券