前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >零基础学习 Python 之函数对象

零基础学习 Python 之函数对象

作者头像
编程文青李狗蛋
发布2019-11-07 15:36:05
2520
发布2019-11-07 15:36:05
举报
写在之前

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

递归

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

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

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

代码语言:javascript
复制
>>> def fibs(n):
...     """this is fibonacci"""
...     if n == 0:
...             return 0
...     elif n == 1:
...             return 1
...     else:
...             return fibs(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 中默认类型的对象以引用的方式传入函数。

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

代码语言:javascript
复制
>>> def man():
...     print('I am a man()')
... 
>>> def woman(fun):
...     fun()
...

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

代码语言:javascript
复制
>>> woman(man)
I am a man()

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

写在最后

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python空间 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档