Python:函数3——内嵌函数和闭包

来源:互联网 发布:玖玖爱六粮面淘宝 编辑:程序博客网 时间:2024/06/03 21:11

一、内嵌函数

在函数内部创建另一个函数,也叫作内部函数。

>>> def func1():...     print("func1() ing....")...     def func2():...             print("func2 ing...")...     func2()... >>> func1()func1() ing....func2 ing...

注意:内部函数的整个作用域都在外部函数之内!即上边的函数中,只可以在func1内调用func2,不能再func1的外边调用func2,因为看不到!尤其是:x *= x

在内部函数的变量相对于外部函数的关系,相当于局部变量和全局变量的关系,内部函数中只能对外部函数的变量进行访问,但不能对他修改。解决办法:

>>> def func1():...     x = 5...     def func2():...             x *= x...             return x...     return func2()... >>> func1()Traceback (most recent call last):  File "<stdin>", line 1, in <module>  File "<stdin>", line 6, in func1  File "<stdin>", line 4, in func2UnboundLocalError: local variable 'x' referenced before assignment#未定以前不能引用

python3之前通过容器(因为容器类型不是全放在函数的栈里边,所以不会被屏蔽调):

>>> def func1():...     x = [5]...     def func2():...             x[0] *= x[0]...             return x[0]...     return func2()... >>> func1()25

python3之后:有了nonlocal关键字

>>> def func1():...     x = [5]...     def func2():...             nonlocal x     ...             x *= x...             return x[0]...     return func2()... >>> func1()25

二、闭包

闭包是函数式编程的一个重要的语法结构。是一种编程方式(面向对象、面向过程)。不同的编程语言实现闭包的方式不同,python如下:

(表现形式上)如果在一个内部函数里对外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包

>>> def funcX(x):...     def funcY(y):...             return x*y...     return funcY#因为所有东西都是对象,所以可以把函数对象funcY返回... >>> i = funcX(8)>>> i<function funcX.<locals>.funcY at 0x7feed39a5e18>>>> i(5)40>>> funcX(8)(5)40

解释:(对于funcx,funcy就是他的一个内部函数,funy的外部作用域就是funcx整个函数空间)funcy引用了funcx的变量x

使用闭包注意:闭包是由内部函数演变得来,所以不可以在外部函数的外边对内部函数进行调用;变量也是这样;



1 0