当前位置: 首页 > article >正文

Python 变量作用域、global 关键字与闭包作用域深度解析 第三部分

## 三、闭包作用域的存在原因及适用场景

### 3.1 闭包作用域存在的原因

#### 3.1.1 数据封装与隐藏

闭包可以把数据封装在外部函数的作用域中,只有内部函数能够访问这些数据,这有助于实现数据的隐藏和保护。

```python

def counter():

    count = 0

    def increment():

        nonlocal count

        count = count + 1

        return count

    return increment

c = counter()

print(c())  # 输出 1

print(c())  # 输出 2

```

在这个例子中,`count` 变量被封装在 `counter` 函数的作用域内,外部无法直接访问和修改它,只能通过 `increment` 函数来对其进行操作。

#### 3.1.2 状态保存

闭包可以保存外部函数的状态,即使外部函数已经执行完毕,内部函数仍然可以访问和修改这些状态。

```python

def multiplier(factor):

    def multiply(num):

        return num * factor

    return multiply

double = multiplier(2)

triple = multiplier(3)

print(double(5))  # 输出 10

print(triple(5))  # 输出 15

```

在这个例子中,`multiplier` 函数返回一个闭包 `multiply`,闭包保存了 `factor` 的值。

#### 3.1.3 代码复用与灵活性

闭包可以将一些通用的逻辑封装在外部函数中,通过传入不同的参数来创建不同的闭包,从而实现代码的复用和灵活性。

```python

def power_of(exponent):

    def power(base):

        return base ** exponent

    return power

square = power_of(2)

cube = power_of(3)

print(square(4))  # 输出 16

print(cube(4))  # 输出 64

```

### 3.2 闭包作用域的适用场景

#### 3.2.1 事件处理

在图形用户界面(GUI)编程或异步编程中,闭包可以用于处理事件。当事件发生时,闭包可以保存事件处理所需的状态信息。

```python

import tkinter as tk

def create_button(root, text):

    click_count = 0

    def on_click():

        nonlocal click_count

        click_count = click_count + 1

        print(f"{text} 按钮被点击了 {click_count} 次")

    button = tk.Button(root, text=text, command=on_click)

    button.pack()

    return button

root = tk.Tk()

button1 = create_button(root, "按钮 1")

button2 = create_button(root, "按钮 2")

root.mainloop()

```

#### 3.2.2 装饰器

装饰器是 Python 中一种强大的语法糖,它本质上就是一个返回闭包的函数。装饰器可以在不修改原函数代码的情况下,为函数添加额外的功能。

```python

def logger(func):

    def wrapper(*args, **kwargs):

        print(f"调用函数 {func.__name__},参数: {args}, {kwargs}")

        result = func(*args, **kwargs)

        print(f"函数 {func.__name__} 执行完毕,返回值: {result}")

        return result

    return wrapper

@logger

def add(a, b):

    return a + b

print(add(3, 5))

```

#### 3.2.3 迭代器和生成器

闭包可以用于实现自定义的迭代器和生成器。

```python

def fibonacci():

    a, b = 0, 1

    def next_num():

        nonlocal a, b

        result = a

        a, b = b, a + b

        return result

    return next_num

fib = fibonacci()

for _ in range(10):

    print(fib())

```

## 四、总结

通过本文的介绍,我们了解了 Python 中 `global` 关键字的使用方法,知道了它在修改全局变量时的重要性;掌握了 Python 变量的四种作用域类型以及 LEGB 规则,这有助于我们在编写代码时正确地访问和使用变量;同时,也明白了闭包作用域存在的原因和适用场景,闭包为我们实现数据封装、状态保存和代码复用提供了有效的手段。在实际编程中,合理运用这些知识,能够让我们编写出更加高效、灵活和可维护的 Python 代码。

相关文章:

Python 变量作用域、global 关键字与闭包作用域深度解析 第三部分

## 三、闭包作用域的存在原因及适用场景 ### 3.1 闭包作用域存在的原因 #### 3.1.1 数据封装与隐藏 闭包可以把数据封装在外部函数的作用域中,只有内部函数能够访问这些数据,这有助于实现数据的隐藏和保护。 python def counter(): count 0 def incre…...

zookeeper使用

下载 官网 链接 1. 2. 然后解压: 启动 先复制一份这个文件, 双击启动 默认占用8080,和Tomcat冲突, 解决方法:链接 然后重启...

【性能优化点滴】odygrd/quill 中一个简单的标记位作用--降低 IO 次数

