回复“资料”即可获赠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
领取专属 10元无门槛券
私享最新 技术干货