Python泛型编程:TypeVar和Generic详解 - 写给初学者的指南

Python泛型编程:TypeVar和Generic详解 - 写给初学者的指南

    • 前言
    • 1. 为什么需要泛型?
    • 2. TypeVar:定义泛型类型变量
    • 3. Generic:创建泛型类
    • 4. 多个泛型类型变量
    • 5. 使用场景小结
    • 结语

前言

大家好!今天我们来聊一聊Python中的泛型编程。想象一下,泛型就像是一个"万能盒子",可以装不同类型的东西,但又保持它的灵活性和类型安全。听起来很酷,对吧?

1. 为什么需要泛型?

在编程中,我们经常需要编写可以处理多种类型数据的函数或类。比如,你希望创建一个函数,无论是处理整数、字符串还是自定义对象,都能正常工作。这就是泛型发挥作用的地方!

2. TypeVar:定义泛型类型变量

TypeVar就像是一个类型的"通行证",它允许你定义可以接受不同类型的变量。

from typing import TypeVar, Generic# 定义一个泛型变量T
T = TypeVar('T')# 创建一个泛型函数
def get_first_item(items: list[T]) -> T:"""获取列表的第一个元素"""if items:return items[0]raise ValueError("列表为空")# 使用示例
numbers = [1, 2, 3, 4, 5]
words = ['apple', 'banana', 'cherry']print(get_first_item(numbers))  # 输出: 1
print(get_first_item(words))    # 输出: apple

3. Generic:创建泛型类

我们可以使用Generic创建支持多种类型的类。想象一下,我们要创建一个可以存储任何类型数据的"魔法盒子"。

from typing import TypeVar, Generic# 定义泛型变量
T = TypeVar('T')class MagicBox(Generic[T]):def __init__(self):self._items = []def add_item(self, item: T):"""添加物品到盒子"""self._items.append(item)def get_items(self) -> list[T]:"""获取盒子中的所有物品"""return self._itemsdef get_first_item(self) -> T:"""获取第一个物品"""if self._items:return self._items[0]raise ValueError("盒子是空的")# 创建不同类型的魔法盒子
number_box = MagicBox[int]()
number_box.add_item(10)
number_box.add_item(20)
print(number_box.get_items())  # 输出: [10, 20]string_box = MagicBox[str]()
string_box.add_item("Hello")
string_box.add_item("World")
print(string_box.get_items())  # 输出: ['Hello', 'World']

4. 多个泛型类型变量

我们还可以使用多个泛型类型变量,就像有多个"通行证"。

from typing import TypeVar, GenericK = TypeVar('K')  # Key类型
V = TypeVar('V')  # Value类型class SuperDict(Generic[K, V]):def __init__(self):self._data = {}def add_pair(self, key: K, value: V):"""添加键值对"""self._data[key] = valuedef get_value(self, key: K) -> V:"""根据键获取值"""return self._data.get(key)# 创建不同类型的超级字典
name_age_dict = SuperDict[str, int]()
name_age_dict.add_pair("Alice", 25)
name_age_dict.add_pair("Bob", 30)
print(name_age_dict.get_value("Alice"))  # 输出: 25code_language_dict = SuperDict[int, str]()
code_language_dict.add_pair(1, "Python")
code_language_dict.add_pair(2, "Java")
print(code_language_dict.get_value(1))  # 输出: Python

5. 使用场景小结

泛型适用的典型场景:

  • 创建可重用的数据结构
  • 编写灵活且类型安全的函数
  • 设计支持多种类型的类

结语

通过泛型,我们可以编写更加灵活、安全和可读的代码。就像万能盒子可以装不同的玩具,泛型可以让我们的代码处理各种类型的数据!

提示:这些示例都是可以直接运行的,大家可以复制代码到Python环境中尝试。

希望这篇文章帮助你理解了Python中的泛型编程!

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

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

相关文章

C/C++流星雨

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C/C…

ModelScope-Agent(1): 基于开源大语言模型的可定制Agent系统

目录 简介快速入门 简介 github地址 快速入门 看前两篇,调用千问API和天气API # 选用RolePlay 配置agent from modelscope_agent.agents.role_play import RolePlay # NOQArole_template 你扮演一个天气预报助手,你需要查询相应地区的天气&#x…

【模型对比】ChatGPT vs Kimi vs 文心一言那个更好用?数据详细解析,找出最适合你的AI辅助工具!

在这个人工智能迅猛发展的时代,AI聊天助手已经深入我们的工作与生活。你是否曾在选择使用ChatGPT、Kimi或是百度的文心一言时感到一头雾水?每款AI都有其独特的魅力与优势,那么,究竟哪一款AI聊天助手最适合你呢?本文将带…

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算

微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…

SQL——DQL分组聚合

分组聚合: 格式: select 聚合函数1(聚合的列),聚合函数2(聚合的列) from 表名 group by 标识列; ###若想方便分辨聚合后数据可在聚合函数前加上标识列(以标识列进行分组) 常见的聚合函数: sum(列名):求和函数 avg(列名)…

maven打包时出现找不到符号的错误如何解决

在maven打包的时候有时会出现找不到符号的情况,具体原因是由于引用的BaseEntity是framework模块下的实体类,所以需要将framework重新clean再install,成功后再将我们的模块打包就成功了

