Python闭包用法详细指南

2021年3月10日15:57:42 发表评论 738 次浏览

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

Python中的嵌套函数

在另一个函数内部定义的函数称为嵌套函数。嵌套函数能够访问封闭范围的变量。

在Python中, 这些非局部变量只能在其作用域内访问, 而不能在其作用域外访问。可以通过以下示例进行说明:

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

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

Python闭包

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

  • 它是将功能与环境存储在一起的记录:一种映射, 该映射将功能的每个自由变量(在本地使用, 但在封闭范围内定义的变量)与在关闭时绑定名称的值或引用相关联已创建。
  • 与普通函数不同, 闭包允许该函数通过闭包的值或引用的副本访问这些捕获的变量, 即使该函数在其作用域之外被调用也是如此。
# Python program to illustrate
# closures
def outerFunction(text):
     text = text
  
     def innerFunction():
         print (text)
  
     return innerFunction # Note we are returning function WITHOUT parenthesis
  
if __name__ = = '__main__' :
     myFunction = outerFunction( 'Hey!' )
     myFunction()
Output:
omkarpathak@omkarpathak-Inspiron-3542:
~/Documents/Python-Programs/$ python Closures.py 
Hey!
  1. 从上面的代码可以看出, 闭包有助于在其范围之外调用函数。
  2. 功能innerFunction其作用域仅在outerFunction内部。但是, 通过使用闭包, 我们可以轻松扩展其作用域以调用其作用域之外的函数。
# 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)。

如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。

注意怪胎!巩固你的基础Python编程基础课程和学习基础知识。

首先, 你的面试准备可通过以下方式增强你的数据结构概念:Python DS课程。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: