一、内嵌函数
在函数内部创建另一个函数,也叫作内部函数。
>>> 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 func2
UnboundLocalError: 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
使用闭包注意:闭包是由内部函数演变得来,所以不可以在外部函数的外边对内部函数进行调用;变量也是这样;