在 StreamSink 类中,成员变量 _write_occurred 的作用是 跟踪自上次刷新(Flush)以来是否有写入操作发生,其核心目的是 优化 I/O 性能。以下是详细解析: _write_occurred 的作用 1. 避免不必要的刷新(Flush…...

Java面试黄金宝典11

1. 什么是 JMM 内存模型 定义 JMM(Java Memory Model)即 Java 内存模型,它并非真实的物理内存结构,而是一种抽象的概念。其主要作用是规范 Java 虚拟机与计算机主内存(Main Memory)之间的交互方式&#x…...

使用BootStrap 3的原创的模态框组件,没法弹出!估计是原创的bug

最近在给客户开发一个CRM系统,其中用到了BOOTSTRAP的模态框。版本是3。由于是刚开始用该框架。所以在正式部署到项目中前,需要测试一下,找到框架中的如下部分。需要说明的是。我用的asp.net mvc框架开发。测试也是在asp.net mvc环境下。 复制…...

【Azure 架构师学习笔记】- Azure Networking(1) -- Service Endpoint 和 Private Endpoint

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Networking】系列。 前言 最近公司的安全部门在审计云环境安全性时经常提到service endpoint(SE)和priavate endpoint(PE)的术语,为此做了一些研究储备。 云…...

Excel第41套全国人口普查

2. 导入网页中的表格:数据-现有链接-考生文件夹:网页-找到表格-点击→变为√-导入删除外部链接关系:数据-点击链接-选中连接-删除-确定(套用表格格式-也会是删除外部链接)数值缩小10000倍(除以10000即可&am…...

VUE2导出el-table数据为excel并且按字段分多个sheet

首先在根目录下建一个文件夹export用来存储export.js import * as XLSX from xlsxfunction autoWidthFunc(ws, data) {// 设置每列的最大宽度const colWidth data.map(row > row.map(val > {var reg new RegExp([\\u4E00-\\u9FFF], g) // 检测字符串是否包含汉字if (v…...

PDF文件转Markdown,基于开源项目marker

​ 首先我们来问下deepseek 为啥要选marker呢 基于深度学习,一看就逼格拉满。搞科研必备,效果应该不会太差。 看下官网 https://github.com/VikParuchuri/marker ​ 一看头像是个印度佬,自吹——又快又好。那就试试吧。 安装步骤 安装…...

深入理解 HTML5 Web Workers:提升网页性能的关键技术解析

深入理解 HTML5 Web Workers:提升网页性能的关键技术解析 引言1. 什么是 Web Workers?Web Workers 的特点: 2. Web Workers 的使用方式2.1 创建一个 Web Worker步骤 1:创建 Worker 文件步骤 2:在主线程中调用 Worker 3…...

【蓝桥杯速成】| 9.回溯升级

题目一:组合综合 问题描述 39. 组合总和 - 力扣(LeetCode) 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返…...

【uni-app】引用公共组件

目录 一、建立公共组件 1.1新建vue文件 1.2编写公共文件代码 1.3使用 注意事项 一、建立公共组件 1.1新建vue文件 在公共组件文件目录下新建所需要的功能文件 1.2编写公共文件代码 按需求写对应功能的代码 1.3使用 在需要使用的文件下引用公共组件 注意事项 想要使用s…...

API-Arrays

Arrays 操作数组的工具类 1.tostring import java.util.Arrays;public class demo1 {public static void main(String[] args) {Integer[] arr {2, 3, 1, 5, 6, 7, 8, 4, 9};System.out.println(Arrays.toString(arr));//[2, 3, 1, 5, 6, 7, 8, 4, 9]} } 2.binarySearch 二…...

尝试在软考62天前开始成为软件设计师-信息系统安全

安全属性 保密性:最小授权原则(能干活的最小权限)、防暴露(隐藏)、信息加密、物理保密完整性(防篡改):安全协议、校验码、密码校验、数字签名、公证 可用性:综合保障( IP过滤、业务流控制、路由选择控制、审计跟踪)不可抵赖性:数字签名 对称加密 DES :替换移位 3重DESAESR…...

dsPIC33CK64MC105 Curiosity Nano|为高性能数字电源与电机控制而生

「dsPIC33CK64MC105 Curiosity Nano」面向高性能数字电源与电机控制而生 dsPIC33CK64MC105 Curiosity Nano 该评估套件是一个经济高效的硬件平台,用于评估dsPIC33CK系列高性能数字信号控制器(DSC)。该板采用 100 MHz dsPIC33CK64MC105 DSC&am…...

STM32学习笔记之常见外设汇总

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...

.NET三层架构详解

.NET三层架构详解 文章目录 .NET三层架构详解引言什么是三层架构表示层(Presentation Layer)业务逻辑层(Business Logic Layer,BLL)数据访问层(Data Access Layer,DAL) .NET三层架构…...

《面向车险理赔的事故信息提取》开题报告

个人主页:大数据蟒行探索者 目录 一、选题的依据及意义 二、国内外研究概况及发展趋势 (1)车牌识别技术 (2)证件信息提取技术 (3)交通事故认定书文本提取 三、研究内容及实验方案 1.研究…...

算法刷题记录——LeetCode篇(7) [第601~700题](持续更新)

更新时间:2025-03-22 LeetCode刷题目录:算法刷题记录——专题目录汇总技术博客总目录:计算机技术系列博客——目录页 优先整理热门100及面试150,不定期持续更新,欢迎关注! 601. 体育馆的人流量 表&#…...

【AI神经网络】深度神经网络(DNN)技术解析:从原理到实践

引言 深度神经网络(Deep Neural Network, DNN)作为人工智能领域的核心技术,近年来在计算机视觉、自然语言处理、医疗诊断等领域取得了突破性进展。与传统机器学习模型相比,DNN通过多层非线性变换自动提取数据特征,解决…...

mysql-大批量插入数据的三种方式和使用场景

1.批量插入三种方式 INSERT INTO … SELECTINSERT INTO … VALUES (…)LOAD DATA INFILE ‘/path/to/datafile.csv’ INTO TABLE table_name 2.批量插入 2.1 INSERT INTO … SELECT 用途:从另一个表中选择数据并插入到目标表中。 语法示例: INSERT …...

4、pytest常用插件

pytest 是一个功能非常强大的测试框架,支持丰富的插件系统。插件可以扩展 pytest 的功能,从而使测试过程更加高效和便捷。以下是一些常用的 pytest 插件及其作用: pytest-cov: 作用: 提供测试覆盖率报告,帮助你了解代码的表现情况…...

EasyRTC轻量级Webrtc音视频通话SDK,助力带屏IPC在嵌入式设备中的应用

一、市场背景 随着人们生活水平的提高,对于家居安全和远程监控的需求日益增长,带屏IPCam不仅满足了用户实时查看监控画面的需求,还提供了诸如双向语音通话、智能报警等丰富的功能,极大地提升了用户体验。 此外,技术的…...

预测数值型数据:回归

1.1 用线性回归找到最佳拟合直线 线性回归:优点:结果易于理解,计算上不复杂 缺点:对非线性的数据拟合不好 适用数据类型:数值型和标称型数据 回归的目的就是预测数值型的目标值。 回归的一般方法: &#…...

【操作系统安全】任务3:Linux 网络安全实战命令手册

目录 一、基础网络信息获取 1. 网络接口配置 2. 路由表管理 3. 服务端口监控 二、网络监控与分析 1. 实时流量监控 2. 数据包捕获 3. 网络协议分析 三、渗透测试工具集 1. 端口扫描 2. 漏洞利用 3. 密码破解 四、日志审计与分析 1. 系统日志处理 2. 入侵检测 3…...

PostgreSQL 数据库源码编译安装全流程详解 Linux 8

PostgreSQL 数据库源码编译安装全流程详解 Linux 8 1. 基础环境配置1.1 修改主机名1.2 配置操作系统yum源1.3 安装操作系统依赖包1.4 禁用SELINUX配置1.5 关闭操作系统防火墙1.6 创建用户和组1.7 建立安装目录1.8 编辑环境变量 2. 源码方式安装(PG 16)2.…...

5.4 位运算专题:LeetCode 137. 只出现一次的数字 II

1. 题目链接 LeetCode 137. 只出现一次的数字 II 2. 题目描述 给定一个整数数组 nums,其中每个元素均出现 三次,除了一个元素只出现 一次。请找出这个只出现一次的元素。 要求: 时间复杂度为 O(n),空间复杂度为 O(1)。 示例&a…...

Android Compose 框架的状态与 ViewModel 的协同(collectAsState)深入剖析(二十一)

Android Compose 框架的状态与 ViewModel 的协同(collectAsState)深入剖析 一、引言 在现代 Android 应用开发中,构建响应式和动态的用户界面是至关重要的。Android Compose 作为新一代的声明式 UI 工具包,为开发者提供了一种简…...

3. 轴指令(omron 机器自动化控制器)——>MC_SetPosition

机器自动化控制器——第三章 轴指令 11 MC_SetPosition变量▶输入变量▶输出变量▶输入输出变量 功能说明▶时序图▶重启动运动指令▶多重启运动指令▶异常 MC_SetPosition 将轴的指令当前位置和反馈当前位置变更为任意值。 指令名称FB/FUN图形表现ST表现MC_SetPosition当前位…...

easyExcel2.2.10中为0数据显示为空

在 EasyExcel 2.2.10 中,如果希望将数值为 0 的数据在 Excel 中显示为空(即不显示 0),可以通过以下方法实现: 1. 使用 ExcelProperty 的 format 参数 通过设置单元格格式为 #(# 会忽略 0)&…...