Python闭包示例Cod

2024-06-01 10:42:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Dive Into Python 3书学习Python。我喜欢它,但我不理解第6.5节中的example used to introduce Closures

我是说,我看到了它的工作原理,我觉得它真的很酷。但我没有看到任何真正的好处:在我看来,只需在循环中逐行读取规则文件,并对读取的每一行执行搜索/替换,就可以获得相同的结果。

有人能帮我:

  • 理解为什么在这个例子中使用闭包可以改进代码(例如,更容易维护、扩展、重用或调试?)

  • 或者建议一些其他真实代码示例的源代码,在这些示例中闭包确实很出色?

谢谢你!


Tags: 文件to代码示例源代码规则example建议
3条回答

当您可以访问整个代码库或不考虑可重用性时,这似乎不是特别有用,但是当您试图将逻辑分离为不同的、可重用的模块(这些模块可以由不同的开发人员并行实现)时,这是非常强大和有用的。如果您只是从文件中读取模式字符串,那么每个模块都必须知道这个文件并传递这个烦人的模式字符串列表。如果您更改了系统,使模式字符串来自URL而不是文件,则可能会完全破坏整个代码库。另一方面,如果处理逻辑只接受一个回调函数或多个回调函数,然后有另一个模块使用文件中的内容动态构造函数,则只需要更改构造函数的组件。这就是动态创建函数的能力。

以下是get configures的闭包用法:

def confmaker():
   cf=ini_conf()
   def clo(*args):
      return cf.get(*args)
   return clo

cfget=confmaker()

cfget(...)

这里只调用一次ini_conf。在我的理解中,闭包避免了全局变量(比如cf),并且使使用变得简单。

Decorators是闭包的一个例子。例如

def decorate(f):
    def wrapped_function():
        print("Function is being called")
        f()
        print("Function call is finished")
    return wrapped_function

@decorate
def my_function():
    print("Hello world")

my_function()

函数wrapped_function是一个闭包,因为它保留了对其作用域中变量(特别是参数f,原始函数)的访问权。闭包允许您访问它。

闭包还允许在调用函数时保留状态,而不必求助于类:

def make_counter():
    next_value = 0
    def return_next_value():
        nonlocal next_value
        val = next_value
        next_value += 1
        return val
    return return_next_value

my_first_counter = make_counter()
my_second_counter = make_counter()
print(my_first_counter())
print(my_second_counter())
print(my_first_counter())
print(my_second_counter())
print(my_first_counter())
print(my_second_counter())

此外,绑定方法在技术上是闭包(尽管它们的实现方式可能不同)。绑定方法是类成员函数,其类在中烘焙:

import sys
w = sys.stdout.write
w("Hello\n")

w本质上是一个闭包,它引用了sys.stdout对象。

最后,我还没有读过那本书,但是快速阅读了你链接的那一章,我很不满意——它是如此的迂回,以至于不能作为闭包的解释。

相关问题 更多 >