马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 bulaka 于 2017-6-18 10:32 编辑
内嵌函数
python的函数定义是可以嵌套的,也就是允许在函数内部创建一个函数,这函数叫做内嵌函数,语法结构如下:
>>> def fun1():
print("fun1()正在调用")
def fun2():
print("fun2()正在被调用")
fun2()
>>> fun1()
fun1()正在调用
fun2()正在被调用
需要注意的地方是,除了fun1这个函数中可以随意调用fun2()这个内部函数外,出了fun1(),就没有任何可以对fun2()可以调用的地方了
内嵌函数变量的作用域
A代码def outside():
var = 5
def inside():
var = 3
print(var)
inside()
outside()
B代码def outside():
var = 5
def inside():
print(var)
var = 3
inside()
outside()
思考上面的代码A没有报错,而代码B报错了,是为什么???
原因是:这里outside()函数里有一个var变量,但是内嵌函数inside()也有一个同名的变量,python为了保护变量的作用域,故将outside()的var变量屏蔽起来,因此此时四无法访问到外层的var变量的
闭包
定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
>>> def funx(x):
def funy(y): #这里面funy就是一个闭包
return x*y
return funy #直接返回闭包函数名
同样的在内部函数中,你只能对外部函数的局部变量进行访问,但不能进行修改,在python3中如果希望在内部函数里修改外部函数里的局部变量,那可以使用 关键字nonlocal
如何访问闭包内容
def funout():
print("访问到外部函数")
def funIn():
print('宾果!你成功访问到我啦!')
return funIn
方法1
>>> funout()()
访问到外部函数
宾果!你成功访问到我啦!
方法2
>>> a=funout()
访问到外部函数
>>> a()
宾果!你成功访问到我啦!
通过上面的定义,理解如下的输出
def funX():
x = 5
def funY():
nonlocal x
x += 1
return x
return funY
a = funX()
print(a())
print(a())
print(a())
会打印
6
7
8
|