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教程。
