Python学习(11) ----- Python的泛型

在 Python 中,泛型(Generics) 的概念主要用于 类型注解(type hints) ,帮助开发者在静态类型检查时(例如使用 mypypyright)获得更精确的类型推断。

泛型不影响程序的运行行为 ,而是让代码在 语义上更清晰、更安全


🧠 一、泛型是什么?

泛型的核心思想:

"一个类型对多种数据类型通用"。

例如,List[int] 表示一个只能装 int 的列表,
List[str] 表示一个只能装 str 的列表。

这可以防止混用类型的错误:

python 复制代码
from typing import List

def sum_list(numbers: List[int]) -> int:
    return sum(numbers)

print(sum_list([1, 2, 3]))   # ✅ 正常
print(sum_list(["a", "b"]))  # ❌ 类型检查器会报错

🧩 二、使用泛型类型(TypeVar)

TypeVar 用于声明一个泛型参数:

python 复制代码
from typing import TypeVar, List

T = TypeVar("T")  # 声明一个泛型类型变量

def first_element(elements: List[T]) -> T | None:
    if elements:
        return elements[0]
    return None

🔹 用法说明:

  • T 表示一个"占位类型";
  • 函数返回的类型与输入 List[T] 的元素类型一致;
  • 当传入 List[int] 时,返回值类型自动推断为 int
python 复制代码
print(first_element([1, 2, 3]))    # 返回 int
print(first_element(["a", "b"]))   # 返回 str

🧱 三、在类中使用泛型

泛型类可以让类在定义时不固定数据类型:

python 复制代码
from typing import Generic, TypeVar

T = TypeVar("T")

class Box(Generic[T]):
    def __init__(self, value: T):
        self.value = value

    def get(self) -> T:
        return self.value

✅ 使用时指定类型:

python 复制代码
box1 = Box 
box2 = Box[str]("hello")

print(box1.get())  # int
print(box2.get())  # str

⚙️ 四、带约束的泛型

可以通过 bound 或者 constraints 限制泛型类型:

1️⃣ bound(上界约束)

python 复制代码
from typing import TypeVar

class Animal:
    def speak(self):
        print("Animal sound")

class Dog(Animal):
    def speak(self):
        print("Woof!")

T = TypeVar("T", bound=Animal)

def make_speak(animal: T) -> None:
    animal.speak()

make_speak(Dog())    # ✅ OK
make_speak(Animal()) # ✅ OK
# make_speak("string") ❌ 报类型错误

2️⃣ constraints(多类型约束)

python 复制代码
from typing import TypeVar

T = TypeVar("T", int, float)  # 只能是 int 或 float

def double(x: T) -> T:
    return x * 2

print(double(10))    # ✅ int
print(double(3.14))  # ✅ float
# print(double("a")) ❌ 类型检查失败

🧩 五、常用泛型容器

Python 的标准库 typing 模块已经提供了许多泛型容器:

泛型类型 说明
List[T] 列表
Dict[K, V] 字典
Tuple[T, ...] 元组
Set[T] 集合
Iterable[T] 可迭代对象
Optional[T] TNone
Union[A, B] AB

例如:

python 复制代码
from typing import Dict, List, Optional, Union

def process_data(data: Dict[str, List[int]]) -> Optional[Union[int, float]]:
    if "scores" in data:
        return sum(data["scores"]) / len(data["scores"])
    return None

🧭 六、Python 3.9+ 简写语法

在 Python 3.9 之后,可以用更简洁的语法:

python 复制代码
# 旧写法
from typing import List, Dict
def f1(data: List[int]) -> Dict[str, int]:
    ...

# 新写法(推荐)
def f2(data: list[int]) -> dict[str, int]:
    ...

✅ 小结

概念 用法示例
定义泛型变量 T = TypeVar("T")
泛型函数 def func(x: T) -> T:
泛型类 class Box(Generic[T]):
约束类型 TypeVar("T", bound=Base)TypeVar("T", int, float)
内置泛型容器 list[T], dict[K, V], tuple[T, ...]

相关推荐
专业程序开发源11 分钟前
springboot篮球联赛管理系统13635-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计
lie..14 分钟前
30天从零开始学AI应用开发(Day 3):30 分钟搭好开发环境,Python + VSCode 一次配齐
人工智能·python·大模型
benchmark_cc30 分钟前
策略临时需要一批股票的最新价格,先查行情还是先建股票池?——从量化策略执行逻辑看数据获取顺序
python·数据分析·pandas·量化交易·股票数据·quantdash
成为深度学习高手32 分钟前
XLinear:用一个轻量 MLP,带外生变量做长期时间序列预测
python·深度学习·时序数据库
啊吧怪不啊吧1 小时前
LangChain之模型调用
python·langchain
溪语流沙1 小时前
Django + Vue电商项目第001讲:开篇|注册登录加增删改查,那不是电商
redis·python·mysql·docker·typescript·django·vue
csdn_aspnet1 小时前
Windows 如何隐藏 IIS Web 服务响应头中的 IIS Server 版本信息
windows·iis·url rewrite
PNP Robotics1 小时前
【PNP具身解读】GPT6 Astra:具身智能新范式,大模型 + Franka机器人快速落地验证一、GPT6 Astra 背后的布局、数据与具身方向
人工智能·学习·机器学习·机器人
夜雪一千1 小时前
如何使用BeautifulSoup库来提取HTML中的特定元素
python
IT毕设梦工厂1 小时前
计算机毕业设计选题推荐:基于大数据的城市空气污染物浓度数据分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·python·信息可视化·数据挖掘·数据分析·课程设计·数据可视化