您的位置:首页 > 编程语言 > Python开发

Python-16 函数:内嵌函数和闭包

2017-07-28 20:08 344 查看

1、global关键字

全局变量的作用域是整个模块(也就是整个代码段),也就是代码段内的所有函数内部都可以访问到全局变量。但注意,在函数内部仅仅去访问全局变量就好,不要试图去修改它。

因为那样的话,Python会使用屏蔽(shadowing)的方式“保护”全局变量:一旦函数内部试图修改全局变量,Python就会在函数内部自动创建一个名字一模一样的局部变量,这样子修改的结果只会修改到局部变量,而不会影响到全局变量。

>>> count = 5
>>> def MyFun():
count = 10
print(count)

>>> MyFun()
10
>>> print(count)
5
>>>

如果要在函数中修改全局变量,使用关键字global

>>> def MyFun():
global count
count = 10
print(count)

>>> MyFun()
10
>>> print(count)
10
>>>


2、内嵌函数

Python的函数定义可以嵌套的,也就是允许在函数内部创建另一个函数,这样的函数叫做内嵌函数或者内部函数。

>>> def fun1():
print('fun1正在被调用...')
def fun2():
print('fun2正在被调用...')
fun2()

>>> fun1()
fun1正在被调用...
fun2正在被调用...
>>>


3、闭包

闭包(closure)是函数式编程的一个重要语法结构,函数式编程是一种编程范式,著名的函数编程语言就是LISP语言(主要用于绘图,AI)

不同的编程语言实现闭包的方式不同,Python中闭包从表现上定义为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。

>>> def FunX(x):
def FunY(y):
return x*y
return FunY

>>> i = FunX(8)
>>> i
<function FunX.<locals>.FunY at 0x024EE390>
>>> type(i)
<class 'function'>
>>> i(5)
40
>>> FunX(8)(5)
40
>>>
内部函数FunY()就是闭包。

在外部调用FunY()是不允许的:

>>> FunY(5)
Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module>
FunY(5)
NameError: name 'FunY' is not defined
>>>


闭包函数调用外部作用域但不是全部变量x,报错“局部变量x,不能在定义之前被使用”
>>> def Fun1():
x = 5
def Fun2():
x*=x
return x
return Fun2()

>>> Fun1()
Traceback (most recent call last):
File "<pyshell#42>", line 1, in <module>
Fun1()
File "<pyshell#41>", line 6, in Fun1
return Fun2()
File "<pyshell#41>", line 4, in Fun2
x*=x
UnboundLocalError: local variable 'x' referenced before assignment


可以进行如下改造,x变为一个列表,因为列表不是存在栈里面

>>> def Fun1():
x = [5]
def Fun2():
x[0]*=x[0]
return x[0]
return Fun2()

>>> Fun1()
25


(1)、关键字 nonlocal

还可以使用关键字nonlocal,把x强制声明为非局部变量。

>>> def Fun1():
x = 5
def Fun2():
nonlocal x
x*=x
return x
return Fun2()

>>> Fun1()
25
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: