Python闭包:解锁函数式编程的隐藏力量

Python闭包:解锁函数式编程的隐藏力量

——从入门到精通,10个经典场景带你玩转闭包!

内容摘要

本文包括两个部分:

  • 基础速递:浓缩的Python闭包知识点。
  • 经典示例:10 个闭包应用范例。

一、基础速递

1. 什么是Python的闭包?

闭包(Closure)是指在一个函数内部定义的函数,并且这个内部函数引用了外部函数的变量。闭包允许内部函数在外部函数执行完毕后,仍然可以访问和操作外部函数的局部变量。

2. 闭包的作用

  • 数据封装:闭包可以用于封装数据,避免使用全局变量。
  • 保持状态:闭包可以在函数调用之间保持状态,类似于类的实例变量。
  • 函数工厂:闭包可以用于创建定制化的函数。

3. 代码示例

def outer_function(x):def inner_function(y):return x + yreturn inner_function# 创建一个闭包
closure = outer_function(10)# 调用闭包
result = closure(5)
print(result)  # 输出 15

解释

  • outer_function:这是一个外部函数,接受一个参数 x
  • inner_function:这是一个内部函数,接受一个参数 y,并返回 x + y
  • closure = outer_function(10):调用 outer_function 并传入 10,返回 inner_function,此时 x 被设置为 10
  • closure(5):调用 inner_function 并传入 5,返回 10 + 5,即 15

4. 另一个示例:计数器

def counter():count = 0def increment():nonlocal countcount += 1return countreturn increment# 创建一个闭包
counter1 = counter()# 调用闭包
print(counter1())  # 输出 1
print(counter1())  # 输出 2
print(counter1())  # 输出 3

解释

  • counter:这是一个外部函数,初始化一个变量 count0
  • increment:这是一个内部函数,每次调用时增加 count 的值并返回。
  • counter1 = counter():调用 counter 函数,返回 increment 函数,此时 count 被初始化为 0
  • counter1():每次调用 counter1 时,count 的值都会增加并返回。

5. 小结

闭包是Python中一个强大的特性,允许函数在调用之间保持状态,并且可以用于创建定制化的函数。通过闭包,可以实现数据封装和状态保持,避免使用全局变量。


二、经典示例

以下是关于闭包的 10 个经典应用场景,每个场景都附有完整代码、解释、测试案例和执行结果。

1. 累加器

闭包可以用来实现一个累加器,每次调用时进行累加。

def create_accumulator():total = 0  # 内部状态,用于存储累加结果def accumulator(value):nonlocal total  # 声明使用外部函数的变量total += value  # 累加值return total    # 返回当前累加结果return accumulator  # 返回内部函数# 测试案例
acc = create_accumulator()  # 创建累计器# 测试1:初始累加
print(acc(10))  # 输出: 10
print(acc(20))  # 输出: 30
print(acc(30))  # 输出: 60

2. 函数工厂

闭包可以用于创建定制化的函数。

def power_factory(exponent):def power(base):return base ** exponentreturn power# 测试
square = power_factory(2)
cube = power_factory(3)
print(square(4))  # 输出: 16
print(cube(3))    # 输出: 27

3. 缓存(Memoization)

闭包可以用于实现缓存功能,避免重复计算。

def memoize(func):cache = {}def wrapper(*args):if args not in cache:cache[args] = func(*args)return cache[args]return wrapper# 测试
@memoize
def fibonacci(n):if n <= 1:return nreturn fibonacci(n-1) + fibonacci(n-2)print(fibonacci(10))  # 输出: 55

4. 事件处理器

闭包可以用于创建动态的事件处理器。

def create_event_handler(message):def event_handler():print(message)return event_handler# 测试
handler1 = create_event_handler("Button 1 clicked!")
handler2 = create_event_handler("Button 2 clicked!")
handler1()  # 输出: Button 1 clicked!
handler2()  # 输出: Button 2 clicked!

5. 私有变量

闭包可以模拟私有变量,避免直接访问。

def private_variable(initial_value):value = initial_valuedef getter():return valuedef setter(new_value):nonlocal valuevalue = new_valuereturn getter, setter# 测试
get_value, set_value = private_variable(10)
print(get_value())  # 输出: 10
set_value(20)
print(get_value())  # 输出: 20

6. 延迟计算

闭包可以用于延迟计算,直到需要时才执行。

def lazy_computation(func):def wrapper():return func()return wrapper# 测试
def expensive_operation():print("Performing expensive operation...")return 42lazy_value = lazy_computation(expensive_operation)
print("Lazy value created, but not computed yet.")
print(lazy_value())  # 输出: Performing expensive operation... 42

7. 装饰器

闭包是实现装饰器的基础。

def logger(func):def wrapper(*args, **kwargs):print(f"Calling {func.__name__} with {args}, {kwargs}")result = func(*args, **kwargs)print(f"{func.__name__} returned {result}")return resultreturn wrapper# 测试
@logger
def add(a, b):return a + bprint(add(3, 5))  # 输出: Calling add with (3, 5), {} \n add returned 8 \n 8

8. 状态机

闭包可以用于实现简单的状态机。

def state_machine(initial_state):state = initial_statedef transition(new_state):nonlocal statestate = new_statedef current_state():return statereturn transition, current_state# 测试
transition, current_state = state_machine("off")
print(current_state())  # 输出: off
transition("on")
print(current_state())  # 输出: on

9. 回调函数

闭包可以用于创建动态的回调函数。

def create_callback(message):def callback():print(message)return callback# 测试
callback1 = create_callback("Task 1 completed!")
callback2 = create_callback("Task 2 completed!")
callback1()  # 输出: Task 1 completed!
callback2()  # 输出: Task 2 completed!

10. 配置函数

闭包可以用于创建配置化的函数。

def configure_multiplier(factor):def multiplier(x):return x * factorreturn multiplier# 测试
double = configure_multiplier(2)
triple = configure_multiplier(3)
print(double(5))  # 输出: 10
print(triple(5))  # 输出: 15

小结

闭包在Python中有广泛的应用场景,包括累加器、函数工厂、缓存、事件处理器、私有变量、延迟计算、装饰器、状态机、回调函数和配置函数等。通过闭包,可以实现更灵活和强大的功能,同时保持代码的简洁性和可读性。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【大模型LLM面试合集】大语言模型架构_MHA_MQA_GQA

MHA_MQA_GQA 1.总结 在 MHA&#xff08;Multi Head Attention&#xff09; 中&#xff0c;每个头有自己单独的 key-value 对&#xff1b;标准的多头注意力机制&#xff0c;h个Query、Key 和 Value 矩阵。在 MQA&#xff08;Multi Query Attention&#xff09; 中只会有一组 k…

【Transformer】手撕Attention

import torch from torch import nn import torch.functional as F import mathX torch.randn(16,64,512) # B,T,Dd_model 512 # 模型的维度 n_head 8 # 注意力头的数量多头注意力机制 class multi_head_attention(nn.Module): def __init__(self, d_model, n_hea…

【Linux】 冯诺依曼体系与计算机系统架构全解

Linux相关知识点可以通过点击以下链接进行学习一起加油&#xff01;初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建GDB调试器与Git版本控制工具Linux下进度条 冯诺依曼体系是现代计算机设计的基石&#xff0c;其统一存储和顺序执行理念推动…

冯·诺依曼体系结构

目录 冯诺依曼体系结构推导 内存提高冯诺依曼体系结构效率的方法 你使用QQ和朋友聊天时&#xff0c;整个数据流是怎么流动的&#xff08;不考虑网络情况&#xff09; 与冯诺依曼体系结构相关的一些知识 冯诺依曼体系结构推导 计算机的存在就是为了解决问题&#xff0c;而解…

全面认识了解DeepSeek+利用ollama在本地部署、使用和体验deepseek-r1大模型

文章目录 一、DeepSeek简介二、技术特点三、架构设计3.1、DeepSeek-V33.2、DeepSeek-V23.3、DeepSeek-R1 四、DeepSeek算法4.1、DeepSeek LLM 算法4.2、DeepSeek-V2 算法4.3、DeepSeek-R1 算法4.4、DeepSeek 在算力优化上的算法 五、DeepSeek的使用六、本地部署DeepSeek R1模型…

Python 梯度下降法(七):Summary

文章目录 Python 梯度下降法&#xff08;七&#xff09;&#xff1a;Summary一、核心思想1.1 核心思想1.2 优化方法概述1.3 第三方库的使用 二、 BGD2.1 介绍2.2 torch 库算法2.2 代码示例2.3 SGD2.4 SGD代码示例2.5 MBGD2.6 MBGD 代码示例 三、 Adagrad3.1 介绍3.2 torch 库算…

SpringBoot Web开发(SpringMVC)

SpringBoot Web开发&#xff08;SpringMVC) MVC 核心组件和调用流程 Spring MVC与许多其他Web框架一样&#xff0c;是围绕前端控制器模式设计的&#xff0c;其中中央 Servlet DispatcherServlet 做整体请求处理调度&#xff01; . 除了DispatcherServletSpringMVC还会提供其他…

Web_php_unserialize

代码审计 <?php class Demo { private $file index.php;public function __construct($file) { $this->file $file; }、 //接收一个参数 $file 并赋值给私有属性 $filefunction __destruct() { echo highlight_file($this->file, true); } //在对象销毁时调用&…

Spring Web MVC基础第一篇

目录 1.什么是Spring Web MVC&#xff1f; 2.创建Spring Web MVC项目 3.注解使用 3.1RequestMapping&#xff08;路由映射&#xff09; 3.2一般参数传递 3.3RequestParam&#xff08;参数重命名&#xff09; 3.4RequestBody&#xff08;传递JSON数据&#xff09; 3.5Pa…

安装anaconda3 后 电脑如何单独运行python,python还需要独立安装吗?

安装anaconda3 后 电脑如何单独运行python&#xff0c;python还需要独立安装吗? 电脑第一此安装anaconda用于jupyter notebook使用。 但是在运行cmd的时候&#xff0c;输入python --version 显示未安装或跳转商店提示安装。 明明我可以运行python但是为什么cmd却说我没安装呢…

分布式事务组件Seata简介与使用,搭配Nacos统一管理服务端和客户端配置

文章目录 一. Seata简介二. 官方文档三. Seata分布式事务代码实现0. 环境简介1. 添加undo_log表2. 添加依赖3. 添加配置4. 开启Seata事务管理5. 启动演示 四. Seata Server配置Nacos1. 修改配置类型2. 创建Nacos配置 五. Seata Client配置Nacos1. 增加Seata关联Nacos的配置2. 在…

使用真实 Elasticsearch 进行高级集成测试

作者&#xff1a;来自 Elastic Piotr Przybyl 掌握高级 Elasticsearch 集成测试&#xff1a;更快、更智能、更优化。 在上一篇关于集成测试的文章中&#xff0c;我们介绍了如何通过改变数据初始化策略来缩短依赖于真实 Elasticsearch 的集成测试的执行时间。在本期中&#xff0…

OpenEuler学习笔记(十四):在OpenEuler上搭建.NET运行环境

一、在OpenEuler上搭建.NET运行环境 基于包管理器安装 添加Microsoft软件源&#xff1a;运行命令sudo rpm -Uvh https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm&#xff0c;将Microsoft软件源添加到系统中&#xff0c;以便后续能够从该源安装.…

基于Python的简单企业维修管理系统的设计与实现

以下是一个基于Python的简单企业维修管理系统的设计与实现&#xff0c;这里我们会使用Flask作为Web框架&#xff0c;SQLite作为数据库来存储相关信息。 1. 需求分析 企业维修管理系统主要功能包括&#xff1a; 维修工单的创建、查询、更新和删除。设备信息的管理。维修人员…

Van-Nav:新年,将自己学习的项目地址统一整理搭建自己的私人导航站,供自己后续查阅使用,做技术的同学应该都有一个自己网站的梦想

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 Van-Nav是一个基于Vue.js开发的导航组件库&#xff0c;它提供了多种预设的样式和灵活的配置选项&#xff0c;使得开发者可以轻松地定制出符合项目需求…

Android 音视频编解码 -- MediaCodec

引言 如果我们只是简单玩一下音频、视频播放&#xff0c;那么使用 MediaPlayer SurfaceView 播放就可以了&#xff0c;但如果想加个水印&#xff0c;加点其他特效什么的&#xff0c;那就不行了&#xff1b; 学习 Android 自带的硬件码类 – MediaCodec。 MediaCodec 介绍 在A…

UE 5.3 C++ 对垃圾回收的初步认识

一.UObject的创建 UObject 不支持构造参数。 所有的C UObject都会在引擎启动的时候初始化&#xff0c;然后引擎会调用其默认构造器。如果没有默认的构造器&#xff0c;那么 UObject 将不会编译。 有修改父类参数的需求&#xff0c;就使用指定带参构造 // Sets default value…

使用LLaMA-Factory对AI进行认知的微调

使用LLaMA-Factory对AI进行认知的微调 引言1. 安装LLaMA-Factory1.1. 克隆仓库1.2. 创建虚拟环境1.3. 安装LLaMA-Factory1.4. 验证 2. 准备数据2.1. 创建数据集2.2. 更新数据集信息 3. 启动LLaMA-Factory4. 进行微调4.1. 设置模型4.2. 预览数据集4.3. 设置学习率等参数4.4. 预览…

2025最新源支付V7全套开源版+Mac云端+五合一云端

2025最新源支付V7全套开源版Mac云端五合一云端 官方1999元&#xff0c; 最新非网上那种功能不全带BUG开源版&#xff0c;可以自己增加授权或二开 拥有卓越的性能和丰富的功能。它采用全新轻量化的界面UI&#xff0c;让您能更方便快捷地解决知识付费和运营赞助的难题 它基于…

Linux02——Linux的基本命令

目录 ls 常用选项及功能 综合示例 注意事项 cd和pwd命令 cd命令 pwd命令 相对路径、绝对路径和特殊路径符 特殊路径符号 mkdir命令 1. 功能与基本用法 2. 示例 3. 语法与参数 4. -p选项 touch-cat-more命令 1. touch命令 2. cat命令 3. more命令 cp-mv-rm命…