完整教程:Python3:Fifteenth 类型注解(Type Hints)

news/2026/1/18 19:04:47/文章来源:https://www.cnblogs.com/ljbguanli/p/19498956

完整教程:Python3:Fifteenth 类型注解(Type Hints)

  • 想象一下,你给朋友寄一个包裹。如果你在包裹上写明"易碎品"和"向上箭头",快递员就会知道要小心轻放、正确朝向
  • 类型注解(Type Hints) 在编程中就扮演着类似的角色——它是一种为代码添加"说明标签"的技术,明确地指出变量、函数参数和返回值应该是什么数据类型

一、概述

简单来说,类型注解就是在代码中注明数据类型的语法,它的核心目的是

  • 提高代码可读性:让他人(以及未来的你)一眼就能看懂代码的意图
  • 便于静态检查:在运行代码前,通过工具发现潜在的类型错误
  • 增强IDE支持:让代码编辑器提供更准确的自动补全和提示

一个简单的例子

# 没有类型注解
def greet(name):return f"Hello, {name}"
# 有类型注解
def greet(name: str) -> str:return f"Hello, {name}"

二、为什么需要类型注解?

Python 以其动态类型特性而闻名——你不需要提前声明变量的类型,解释器会在运行时自动推断。这虽然灵活,但也带来了问题:

  1. 代码难以理解:看到一个函数时,不清楚应该传入什么类型的数据
  2. 隐藏的bug:可能不小心传入了错误类型,直到运行时才报错
  3. 开发效率低:IDE无法提供准确的代码提示和补全

类型注解通过提供可选的类型信息来解决这些问题,让你的代码更加健壮可维护

三、基础语法详解

变量注解

从 Python 3.6 开始,你可以直接为变量添加类型注解

# 没有类型注解的代码
name = "Alice"
age = 30
is_student = False
scores = [95, 88, 91]
# 有类型注解的代码
name: str = "Alice"       # 注解为字符串 (str)
age: int = 30             # 注解为整数 (int)
is_student: bool = False  # 注解为布尔值 (bool)
scores: list = [95, 88, 91] # 注解为列表 (list)

说明:name: str 读作"变量 name 的类型是 str"

函数注解

在函数参数后加 : 类型

# 没有类型注解的函数
def greet(first_name, last_name):full_name = first_name + " " + last_namereturn "Hello, " + full_name
# 有类型注解的函数
def greet(first_name: str, last_name: str) -> str:full_name = first_name + " " + last_namereturn "Hello, " + full_name

解读这个函数

  • first_name: str:参数 first_name 应该是字符串
  • last_name: str:参数 last_name 应该是字符串
  • -> str:这个函数执行后会返回一个字符串

现在,任何人调用这个函数时,都能清晰地知道需要传递什么,以及会得到什么

函数注解是类型注解最常见的应用场景

def add_numbers(a: int, b: int) -> int:"""将两个整数相加并返回结果"""return a + b
# 调用函数
print(add_numbers(5, 3) ) # 正确:两个整数
# result = add_numbers("5", "3")  # 可能有问题:虽然能运行,但类型检查器会警告

参数默认值

可以同时使用类型注解和默认值

def say_hello(name: str, times: int = 1) -> str:"""向某人问好指定次数"""return " ".join([f"Hello, {name}!"] * times)
print(say_hello("Bob"))      # 输出:Hello, Bob!
print(say_hello("Alice", 3)) # 输出:Hello, Alice! Hello, Alice! Hello, Alice!

四、复杂类型注解

基本的 str, int, list 很好用,如果我们想表达"一个由整数组成的列表",就需要 Python 的 typing 模块提供更强大的工具

列表、字典等容器类型

from typing import List, Dict, Tuple, Set
# List[int] 表示这是一个只包含整数的列表
numbers: List[int] = [1, 2, 3, 4, 5]
# Dict[str, int] 表示这是一个键为字符串、值为整数的字典
student_scores: Dict[str, int] = {"Alice": 95, "Bob": 88}
# Tuple[int, str, bool] 表示这是一个包含整数、字符串、布尔值的元组
person_info: Tuple[int, str, bool] = (25, "Alice", True)
# Set[str] 表示这是一个只包含字符串的集合
unique_names: Set[str] = {"Alice", "Bob", "Charlie"}

可选类型(Optional)

当值可能是某种类型或者是 None 时使用

from typing import Optional
def find_student(name: str) -> Optional[str]:"""根据名字查找学生,可能找到也可能返回None"""students = {"Alice": "A001", "Bob": "B002"}return students.get(name)  # 可能返回字符串或None
# 等价于 Union[str, None]

