首页 > 编程语言 >python闭包 - 理解与应用

python闭包 - 理解与应用

时间:2024-04-26 12:56:39浏览次数:25  
标签:闭包 函数 python secret 理解 func event def

闭包定义

闭包是指在一个函数内部定义的函数,并且这个内部函数可以访问外部函数的局部变量。当外部函数执行完毕后,内部函数仍然可以访问外部函数的局部变量,这种函数就称为闭包。

在Python中,闭包通常用来保存一些状态信息,可以在外部函数执行完毕后继续使用这些状态信息。闭包可以帮助我们实现一些特定功能,比如保存函数的状态,实现装饰器等。

示例

def outer_func():
    x = 10
    
    def inner_func():
        print(x)
    
    return inner_func

closure = outer_func()
closure()  # 输出:10

在这个例子中,inner_func是一个闭包,它可以访问外部函数outer_func的局部变量x。当调用closure()时,内部函数inner_func仍然可以访问并打印外部函数的局部变量x的值。

闭包实际应用

保存状态信息

保存状态信息:闭包可以用来保存一些状态信息,这些信息可以在外部函数执行完毕后继续使用。例如,可以使用闭包来记录函数调用的次数或者实现计数器功能。

def counter():
    count = 0
    
    def inner_counter():
        nonlocal count
        count += 1
        return count
    
    return inner_counter

c = counter()
print(c())  # 输出:1
print(c())  # 输出:2

实现装饰器

闭包可以用来实现装饰器,即在不修改原函数代码的情况下,为函数添加额外的功能。

def my_decorator(func):
    def wrapper():
        print("Before function call")
        func()
        print("After function call")
    
    return wrapper

@my_decorator
def say_hello():
    print("Hello")

say_hello()

在这个例子中,my_decorator是一个闭包,它接受一个函数作为参数,并返回一个新的函数wrapper,在wrapper中添加了额外的功能。通过装饰器语法@my_decorator,我们可以在say_hello函数调用前后打印额外的信息。

回调函数

闭包经常用作回调函数,用于异步编程或事件处理。例如,当某个事件发生时,可以调用一个闭包函数来处理该事件。

def event_handler(callback):
    def inner_event_handler(event):
        print("Event:", event)
        callback(event)
    
    return inner_event_handler

def on_event(event):
    print("Handling event:", event)

handler = event_handler(on_event)
handler("click")  # 输出:Event: click Handling event: click

缓存函数

闭包可以用来实现函数的结果缓存,以提高性能。例如,可以将函数的输入参数和对应的输出结果存储在闭包中,下次调用函数时可以直接返回缓存的结果。

def memoize(func):
    cache = {}
    
    def memoized_func(n):
        if n not in cache:
            cache[n] = func(n)
        return cache[n]
    
    return memoized_func

@memoize
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(5))  # 输出:5

实现私有变量

闭包可以用来模拟私有变量,即外部函数的局部变量对外部不可见,但内部函数仍然可以访问和修改这些变量。

def private_variable():
    secret = "I am a secret"
    
    def get_secret():
        return secret
    
    def set_secret(new_secret):
        nonlocal secret
        secret = new_secret
    
    return get_secret, set_secret

get_secret, set_secret = private_variable()
print(get_secret())  # 输出:I am a secret
set_secret("New secret")
print(get_secret())  # 输出:New secret

这些例子展示了闭包的多种用途,包括保存状态信息、实现装饰器、回调函数、缓存函数和模拟私有变量等。通过闭包,我们可以实现更加灵活和功能性强大的代码结构。

标签:闭包,函数,python,secret,理解,func,event,def
From: https://www.cnblogs.com/zibinchen/p/18159799

相关文章

  • 社区发现之标签传播算法(LPA)python实现
    社区发现在图领域中备受关注,其根源可以追溯到子图分割问题。在真实的社交网络中,用户之间的联系紧密度不尽相同,导致形成了不同的社区结构。社区发现问题主要分为两类:非重叠和重叠社区。非重叠社区发现指的是每个节点仅属于一个社区,社区之间没有交集。在非重叠社区发现中,有多种解决......
  • 丐版stream流理解和使用
    数据量越大,硬件内核数越多,stream流相比传统for循环速度越快。原因是stream流是可以并行处理的。如果要使用stream流,可以直接用flatmap把外层嵌套扁平化,只留下自己需要处理的元素示例:点击查看代码List<List<Integer>>nestedList=Arrays.asList(Arrays.asList(1,2,......
  • js 闭包的概念及应用场景
    1.概念是内部函数可以访问外部函数作用域中的变量。2.来由由于JavaScript中的函数作用域规则和函数可以作为值传递的特性产生的3.优点封装性(可以将变量和函数封装起来,防止外部访问和修改,提高了代码的可维护性和可重用性)保存状态(即使函数已经执行完毕,状态仍然保存,在事件处理......
  • python2 http响应中文显示unicode \uXXX的问题
    python2编码解码会以unicode作为中间码,要用decode和encode解码后再编码其中decode解码,是把bytes以给定的编码格式解码成unicodeencode是以给定的编码格式将unicode编码为bytes数据是以bytes形式传递和存储的,程序需要用正确的编码来将bytes解码显示decode:FrombytesToUnic......
  • Matlab转python的索引问题
    python中numpy库可以实现类似matlab多维数组的运算.但两者在索引方式上存在一些差异.这是需要注意的.例如:%定义一个4*4矩阵A=1:16;A=reshape(A,[4,4]);%提取2*2的子矩阵a=A([1,4],[1,4])%得到一个2*2矩阵:%[A(1,1)A(1,4);%A(4,1)A(4,4)]但是python中则不......
  • python多线程
    多线程的原理是在同一进程内创建多个线程来执行不同的任务,这些线程共享同一进程的资源,包括内存空间、文件句柄等。每个线程拥有独立的执行路径,可以并行执行任务,从而提高程序的效率。在代码中,通过调用threading.Thread类创建了多个线程对象。每个线程对象都有一个target参数......
  • 用python写一段将指定文件夹下的子文件夹下的“.en.srt”文件复制一份,并将复制的文件
    代码:importosimportshutildefcopy_and_rename_en_srt_files(parent_directory):#遍历指定的父目录及其所有子目录forroot,dirs,filesinos.walk(parent_directory):forfileinfiles:#检查文件是否以.en.srt结尾if......
  • KNN算法思想与Python实现
    古语说得好,物以类聚,人以群分;近朱者赤,近墨者黑。这两句话的大概意思就是,你周围大部分朋友是什么人,那么你大概率也就是这种人,这句话其实也就是K最近邻算法的核心思想。kNN(k-NearestNeighbor)法即k最邻近法,最初由Cover和Hart于1968年提出,是一个理论上比较成熟的方法,也是最简单的机......
  • 【爆款推荐】初中中考阅读理解难题一网打尽!句子结构深度解析+答案揭秘,助你轻松冲刺高
    PDF格式公众号回复关键字:ZKYDT011原文1Thewriterlostherfatherattheageoffour,didn’tshe?解析1Thewriter这位作者,lost失去,herfather她的父亲,attheageoffour在4岁的时候,didn’tshe?不是吗?这位作家四岁时失去了父亲,不是吗?2Everythingcha......
  • Socket.D v2.4.12 发布(新增 python 实现)
    Socket.D协议?Socket.D是一个网络应用协议。在微服务、移动应用、物联网等场景,可替代http、websocket等。协议详情参考《官网介绍》。支持:tcp,udp,ws,kcp传输。目前:java,kotlin,javascript,node.js,python语言环境可用。go,rust,c/c++,.net正在开发中。forJava更新......