首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

零基础学习 Python 之函数对象

写在之前

我在前面的文章提过这么一个概念 「函数也是对象」,那么对于这种对象,是不是有什么特别的应用呢?下面就让我们从这个角度出发再次深入的探究函数。

递归

相信你在很多的地方看到过「递归」这个词,那么什么是递归呢?用最精简的定义来说就是 “递归,见递归”。

上面的那个描述可能有点难以理解,别慌,还有故事类型的定义:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事。故事是什么呢? “从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事。故事是什么呢? ‘从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事。故事是什么呢......’”

对于递归,最简单的例子之一就是斐波那契数列,虽然我们在前面的文章里已经写了一个实现的函数,但是在这里实现它,有更新的含义,根据斐波那契数列的定义,我们可以直接把它写成下面这样的递归函数:

>>>deffibs(n):

..."""this is fibonacci"""

...ifn ==:

...return

...elifn ==1:

...return1

...else:

...returnfibs(n-1) + fibs(n-2)

上面的 fibs(n-1) + fibs(n-2) 就是又调用了这个函数自己,实现了递归。为了更加明确一下递归的过程,下面我以 n = 3 为例走一个计算过程:

1.当 n = 3 时,fibs(3),走的是 return fibs(3-1) + fibs(3-2) 这个分支;

2.先看 fibs(3-1),即 fibs(2),也要走 else 分支,于是计算 fibs(2-1) + fibs(2-2);

3.fibs(2-1) 即 fibs(1),在函数中走 elif 分支,返回 1,即 fibs(2-1) = 1,同理可以得到 fib(2-2) = 0,直接将这两个值返回给上一步,得到的是 fibs(3-1) = 1+0 =1;

4.再计算 fibs(3-2),这就相对简单一点了,返回的值是 1,即 fibs(3-2) = 1;

5.最后计算第一步中的结果:fibs(3-1) + fibs(3-2) = 1 + 1 = 2,将计算结果 2 作为返回值,从而得到 fibs(3) = 2。

我们从上面的结果中可以看出,每个递归的过程都是向着最初的已知条件 f1 = 0,f1 = 1 的方向挺进一步,知道通过这个最初始的条件得到结果,然后再一层层的向上回馈计算结果。

递归是高级编程语言中很重要的思想方法,但是在使用的时候,我们先不说别的,至少在 Python 中,要慎重使用,因为在一般情况下,递归是能够被迭代或者循环替代的,而且效率比递归高的高,所以还是建议,递归虽帅气,但还是谨慎使用的好。

传递函数

对于函数的参数,我们在之前的文章里也做过一些研究,通过函数的参数,我们可以将数字,字符串,列表等之前学过的 Python 中默认类型的对象以引用的方式传入函数。

既然都是对象,那么函数对象的引用能不能作为参数传给函数呢?我们先来看一下下面的例子:

>>>defman():

...print('I am a man()')

...

>>>defwoman(fun):

...fun()

...

我们在上面定义了两个函数,man() 是我们熟悉的函数,而 woman() 有了些许的变化,它的参数要求是一个函数,否则函数体内的代码块无法执行 fun(),因为这种方式其实就是调用一个函数,所以我们必须用下面的方式来调用 woman() 函数:

>>> woman(man)

I am a man()

从上面的这个简单的例子中可以看出,一个函数对象(man)同样可以被参数(fun)以引用的方式传到函数体内。感兴趣的朋友们可以自己尝试写一些这样的函数来玩一下。

写在最后

今天先写这么两个,函数不仅可以作为对象传递,还可以在一个函数里进行另一个函数等,这些我都会在之后的文章中写到,我们争取每次的学习都有收获,不管大小,不枉你花时间看的每篇文章。

最后感谢你能看到这里,希望我写的东西能够让你有到收获,但是我还是希望我在文章里插入的代码,你们能自己动手试一下,都很简单。原创不易,每一个字,每一个标点都是自己手敲的,所以希望大家能多给点支持,该关注关注,该点赞点赞,该转发转发,有什么问题欢迎在后台联系我,也可以在公众号找到我的微信加我。

The end。

喜欢的请来一波关注

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券