在查看闭包是什么之前,我们必须首先了解什么是嵌套函数和非局部变量。
在另一个函数内部定义的函数称为嵌套函数。嵌套函数能够访问封闭范围的变量。
在 Python 中,这些非局部变量只能在其作用域内访问,而不能在其作用域外访问。可以通过以下示例进行说明:
- # Python 展示嵌套函数
- def outerFunction(text):
- text = text
- def innerFunction():
- print(text)
- innerFunction()
- if __name__ == '__main__':
- outerFunction('Hey!')
如我们所见,innerFunction() 可以很容易地在 externalFunction 主体内部访问,但不能在其主体外部访问。因此,在这里,将 innerFunction() 视为使用 文本 作为非局部变量的嵌套函数。
闭包是一个函数对象,即使在内存中不存在值,它也会记住范围内的值。
- # Python 展示闭包
- def outerFunction(text):
- text = text
- def innerFunction():
- print(text)
- return innerFunction # 注意我们返回函数,没带括号哦
- if __name__ == '__main__':
- myFunction = outerFunction('嗨!')
- myFunction()
输出:
- 嗨!
- # Python 展示闭包
- 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))
- # 闭包,返回去函数,不带括号
- 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)
- 输出:
- 6
- 9
- 5
- 10
何时以及为何使用闭包: