零基础学习 Python 之函数对象

写在之前

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

递归

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

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

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

>>> 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 中默认类型的对象以引用的方式传入函数。

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

>>> def man():
...    print('I am a man()')
... 
>>> def woman(fun):
...     fun()
...

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

>>> woman(man)
I am a man()

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

写在最后

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

更多内容,欢迎关注公众号「Python空间」,期待和你的交流。
在这里插入图片描述

发布了608 篇原创文章 · 获赞 5798 · 访问量 82万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 酷酷鲨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览