专栏首页Python空间零基础学习 Python 之嵌套函数

零基础学习 Python 之嵌套函数

写在之前

我在几天以前的文章中(零基础学习 Python 之函数对象)说过,函数不单单可以作为对象来传递,还可以在一个函数里面嵌套一个函数,这个就是我们今天要讲的嵌套函数。

嵌套函数

首先我们来看一个例子:

>>> def my_name():
...     def your_name():
...             print('your_name() is two dog')
...     print('my_name() is rocky')
...

上面就是一个简单的嵌套函数的例子,在上面的代码中,在函数 my_name() 中定义了函数 your_name(),而 your_name() 就称为 my_name() 的内嵌函数,因为它是在 my_name() 里面的定义。

然后我们来调用 my_name(),会得到下面的结果:

>>> my_name()
my_name() is rocky

这个结果说明在上面的调用方式和内嵌函数的写法中,your_name() 这个函数根本没被调用,或者我们可以这么说,那就是 my_name() 没有按照从上到下的顺序依次执行其里面的代码。

那么我想要 your_name() 这个内嵌函数也执行,该怎么做呢?其实在 my_name() 里面显示的调用一下 your_name() 函数就好了,请看下面的代码:

>>> def my_name():
...     def your_name():
...             print('your_name() is two dog')
...     your_name() #显示的调用内嵌函数
...     print('my_name() is rocky')
...

我们现在来调用 my_name(),运行结果如下:

>>> my_name()
your_name() is two dog
my_name() is rocky

现在我们再来思考一个问题,我们能不能在 my_name() 外面单独的调用其内嵌函数 your_name() 呢?我们来试一下:

>> your_name()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'your_name' is not defined

结果会显示错误信息,这说明这样调用是不行的,原因就是 your_name() 是定义在 my_name() 里面的函数,它生效的范围仅限于 my_name() 函数体之内,也就是说它的作用域就是 my_name() 的范围而已,既然是这样,那么 your_name 在使用变量的时候也就会收到 my_name() 的约束。

我们再来看一个例子:

>>> def fun1():
...     a = 1
...     def fun2():
...             a += 1
...             print('fun2 -- a = ',a)
...     fun2()
...     print('fun1 -- a = ',a)
...

在看下面的结果之前,请你想一想这个函数的结果会是什么?加入你思考完毕,请看下面的结果:

>>> fun1()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in fun1
  File "<stdin>", line 4, in fun2
UnboundLocalError: local variable 'a' referenced before assignment

你猜对了么?结果是运行错误!我们观察报错的信息,原因是 fun2() 里面使用了 fun1() 的变量 a,按照表达式, Python 解释器认为这个变量应该在 fun2() 中建立,而不是引用 fun1() 中的变量,所以才报错。

在 Python 中,我们可以使用 nonlocal 这个关键词,具体操作见下例:

>>> def fun1():
...     a = 1
...     def fun2():
...    nonlocal a
...             a += 1
...             print('fun2 -- a = ',a)
...     fun2()
...     print('fun1 -- a = ',a)
...

然后我们调用 fun1() 函数,得到如下结果:

fun2 -- a = 2
fun1 -- a = 2

综上所述就是嵌套函数的原理,剩下的就是在实践中去运用它,达到加深理解的目的。

写在之后

今天讲嵌套函数一是为了学习一个新的知识点,其实更重要的是为了明天的文章要讲的「闭包」作准备,因为这个嵌套函数,其实可以制作动态的函数对象,而这个话题延伸下去,就是所谓的「闭包」,敬请期待。

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

本文分享自微信公众号 - Python空间(Devtogether)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python的super()的作用和原理

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    菲宇
  • jieba分词器详解及python实战

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    菲宇
  • BERT 是如何分词的

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    Alan Lee
  • Python进阶之Matplotlib入门(三)

    Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技...

    HuangWeiAI
  • Python Django使用HttpResponse返回图片并显示

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    菲宇
  • Python进阶之Matplotlib入门(二)

    Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技...

    HuangWeiAI
  • Jenkins+Ansible+GitLab持续交付平台搭建-第3篇

    遇到错误:configure: error: no acceptable C compiler found in $PATH

    Criss@陈磊
  • Python操作MongoDB

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    菲宇
  • 史上最全 | 数据分析技能详细拆解,一张图覆盖全流程知识细节和资源推荐(附下载)

    而基于这些数据的分析,可以挖掘到非常多有价值的信息,这些信息正在成为大多数企业业务增长、迭代更新的关键。

    数据派THU
  • 奔走相告,Python 3.8.0 正式发布!

    那么,这次新发布的 Python 3.8.0 有哪些重要的改进呢?以下是是 Python 3.8 相比 3.7 的新增特性。

    小草AI

扫码关注云+社区

领取腾讯云代金券