(10)我们一起学Python;内嵌函数和闭包

内嵌函数(内部函数)顾名思义就是一个函数里边包含另外一个函数,Python

支持在一个函数里边定义另外一个函数,并且函数作用域只在 创建函数 内。

    >>> def pao1():
    ...     print('woshi pao1...')
    ...     def pao2():
    ...             print('woshi pao2...')
    ...     pao2()
    >>> pao1()
    woshi pao1...
    woshi pao2...

    >>> pao2()

函数式编程:闭包,即函数的函数

>>> def pao1(p1):
...     def pao2(p2):
...             print(p1*p2)
...     return pao2
...
>>> p3 = pao1(3)        #调用方法1
>>> p3(8)
24
>>> pao1(3)(8)            #调用方法2
24

内层函数无法对外层函数定义的变量进行修改(卧槽,我这个描述简直清晰到完美!):

错误示例:

>>> def pao1():
...     x = 5
...     def pao2():
...             x *=5
...             return x
...     return pao2()
...
>>> pao1()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in pao1
  File "<stdin>", line 4, in pao2    #不能对未进行定义的数据进行修改
UnboundLocalError: local variable 'x' referenced before assignment

因为容器类型(啥都可以往里边拾捯,话说我TM打这个 拾捯 废了一分钟)不存放在栈中,所以可以直接返回类型,如下所示:

>>> def pao1():
...     x = [5]
...     def pao2():
...             x[0] *= x[0]
...             return x[0]
...     return pao2()
...
>>> pao1()
25

扫描二维码关注公众号,回复: 1720050 查看本文章

Python3中的关键字:nonlocal    表示变量是非局部变量,即全局变量

>>> def pao1():
...     x = 7
...     def pao2():
...             nonlocal x    
...             x *= x
...             return x
...     return pao2()
...
>>> pao1()
49


猜你喜欢

转载自blog.csdn.net/weixin_34981646/article/details/80767022