联合类型(Union)

当值可能是多种类型之一时使用

from typing import Union
def process_input(data: Union[str, int, List[int]]) -> None:"""处理可能是字符串、整数或整数列表的输入"""if isinstance(data, str):print(f"字符串: {data}")elif isinstance(data, int):print(f"整数: {data}")elif isinstance(data, list):print(f"列表: {data}")
process_input("hello")    # 输出:字符串: hello
process_input(42)         # 输出:整数: 42
process_input([1, 2, 3])  # 输出:列表: [1, 2, 3]

六、类型检查实战

使用 Mypy 进行静态类型检查

Mypy 是最流行的 Python 类型检查器。首先安装它

pip install mypy

假设我们有一个有潜在类型问题的文件 

def add_numbers(a: int, b: int) -> int:return a + b
result = add_numbers("5", "3")  # 这里有问题!传入了字符串

运行 mypy 检查

mypy 文件名.py

这里使用的pycharm项目中的终端,使用cmd命令行也是可以的

在 IDE 中实时检查

现代 IDE(如 VS Code、PyCharm)都内置了类型检查支持

  1. 错误高亮:类型不匹配的代码会被标记出来
  2. 智能提示:输入代码时会显示参数和返回值的类型信息
  3. 自动补全:基于类型信息提供更准确的代码补全建议

七、最佳实践指南

1. 渐进式采用

  • 从新代码开始使用类型注解
  • 逐步为重要的旧代码添加注解
  • 不需要一次性为所有代码添加类型

2. 保持一致性

  • 在项目中保持统一的注解风格
  • 团队协商决定注解的详细程度

3. 避免过度注解

# 不推荐:过于明显的类型不需要注解
x: int = 5  # 5明显是整数,可以省略注解
# 推荐:为复杂逻辑或公共接口添加注解
def calculate_statistics(data: List[float]) -> Dict[str, float]:
    """计算数据的各种统计指标"""
    # 复杂实现...

4. 处理第三方库

