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

news2025/3/26 2:06:23

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

### 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 代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

zookeeper使用

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

使用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 ​ 一看头像是个印度佬,自吹——又快又好。那就试试吧。 安装步骤 安装…

【蓝桥杯速成】| 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…

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

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

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

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

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

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

预测数值型数据:回归

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

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

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

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

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

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

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

Python+Requests+Pytest+YAML+Allure接口自动化框架

GitHub源码地址(详细注释):源码 调试项目python自主搭建:附项目源码 一、项目介绍 本项目是基于 PythonRequestsPytestYAMLAllure 搭建的 接口自动化测试框架,用于对 REST API 进行测试。 框架的主要特点包括&#…

用 Python 也能做微服务?

一、Python 和微服务,是敌是友? Python 因其极强的开发效率与生态,一直是数据处理、AI、Web 开发的主力选手。但在“微服务”这个领域,它一直处于边缘地带: 服务注册 / 发现?🤷‍♂️ 没有统一…