openGauss开源数据库实战二十一

文章目录 任务二十一 使用JDBC访问openGauss数据库任务目标实施步骤一、准备工作 二、下载并安装JavaSE81 下载JavaSE8安装Java8SE并配置环境变量 三、下载并安装eclipse四、下载并安装openGauss的JDBC驱动包五、使用IDEA编写JDBC测试程序1 使用IDEA的SSH连接虚拟机2 创建项目并…

Git:常用命令

一、查看当前分支 git branch 二、查看所有分支 git branch -a 三、切换到远程分支 git checkout origin/分支名 示例:git checkout origin/dev 四、拉取远程分支代码 git pull origin 分支名 示例:git pull origin dev 五、常用指令 查看暂存区…

运维实战:K8s 上的 Doris 高可用集群最佳实践

今天我们将深入探讨::如何在 K8s 集群上部署 Compute storage coupled(存算耦合) 模式的 Doris 高可用集群? 本文,我将为您提供一份全面的实战指南,逐步引导您完成以下关键任务: 配…

在GITHUB上传本地文件指南(详细图文版)

这份笔记简述了如何在GITHUB上上传文件夹的详细策略。 既是对自己未来的一个参考,又希望能给各位读者带来帮助。 详细步骤 打开目标文件夹(想要上传的文件夹) 右击点击git bash打开 GitHub创立新的仓库后,点击右上方CODE绿色按…

Vue框架入门

Author:Dawn_T17?? 目录 什么是框架 一.Vue 的使用方向 二.Vue 框架的使用场景 (TIP)MVVM思想 三.Vue入门案例 TIP:插值表达式 四.Vue-指令? (1)v-bind 和 v-model? ? (2&#x…

FPGA 遍历读 LMK04803 寄存器

主要思路: 1.使用 VIO 输出信号控制什么时候开始读LMK04803寄存器 2.遍历LMK04803所有寄存器,将读到的每个寄存器的值显示在VIO上。 3.遍历指的是 从 R0 开始读,R0读完接着读 R1,一直到R31 结束 4.注意的是写寄存器是 32bit &…

【uni-app 微信小程序】新版本发布提示用户进行更新

知识准备 uni.getUpdateManager文档介绍 不支持APP与H5,所以在使用的时候要做好平台类型的判断,如何判断,参考条件编译处理多端差异 代码参考 export const updateApp () > {const updateManager uni.getUpdateManager()updateManag…

vue实现点击左右按钮横向滚动

html部分 <div ref"tabHeaderRef" class"flex items-center tabs_header"><div class"tab-pre" v-if"hidePre" click"leftPre"><i class"el-icon-arrow-left"></i></div><div r…

数据结构(3)单链表的模拟实现

上一节我们进行了数据结构中的顺序表的模拟式现&#xff0c;今天我们来实现一下另外一个数据结构&#xff1a;单链表。 我们在实现顺序表之后一定会引发一些问题和思考&#xff1a; 1.顺序表在头部和中间插入数据会用到循环&#xff0c;时间复杂O&#xff08;N&#xff09; …

uni-app 组成和跨端原理 【跨端开发系列】

&#x1f517; uniapp 跨端开发系列文章&#xff1a;&#x1f380;&#x1f380;&#x1f380; uni-app 组成和跨端原理 【跨端开发系列】 uni-app 各端差异注意事项 【跨端开发系列】uni-app 离线本地存储方案 【跨端开发系列】uni-app UI库、框架、组件选型指南 【跨端开…

操作系统:中断与处理器调度

目录 1、中断与中断系统 中断概念&#xff1a; 中断装置&#xff1a; 中断相关概念&#xff1a; 中断优先级别与中断屏蔽 2、处理机&#xff08;CPU&#xff09;调度 调度相关参数&#xff1a;P62 调度算法&#xff1a; 处理机调度时机 处理机调度过程 3、调度级别与多…

两种距离度量简记

一、Lp距离/Minkowski 距离&#xff08;Minkowski distance&#xff09; 1、Lp距离&#xff1a; 特征空间中两个实例点的距离是两个实例点相似程度的反映。Lp距离是一种一般化的距离度量 设特征空间x是n维实数向量空间Rn xi&#xff0c;xj的Lp距离定义为&#xff08;p>1&…

从零开始的使用SpringBoot和WebSocket打造实时共享文档应用

在现代应用中&#xff0c;实时协作已经成为了非常重要的功能&#xff0c;尤其是在文档编辑、聊天系统和在线编程等场景中。通过实时共享文档&#xff0c;多个用户可以同时对同一份文档进行编辑&#xff0c;并能看到其他人的编辑内容。这种功能广泛应用于 Google Docs、Notion 等…

centos7 离线安装7z

1、下载7-Zip 下载地址&#xff1a;7-Zip - 程序下载 2、解压 mkdir 7zip --创建文件夹7zip mv 7z2301-linux-x64.tar.xz 7zip/ --移动 cd 7zip tar -xvJf 7z2301-linux-x64.tar.xz --解压 输入ll 查看解压后的文件 3、安装cp 7zzs /usr/local/bin/ 输入7zzs 查看是否安装成功…