对于没有类型注解的第三方库,可以:

  • 查看是否有对应的类型存根文件(通常叫 types-packageName
  • 使用 Any 类型暂时绕过检查
  • 或者为常用函数添加自己的类型注解

常见问题解答

类型注解会影响性能吗?

不会

类型注解在运行时会被忽略,只用于静态分析和开发工具

必须使用类型注解吗?

不强制

Python 仍然是动态类型语言,类型注解是可选的

强烈推荐使用,特别是大型项目

如果注解错了会怎么样?

类型检查器会报错,但程序仍然可以运行

注解只是"提示"而不是"强制"

八、总结与实践

通过一个综合练习来巩固所学

from typing import List, Dict, Optional, Union
def process_students(students: List[Dict[str, Union[str, int]]]) -> Optional[float]:"""处理学生数据,计算平均分数参数:students: 学生列表,每个学生是包含'name'和'score'的字典返回:平均分数(浮点数),如果没有学生则返回None"""if not students:return Nonetotal = 0for student in students:total += student['score']return total / len(students)
# 测试数据
students_data = [{"name": "Alice", "score": 95},{"name": "Bob", "score": 88},{"name": "Charlie", "score": 92}
]
average = process_students(students_data)
print(f"平均分: {average}")


内容借鉴于菜鸟教程,感谢

Python 类型注解(Type Hints) | 菜鸟教程https://www.runoob.com/python3/python-type-hints.html

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

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

相关文章

从零开始成为AI大模型产品经理:这份超全指南,建议立即收藏_AI模型产品经理学习路线

文章提供AI大模型产品经理七阶段学习路线:从计算机基础、编程语言、数学知识到机器学习、深度学习、NLP等核心技术,再到产品思维培养、数据驱动决策、技术选型与API集成,最后通过实战演练和软实力提升,帮助零基础人士系统掌握&quo…

告别代码!我用Trae氛围编程的方式,开发了一款公众号文章同步插件!

大家好,我是编程乐趣。我利用周末时间,没有写任何一行代码,用Trae氛围编程的方式,完成一个浏览器插件的开发。最大的感受是,未来编程方式,对阅读代码、代码语法、编程语言等能力变得不再重要,懂得与AI对方才是最…

AI大模型学习完整路线图:AI大模型学习全攻略,程序员必备的五阶段学习路线图

文章提供AI大模型学习的五阶段路线图:基础准备、机器学习核心、深度学习核心、专精方向和实践进阶。采用三步走战略:打好基础、深入核心、专精方向,强调实践与理论结合,并提供了具体学习资源和时间规划建议,帮助小白或…

TDengine C# 语言连接器进阶指南

本指南面向已完成“能连通、能读写”的开发者,补齐高级用法与易踩坑点。 1. 连接参数进阶与调优 WebSocket 连接增强参数 WebSocket 连接除基础参数外,还支持: connTimeout:连接超时(默认 1 分钟)readT…

Node.js和包管理工具

Node.js 和 npm 是现代 JavaScript 开发中两个密切相关但功能不同的工具。下面分别解释它们的定义以及它们之间的关系。 一、什么是 Node.js? Node.js 是一个基于 Chrome V8 JavaScript 引擎 构建的运行时环境(Runtime Environment)&#xff…

人工智能之数据分析 Pandas:第二章 Series - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

为什么大多数 LLM 在金融和医疗中会“系统性偏保守”

一个常见误解很多人认为:“模型在高风险场景中偏保守,是因为安全对齐或合规要求。”这只是表象。真正原因:执行态被风险信号劫持在缺乏执行态约束的系统中:风险词情绪词责任暗示会直接触发模型进入:防御 / 回避 / 模糊…

WSL2 Win11 Ubuntu22.04 D盘安装 参考的教程记录

主要参考这个教程下载:https://kwanwaipang.github.io/WSL/ 怎样移动到D盘:https://zhuanlan.zhihu.com/p/23313784318

企业内部模型上线前,必须补上的一项测试:执行态稳定性

一个现实问题很多企业在模型上线前,会测试:准确率延迟成本幻觉率但几乎不测试:执行态是否稳定为什么这是一个严重缺口因为事故往往不是:完全错误而是:执行态不一致上线前最小 Gate 清单(简化版)…

通用 LLM 执行态稳定性标准(Draft v1.0)Universal LLM Execution State Stability Standard · U-ESS v1.0 发布

好,这一步我会完全按 CSDN 的“工程师可读 不被当成情绪输出 不显得在挑事”的发布逻辑来做。 下面是 可直接发布到 CSDN 的成稿版本,不是草稿、不是概要,你复制即可发。通用 LLM 执行态稳定性标准(Draft v1.0)——高…

调色板示例颜色数据获取-基于 Flutter × OpenHarmony

文章目录调色板示例颜色数据获取-基于 Flutter OpenHarmony前言背景Flutter Harmony OpenHarmony 跨端开发介绍开发核心代码代码解析心得总结调色板示例颜色数据获取-基于 Flutter OpenHarmony 前言 在移动端开发中,颜色调色板是 UI 设计和视觉一致性的核心元素…

【多智能体控制】多智能体点对点转移的分布式模型预测控制【含Matlab源码 14976期】

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞…

UE 增强输入(2)

(10) (11) 谢谢

dify制作的工作流如何通过API调用

大家在基于dify开发Workflow和Agent,一般都是通过dify提供app功能直接提供使用,或者通过嵌入到其他页面中使用,但是还有一种情况,特别是针对各种数据处理的Workflow,需要通过程序调用,返回数据供其他app使用。该如何做呢?本文主要基于dify,将通过工作流发布的API,通过…

(5-2)UCLASS(..) 的参数

(12) (13) 谢谢

远程Ubantu Mysql安装 + 本地Windows Navicat连接

远程Ubantu Mysql安装 + 本地Windows Navicat连接安装过程 Mysql安装配置过程Mysql在ubantu安装直接使用apt命令安装sudo apt-get install mysql-server mysql-client -y启动mysql服务sudo systemctl start mysql使用r…

CCF T3

CCF T3 没什么太特殊的,注意到全局旋转操作复杂度太高,考虑打个懒标记进行局部旋转。(别忘了对翻转标记进行旋转,因为这么一个唐诗问题调了2h我也是神人了) #include<bits/stdc++.h> using namespace std; …

2026年国产时序数据库市场全景:从技术突破到行业落地

摘要&#xff1a; 进入2026年&#xff0c;在“数字中国”与工业物联网浪潮的强劲推动下&#xff0c;国产时序数据库市场持续繁荣&#xff0c;竞争格局日趋清晰。本文将对当前主流的国产时序数据库进行梳理盘点&#xff0c;并特别聚焦于金仓数据库&#xff08;Kingbase&#xff…

Ubuntu安装Lamp

Ubuntu安装Lamp本文将为您提供一个在Ubuntu服务器上搭建LAMP(Linux, Apache, MySQL, PHP)环境的完整指南。通过本文,您将学习如何安装和配置Apache、MySQL、PHP,并将您的PHP项目部署到服务器上。本文适用于Ubuntu …

(6-1)常见类的继承关系

&#xff08;12&#xff09; &#xff08;13&#xff09; 谢谢