Python闭包教程展示了如何在Python中使用闭包函数。
Python函数是一等公民。这意味着函数与Python中的其他对象具有同等地位。函数可以分配给变量、存储在集合中、动态创建和删除,或者作为参数传递。
嵌套函数,也称为内部函数,是在另一个函数中定义的函数。
#!/usr/bin/python def main(): def build_message(name): msg = f'Hello {name}' return msg name = input("Enter your name: ") msg = build_message(name) print(msg) if __name__ == "__main__": main()
build_message
是一个嵌套函数。它在其外部main
函数中定义和调用。
Python闭包
闭包是一个嵌套函数,它可以从已完成执行的封闭函数访问自由变量。Python闭包的三个特征是:
- 它是一个嵌套函数
- 它可以访问外部作用域中的一个自由变量
- 它是从封闭函数返回的
自由变量是未绑定在本地范围内的变量。为了使闭包能够处理数字和字符串等不可变变量,我们必须使用非本地关键字。
Python闭包有助于避免使用全局值并提供某种形式的数据隐藏。它们用于Python装饰器。
Python简单闭包示例
下面是一个简单的Python闭包示例。
#!/usr/bin/python def make_printer(msg): msg = "hi there" def printer(): print(msg) return printer myprinter = make_printer("Hello there") myprinter() myprinter() myprinter()
在示例中,我们有一个make_printer
函数,它创建并返回一个函数。嵌套的printer
函数是闭包。
myprinter = make_printer("Hello there")
make_printer
函数返回一个printer
函数并将其分配给myprinter
变量。此时,它已经执行完毕。但是,printer
闭包仍然可以访问msg
变量。
$ ./simple_closure.py hi there hi there hi there
带有非本地关键字的Python闭包
nonlocal
关键字允许我们在外部函数范围内修改具有不可变类型的变量。
#!/usr/bin/python def make_counter(): count = 0 def inner(): nonlocal count count += 1 return count return inner counter = make_counter() c = counter() print(c) c = counter() print(c) c = counter() print(c)
该示例创建了一个计数器函数。
def make_counter(): count = 0 def inner(): nonlocal count count += 1 return count return inner
通过使用nonlocal
关键字,count
变量成为一个自由变量。现在我们可以修改它了。
$ ./counter.py 1 2 3
Python闭包与类
Python闭包可以作为小类的替代解决方案。
#!/usr/bin/python class Summer(): def __init__(self): self.data = [] def __call__(self, val): self.data.append(val) _sum = sum(self.data) return _sum summer = Summer() s = summer(1) print(s) s = summer(2) print(s) s = summer(3) print(s) s = summer(4) print(s)
我们有一个Summer
类,它对传递给对象的值求和。
def __init__(self): self.data = []
数据保存在对象属性中,并在构造函数中创建。
def __call__(self, val): self.data.append(val) _sum = sum(self.data) return _sum
每次调用实例时,都会附加值并计算并返回总和。
以下是使用Python闭包的替代解决方案。
#!/usr/bin/python def make_summer(): data = [] def summer(val): data.append(val) _sum = sum(data) return _sum return summer summer = make_summer() s = summer(1) print(s) s = summer(2) print(s) s = summer(3) print(s) s = summer(4) print(s)
我们与Python闭包具有相同的功能。
def make_summer(): data = [] def summer(val): data.append(val) _sum = sum(data) return _sum return summer
因为data
是一个可变的列表,我们不必使用nonlocal
关键字。
在本教程中,我们使用了Python闭包。
列出所有Python教程。