首页 > 其他分享 >12. 闭包

12. 闭包

时间:2024-09-28 18:22:48浏览次数:1  
标签:闭包 12 outer 函数 fun inner print

一、闭包

  在一个函数内部,我们可以在在定义一个函数,并且将内部的函数作为外部函数的返回值返回。这种高阶函数,我们也称为 闭包。“闭” 是指该函数是内嵌函数,“包” 是指该函数包含外层函数作用域的引用(不是对全局作用域)。通过闭包,我们可以创建一些只有当前函数能访问的变量,我们可以将一些私有的数据藏在闭包中。

  形成闭包的要件:① 函数嵌套;② 将内部函数作为返回值返回;③内部函数必须要使用外部函数的变量

  正常来说,调用一个函数的时候,这个函数中的所有局部变量+形参都只会在这个函数执行过程中才会保留,只要这个函数执行完毕,那么这些局部变量+形参就会被自动释放,也就说没有了。闭包比普通的函数强大的地方在于,它在外部函数执行完毕之后,这个外部函数中的所有局部变量+形参,都不会被释放,以便在于调用内部函数的时候可以使用。

  闭包的好处可以将局部变量永久存储,但是多占用内存;由于闭包会携带包含它的函数的作用域,因此会比其它函数占用更多的内存。因此,可以手动解除会匿名函数的引用,以便释放内存;

def outer(count=0):
    # 在函数内部再定义一个函数
    def inner():
        print("我是内部函数")
        # 内层函数修改外层函数的数据
        nonlocal count  
        count += 1
        # 内层函数访问外层函数的数据
        print(count)
    return inner

fun = outer()
fun()
fun()
fun()

  fun 是一个函数,它是调用 outer() 后返回的函数。这个函数是在 outer() 内部定义的,并不是全局函数,所以这个函数总是能访问到 fun() 函数内的变量。在闭包中的内部函数中,如果没有用 nonlocal 关键字来声明外部函数的变量,则不能对其进行修改,只能进行访问;

二、闭包的应用

  通过闭包我们可以在没有改变原函数的前提下,拓展功能。

def add(a,b):
    return a+b

def say_hello():
    print("hello world!")

def outer(func):
    """
    用来对其它函数进行扩展,使其函数可以在执行前打印开始执行,执行后打印执行结束
    @param inner 要扩展的函数
    @return inner 返回扩展函数
    """

    # 创建一个新函数
    def inner(*args, **kw_args):
        # 在原函数执行前扩展功能
        print("开始执行!")

        # 调用被扩展的函数
        result = func(*args, **kw_args)

        # 在原函数执行后拓展功能
        print("执行结束!")

        # 返回函数执行结果
        return result
  
    # 返回新函数
    return inner

# 将原函数名指向的内存地址偷梁换柱成装饰器内部新创建函数(inner())的内存地址
add = outer(add)
result = add(10,20)
print(result,'\n')

say_hello = outer(say_hello)
say_hello()

标签:闭包,12,outer,函数,fun,inner,print
From: https://www.cnblogs.com/FlurryHeart/p/18438249

相关文章

  • Leetcode 1235. 规划兼职工作
    1.题目基本信息1.1.题目描述你打算利用空闲时间来做兼职工作赚些零花钱。这里有n份兼职工作,每份工作预计从startTime[i]开始到endTime[i]结束,报酬为profit[i]。给你一份兼职工作表,包含开始时间startTime,结束时间endTime和预计报酬profit三个数组,请你计算并返回可......
  • 12 random案例 年会抽奖案例
    年会抽奖案例把向向过程编程函数实现时:可读性+重用性,print时,能不使用“”号时,尽量不使用-各部门统计员工的姓名=>部门名称.txt-读取用户信息-根据特定的奖项配置来进行抽奖data_list=[("三等奖",5,"空气净化器"),("二等奖",3,"ipad"), ("一等奖",2,"iphone13"),......
  • 牛客练习赛129 A-数数
    复习一下埃氏筛,快速拿出n以内质数。该题要是一个一个去计算“偶数”会超时非常多。题意中”奇数“的本质是质数及质数的n次幂,所以先求出n以内所有质数及其n次幂的个数,就能计算出“偶数”的个数。1#include<bits/stdc++.h>2usingnamespacestd;3vector<bool>isPrime(......
  • 如何成为一名黑客?小白必学的12个基本步骤
     黑客攻防是一个极具魅力的技术领域,但成为一名黑客毫无疑问也并不容易。你必须拥有对新技术的好奇心和积极的学习态度,具备很深的计算机系统、编程语言和操作系统知识,并乐意不断地去学习和进步。如果你想成为一名优秀的黑客,下面是12种最重要的基础条件,请认真阅读:1.学习UNIX......
  • JavaScript 闭包
    什么是闭包?简单理解:闭包=内层函数+外层函数的变量。正如前面所说的作用域链也会涉及到闭包,如下:leta=6;//全局作用域functionf(){a=7;//父级作用域functiond(){a=8;//自己的作用域console.log(a);}d();}f(); 闭包的官方......
  • REF3012, REF3020, REF3025, REF3030, REF3033, REF3040采用 SOT-23-3 封装的 REF30xx
    1特性•微型封装:SOT-23-3•低压降:1mV•大输出电流:25mA•高精度:0.2%•低IQ:42µA(典型值)•出色的额定温漂性能:–0°C至70°C范围内为50ppm/°C(最大值)––40°C至+125°C范围内为75ppm/°C(最大值)2应用•温度和压力发送器•便携式、电池供电类设备......
  • (12-3-01)基于全向驱动的机器人及其控制系统:机器人运动控制和状态管理(1)
    4.3 机器人运动控制和状态管理在本项目的“task6_ws”目录中包含了实现一个综合的机器人控制系统的程序文件,负责机器人的运动控制、状态管理和位置估计。包括控制机器人的移动和反馈信息的管理,使用标记识别技术来定位和调整机器人位置。4.3.1 启动文件文件task6_contro......
  • 30012.org
    30012.orgTableofContents1.场景2.错误信息3.原因分析3.1.UNDO表空间名不对3.2.表空间类型不对4.解决问题4.1.针对场景14.2.针对场景21.场景ADGswitchover为主库。然后重启。2.错误信息/u01/app/oracle/diag/rdbms/bossdg/boss......
  • Java12 新特性
    升级的switch语句在jdk12之前的switch语句中,如果没有写break,则会出现case穿透现象intmonth=3;switch(month){case3:case4:case5:System.out.println("spring");break;case6:case7:case8:System.out.print......
  • ISSI(芯成)—IS25WP512M-JLLA3 FLASH芯片详解
    写在前面本系列文章主要讲解ISSI(芯成)—IS25WP512M-JLLA3FLASH芯片的相关知识,希望能帮助更多的同学认识和了解ISSI(芯成)—IS25WP512M-JLLA3FLASH芯片。若有相关问题,欢迎评论沟通,共同进步。(*^▽^*)此次架构中IS25WP512M-JLLA3作为FLASH芯片使用,下面将详细介绍此芯片。1.......