Python 闭包
在这一章中,我们将讨论Python中闭包的概念。在Python中,函数被称为一阶对象。就像主要的数据类型一样,函数也可以被赋值给变量,或者作为参数传递。
嵌套函数
您还可以在一个函数的体内定义一个函数,这称为嵌套函数。
示例
def functionA():
print ("Outer function")
def functionB():
print ("Inner function")
functionB()
functionA()
它将产生以下 输出 −
Outer function
Inner function
在上面的示例中,functionB被定义在functionA内部。然后从外部函数的作用域内调用内部函数。
如果外部函数接收到任何参数,它可以传递给内部函数。
def functionA(name):
print ("Outer function")
def functionB():
print ("Inner function")
print ("Hi {}".format(name))
functionB()
functionA("Python")
它将会产生以下输出 −
Outer function
Inner function
Hi Python
什么是闭包
闭包是一个嵌套函数,它可以访问已经执行完毕的封闭函数中的变量。这样的变量在本地作用域中未绑定。如果要使用不可变的变量(数字或字符串),我们必须使用nonlocal关键字。
Python闭包的主要优点是可以避免使用全局值,并提供一定形式的数据隐藏。它们在Python装饰器中使用。
示例
def functionA(name):
name ="New name"
def functionB():
print (name)
return functionB
myfunction = functionA("My name")
myfunction()
它将产生以下 输出 −
New name
在上面的示例中,我们有一个函数A函数,它创建并返回另一个函数函数B。嵌套的函数B函数就是闭包。
外部函数A函数返回一个函数B函数并将其赋值给myfunction变量。即使它已经执行完毕,但是闭包仍然可以访问name变量。
nonlocal关键字
在Python中,nonlocal关键字允许访问局部作用域之外的变量。这在闭包中用于修改外部变量作用域中的不可变变量。
示例
def functionA():
counter =0
def functionB():
nonlocal counter
counter+=1
return counter
return functionB
myfunction = functionA()
retval = myfunction()
print ("Counter:", retval)
retval = myfunction()
print ("Counter:", retval)
retval = myfunction()
print ("Counter:", retval)
它将产生以下 输出 −
Counter: 1
Counter: 2
Counter: 3