📜  Python闭包

📅  最后修改于: 2022-05-13 01:55:16.489000             🧑  作者: Mango

Python闭包

在了解闭包是什么之前,我们首先要了解什么是嵌套函数和非局部变量。

Python中的嵌套函数

在另一个函数中定义的函数称为嵌套函数。嵌套函数能够访问封闭范围的变量。
在Python中,这些非局部变量只能在其作用域内访问,不能在其作用域外访问。这可以通过以下示例来说明:

Python3
# Python program to illustrate
# nested functions
def outerFunction(text):
    text = text
 
    def innerFunction():
        print(text)
 
    innerFunction()
 
if __name__ == '__main__':
    outerFunction('Hey!')


Python3
# Python program to illustrate
# closures
def outerFunction(text):
    text = text
 
    def innerFunction():
        print(text)
 
    # Note we are returning function
    # WITHOUT parenthesis
    return innerFunction 
 
if __name__ == '__main__':
    myFunction = outerFunction('Hey!')
    myFunction()


Python3
# Python program to illustrate
# closures
import logging
logging.basicConfig(filename='example.log',
                    level=logging.INFO)
 
 
def logger(func):
    def log_func(*args):
        logging.info(
            'Running "{}" with arguments {}'.format(func.__name__,
                                                    args))
        print(func(*args))
         
    # Necessary for closure to
    # work (returning WITHOUT parenthesis)
    return log_func            
 
def add(x, y):
    return x+y
 
def sub(x, y):
    return x-y
 
add_logger = logger(add)
sub_logger = logger(sub)
 
add_logger(3, 3)
add_logger(4, 5)
 
sub_logger(10, 5)
sub_logger(20, 10)


正如我们所见,innerFunction() 可以在 outerFunction 主体内部轻松访问,但不能在其主体外部访问。因此,在这里,innerFunction() 被视为使用文本作为非局部变量的嵌套函数。

Python闭包

闭包是一个函数对象,它记住封闭范围内的值,即使它们不存在于内存中。

  • 它是一个将函数与环境一起存储的记录:将函数的每个自由变量(在本地使用但在封闭范围内定义的变量)与在闭包时绑定名称的值或引用相关联的映射创建的。
  • 闭包——与普通函数不同——允许函数通过闭包的值或引用的副本访问那些捕获的变量,即使在函数在其范围之外调用时也是如此。

Python3

# Python program to illustrate
# closures
def outerFunction(text):
    text = text
 
    def innerFunction():
        print(text)
 
    # Note we are returning function
    # WITHOUT parenthesis
    return innerFunction 
 
if __name__ == '__main__':
    myFunction = outerFunction('Hey!')
    myFunction()
Output:
omkarpathak@omkarpathak-Inspiron-3542:
~/Documents/Python-Programs/$ python Closures.py 
Hey!
  1. 从上面的代码中可以看出,闭包有助于在其范围之外调用函数。
  2. 函数innerFunction的作用域仅在outerFunction 内部。但是通过使用闭包,我们可以轻松地扩展其范围以调用其范围之外的函数。

Python3

# Python program to illustrate
# closures
import logging
logging.basicConfig(filename='example.log',
                    level=logging.INFO)
 
 
def logger(func):
    def log_func(*args):
        logging.info(
            'Running "{}" with arguments {}'.format(func.__name__,
                                                    args))
        print(func(*args))
         
    # Necessary for closure to
    # work (returning WITHOUT parenthesis)
    return log_func            
 
def add(x, y):
    return x+y
 
def sub(x, y):
    return x-y
 
add_logger = logger(add)
sub_logger = logger(sub)
 
add_logger(3, 3)
add_logger(4, 5)
 
sub_logger(10, 5)
sub_logger(20, 10)
OUTPUT:
omkarpathak@omkarpathak-Inspiron-3542:
~/Documents/Python-Programs/$ python MoreOnClosures.py 
6
9
5
10

何时以及为什么使用闭包:

1. 由于闭包被用作回调函数,它们提供了某种数据隐藏。这有助于我们减少全局变量的使用。

2. 当我们的代码中的函数很少时,闭包被证明是一种有效的方法。但是如果我们需要有很多功能,那就去类(OOP)吧。