首页 > 编程语言 >了解python闭包

了解python闭包

时间:2023-10-06 11:22:41浏览次数:38  
标签:闭包 num 函数 python 了解 inner print outer def

了解python闭包

1、闭包的作用

当函数调用结束之后,函数内定义的变量都销毁了,但是有时候我们需要函数内的这个变量,每次在这个变量的基础上完成一系列的操作。(即在调用完函数之后,仍然想使用函数内部的变量)

那么我们可以使用闭包来解决这个需求。

闭包的定义:

在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。

那么如何解释这个官方定义呢

① 有函数嵌套 ② 有引用 ③ 有返回

# ① 有函数嵌套  ② 有引用 ③ 有返回
def outer():
    # 外部函数的变量
    num1 = 10

    # 函数嵌套
    def inner():
        # 引用外部函数的变量
        print(num1)

    # 外部函数返回内部函数
    return inner


fn = outer()  # 相当于fn这个全局变量接收是inner函数名称
fn()  # 调用了inner函数 
  • 为什么num1这个局部变量在函数执行结束之后,内部变量仍然存在

fn = outer() 即将inner的地址赋予了fn,引用计数器+1,而innner函数里面因为print函数,num1的引用计数器+1,所以num1变量仍然存在

疑问:在outer函数里面不也是定义了num1 = 10了吗,这个时候不是num1的引用计数器不是初始化为1呢,是因为在局部作用域中的原因?引用计数器的作用范围是全局作用域?

2、函数在内存中的存储结构

image-20230930201925077

  • 函数名存储在中,函数代码块存储在,函数中的变量的值存储在数据区
def outer():
    return 100


print(outer)  # 并没有执行outer函数,只是返回了outer函数的内存地址
print(outer())  # 添加了圆括号才代表 找到了这个函数并执行内部代码块

image-20230930202927968

3、global关键字和nonlocal关键字

golbal:声明全局变量,代表从这行代码开始,使用的变量都是全局变量,只能在函数的内部使用

问题:在函数嵌套的情况下,内部函数能不能修改外部函数的局部变量?

nonlocal:声明离它最近的外层的局部变量

num = 1


def outer():
    num = 10

    def inner():
        global num  # global关键字
        num = 100

    inner()
    print(f'局部作用域中的num为{num}')  # 10


outer()
print(f'全局作用域中的num为{num}') # 100
  • golbal函数并不能修改局部作用域中的变量
num = 1


def outer():
    num = 10

    def inner():
        nonlocal num  # nonlocal关键字
        num = 100

    inner()
    print(f'局部作用域中的num为{num}') # 100


outer()
print(f'全局作用域中的num为{num}') # 1

4、闭包案例

闭包的关键:在函数执行完,其引用的内部变量不会消失,而是保存下来

def outer():
    result = 0

    def inner(num):
        # 访问离它最近的外层局部变量
        nonlocal result
        result += num
        print(result)

    return inner


fn = outer()
fn(1)  # 1
fn(2)  # 3
fn(3)  # 6

标签:闭包,num,函数,python,了解,inner,print,outer,def
From: https://www.cnblogs.com/luoluoange/p/17744348.html

相关文章

  • 基于python的食力派网上订餐系统-计算机毕业设计源码+LW文档
    摘 要在各学校的教学过程中,食力派网上订餐系统是一项非常重要的事情。随着计算机多媒体技术的发展和网络的普及。采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的食力派网上订餐系统,这样可以有效地解决食力派网上订餐管理......
  • ESP32BOX的bin文件,docs文件夹,SDK作用介绍,以及了解从上电到app_main中间做了什么
    ESP32-BOX的GitHub链接(1)ESP32-BOX的GitHub链接factory_demo产生的bin文件作用(1)<1>bootloader.bin:引导加载程序映像由与应用程序映像相同的结构组成,用于决定是进入OTA升级还是进入正常程序。这个已经包含了应用代码以及底层代码。<2>factory_demo.bin:这个应该就是factory_demo程序......
  • 【python自动化】七月PytestAutoApi开源框架学习笔记(二)
    执行流程注:请先阅读作者的README.md文档https://gitee.com/yu_xiao_qi/pytest-auto-api2/blob/master/README.md本节内容目录如下:文章目录执行流程目录结构参数配置入口文件-run.pypytest.initest_case初始化数据缓存解析yaml测试数据测试用例执行conftest.py用例demo分析加载yaml......
  • 【AI测试】python文字图像识别tesseract
    [AI测试]python文字图像识别tesseractgithub官网:https://github.com/tesseract-ocr/tesseractpython版本:https://github.com/madmaze/pytesseractOCR,即OpticalCharacterRecognition,光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程。对于图形验证码来说,它们......
  • 【AI测试】已落地-python文字图像识别PaddleOCR
    python文字图像识别PaddleOCRPaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力开发者训练出更好的模型,并应用落地。国产之光,百度开源的paddleocr开源地址:https://github.com/PaddlePaddle/PaddleOCR官方电子书:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7......
  • 基于Python的智慧补助系统的设计与实现-计算机毕业设计源码+LW文档
    摘 要在各学校的教学过程中,智慧补助系统是一项非常重要的事情。随着计算机多媒体技术的发展和网络的普及。采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的智慧补助系统,这样可以有效地解决智慧补助混乱的局面。本文首先......
  • python11
    3.3字符串的公共功能1.相加:字符串+字符串v1="吉林省"+"长春市"print(v1)2.相乘:字符串*整数data="alex"*3print(data)3.长度data="吉林省长春市"value=len(data)print(value)4.获取字符串中的字符,索引message="吉林省长春市"#012......
  • 笨办法学Python3 习题22 到现在为止你学到了什么
    目前为止书中学到,后续继续补充内置函数:print(x)input(x)f"xx{a}xx{b}xx." //''xx{}xx{}xx.''format(a,b) //''xx''a''xx''b''xx.''open(x)//open(x,"w") x.r......
  • Python 运算符
    运算符用于对变量和值执行操作。在下面的示例中,我们使用+运算符将两个值相加:print(10+5)Python将运算符分为以下几组:算术运算符赋值运算符比较运算符逻辑运算符身份运算符成员运算符位运算符算术运算符算术运算符用于对数字值执行常见的数学运算:运算符名......
  • Anaconda配置Python的xlrd模块
      本文介绍在Anaconda环境下,安装Python读取.xls格式表格文件的库xlrd的方法。  xlrd是一个用于读取Excel文件的Python库,下面是xlrd库的一些主要特点和功能:读取Excel文件:xlrd可以打开和读取Excel文件,并提取其中的数据和元数据。支持多种数据类型:xlrd可以处理包括数字、日期......