Python类型注解

Python类型注解

2026年9月16日·#编程学习/python学习笔记Python/类型注解·2589 字 13 分钟
浏览量加载中...
AI 摘要- DeepSeek

Python类型注解的基本介绍、变量类型注解、类型推断、函数类型注解

封面图
Python类型注解 - 封面图

类型注解基本介绍#

类型注解是Python中的一种语法特性,用于明确标识变量、函数参数和返回值的数据类型,从而使代码更清晰、更安全、更易维护。

变量类型注解语法#

变量名: 数据类型 = 值

示例对比#

# 无类型注解
a = 695
score = 98.5
hobby = "Python"
flag = True
pic = None
names = ["A", "C", "E"]
phones = {"13309091111", "15209109121"}
options = {"count": 0, "total": 0}
goods = ("手机", 5999, 1)
# 有类型注解
a: int = 695
score: float = 98.5
hobby: str = "Python"
flag: bool = True
pic: None = None
names: list[str] = ["A", "C", "E"]
phones: set[str] = {"13309091111", "15209109121"}
options: dict[str, int] = {"count": 0, "total": 0}
goods: tuple[str, int, int] = ("手机", 5999, 1)

类型推断#

类型推断是指Python解释器自动推断出变量、表达式或函数返回值的数据类型的能力,而无需开发者显式声明。

示例#

# Python会自动推断类型
a = 695 # 推断为 int
score = 98.5 # 推断为 float
hobby = "football" # 推断为 str
flag = True # 推断为 bool
pic = None # 推断为 NoneType
names = ["张三", "李四", "王五"] # 推断为 list[str]
goods = ("鼠标", "键盘", "USB") # 推断为 tuple[str, str, str]

注意事项#

  • 在对变量进行直接赋值,或者涉及到变量的运算、容器的推导等场景时,解释器会自动推导出变量的类型

类型注解小结#

  1. 类型注解的写法?

    • 变量: 数据类型(如 a: int)
  2. 常见类型的写法

    • int、float、bool、str、None、list、set、tuple、dict
    • 多类型:str | int(使用 | 表示或)
  3. 为什么要使用类型注解,有什么好处呢?

    • 代码结构更清晰、代码逻辑更安全、易维护
    • 更准确的代码自动提示
    • 提前发现代码潜在问题

重要提醒#

如果对变量直接赋值、变量运算等场景,Python会自动进行类型推断

Python是动态类型语言,添加的类型注解只是提示,并不是强制约束!!!


函数类型注解#

为函数添加类型注解,其实主要就是为函数的参数和返回值添加类型注解。

语法格式#

def 函数名(参数名: 参数类型, ...) -> 返回值类型:
函数体
return 返回值

示例1:单返回值#

def calc(scores: list[int]) -> float:
return sum(scores) / len(scores)
# 调用
result = calc([85, 90, 95, 100])
print(result) # 92.5

示例2:多返回值#

def calc_data(scores: list[int]) -> tuple[int, int, float]:
max_v = max(scores)
min_v = min(scores)
avg_v = sum(scores) / len(scores)
return max_v, min_v, avg_v
# 调用
max_score, min_score, avg_score = calc_data([85, 90, 95, 100])
print(max_score, min_score, avg_score) # 100 85 92.5

语法说明#

  • 参数类型:在参数名后加 : 类型
  • 返回值类型:在函数名后加 -> 类型

函数类型注解小结#

  1. 函数中类型注解的语法?

    def calc_data(scores: list[int]) -> tuple[int, int, float]:
    ...
  2. 推荐使用场景

    • 对于需要团队协作开发和长期维护的项目,推荐使用类型注解

总结口诀#

  • 变量注解:冒号后面写类型,等号后面给值
  • 容器注解:list[str]、dict[str, int]、tuple[str, int, int]
  • 多类型:用 | 分隔,如 str | int
  • 函数注解:参数冒号写类型,箭头后面写返回
  • 类型推断:直接赋值自动推,不用手写也行
  • 动态语言:注解只是提示,不是强制约束

相关#

练习题#

一、知识回顾(读完直接做下面的实践题)#

  1. 类型注解的作用:让代码结构更清晰、逻辑更安全、更易维护;还能带来更准确的代码自动提示,提前发现潜在问题
  2. 变量类型注解的语法是 变量名 : 数据类型 = 值,如 a: int = 695
  3. 常见类型注解的写法:整数 int、小数 float、布尔 bool、字符串 str、空值 None
  4. 容器类型注解:字符串列表 list[str]、字符串集合 set[str]、键是字符串值是整数的字典 dict[str, int]、三个元素依次为字符串、整数、整数的元组 tuple[str, int, int]
  5. 一个变量可能有多种类型时,类型之间用 |(竖线)分隔,如 str | int
  6. 类型推断:直接赋值、变量运算、容器的推导等场景,Python 会自动推导出类型,不用手写注解
  7. Python 是动态类型语言,类型注解只是提示,并不是强制约束——注解写错了也不会因此报错
  8. 函数类型注解:参数类型写在参数名的后面(用冒号隔开),返回值类型写在函数名后面的 -> 符号之后
  9. 函数注解示例 def calc(scores: list[int]) -> float::参数是整数列表、返回值是小数;如果函数返回多个值,返回值类型写成元组(tuple)
  10. 推荐使用场景:需要团队协作开发和长期维护的项目

二、裸写题#

  • 2-1 给变量加类型注解 给 6 个变量分别加上类型注解并各打印一次:整数 695、小数 98.5、字符串 "Python"、布尔 True、字符串列表 ["A", "C", "E"]、键和值都是整数的字典 {"count": 0, "total": 0}。

    批改(2026-09-28):⚠️ 6 个变量都注解了、输出也全对;但两个容器的元素类型没写——你写的是 list_var: list / dict_var: dict,按提示里的写法应该是 list_var: list[str] / dict_var: dict[str, int](写清”里面装什么”才是这套注解的意义)。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:注解写在变量名和等号中间,冒号后面写类型;容器类型还要写清里面装的是什么类型 二级 · 方法:变量名: 类型 = 值;容器写成 类型[元素类型] 三级 · 骨架:a: ____ = 695 / names: ____[str] = ["A", "C", "E"] / options: ____[str, ____] = {"count": 0}

    参考答案(做完再点开)
    # 2-1
    a: int = 695
    score: float = 98.5
    hobby: str = "Python"
    flag: bool = True
    names: list[str] = ["A", "C", "E"]
    options: dict[str, int] = {"count": 0, "total": 0}
    print(a, score, hobby, flag, names, options)
  • 2-2 给函数加类型注解(单返回值) 写函数 average(scores):传入整数列表,返回平均分(小数)。给参数和返回值都加上类型注解,再用 [85, 90, 95, 100] 调用并打印结果(应得 92.5)。

    批改(2026-09-28):✅ 正确。def average(scores: list[int]) -> float 注解到位,实测输出 92.5。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:参数注解写在参数名后面,返回值注解写在函数名那一行的右箭头后面 二级 · 方法:def 函数名(参数: 类型) -> 返回类型: 三级 · 骨架:def average(scores: ____[int]) -> ____:

    参考答案(做完再点开)
    # 2-2
    def average(scores: list[int]) -> float:
    return sum(scores) / len(scores)
    print(average([85, 90, 95, 100])) # 92.5
  • 2-3 给多返回值函数加类型注解 写函数 min_max_avg(scores):一次返回最大值、最小值、平均值。返回值类型要写成”三个元素依次为整数、整数、小数的元组”,调用后把三个结果分别打印出来(应得 100 85 92.5)。

    批改(2026-09-28):⚠️ 两处可改进:① 返回注解写成 tuple[int, int, float | int],平均值一定是小数(sum/len 结果必为 float),按提示写 tuple[int, int, float] 就够,多写 | int 反而把类型放宽了;② 最后只 print(min_max_avg(scores)) 打整个元组,题面要求”把三个结果分别打印”(如 max_v, min_v, avg_v = min_max_avg(scores) 后再各打一行)。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:返回多个值时其实返回的是一个元组,元组注解要按顺序写清每个元素的类型 二级 · 方法:-> tuple[int, int, float] 三级 · 骨架:def min_max_avg(scores: list[int]) -> ____[int, int, ____]:

    参考答案(做完再点开)
    # 2-3
    def min_max_avg(scores: list[int]) -> tuple[int, int, float]:
    return max(scores), min(scores), sum(scores) / len(scores)
    max_score, min_score, avg_score = min_max_avg([85, 90, 95, 100])
    print(max_score, min_score, avg_score) # 100 85 92.5

三、综合题#

  • 3-1 成绩统计小程序(注解版) 把这一篇的知识串起来用一遍:

    1. 用带类型注解的方式定义 4 个变量:班级名(字符串)、学生名单(字符串列表)、三科平均分(整数列表)、等级对照表(键和值都是字符串的字典)
    2. 写函数 average(scores):参数标注整数列表、返回值标注小数,返回平均分
    3. 写函数 report(scores):一次返回最高分、最低分、平均分,返回值标注”三个元素的元组”
    4. 打印班级、人数、平均分(保留 2 位小数)、最高分/最低分和等级对照表
    5. 故意把字符串列表传给第 2 步的函数,看报错信息来自哪里,再用一句注释写下”注解只是提示,不是强制约束”的意思

    批改(2026-09-28):⚠️ ① 第 1~3 步你用一个 Summary 类把”变量 + 两个函数”装在了一起——知识点覆盖到了(__init__ 里的参数都带注解、两个方法注解也对),但题面要的是”定义 4 个变量 + 两个独立函数”,这种写法等于顺手练了面向对象,可以接受;② 第 4 步打印全对(平均分 84.33 保留两位小数 ✅);③ 第 5 步没做:注释里写了”注解只是提示,不是强制约束”,但没有真的把 ["a", "b"] 传进 average() 跑一次看报错——那一步才是这题的重点(报错来自 sum()// 运算,而不是注解本身)。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:先定义数据(带注解)→ 写两个带注解的函数 → 打印结果 → 故意传错类型做对照 二级 · 方法:list[str] / dict[str, str] / tuple[int, int, float];打印保留两位小数用 f"{值:.2f}" 三级 · 骨架:def report(scores: list[int]) -> ____[int, int, ____]: / print(f"平均分:{average(avg_scores):____}")

    参考答案(做完再点开)
    class_name: str = "Python 提高班"
    students: list[str] = ["小王", "小李", "小张"]
    avg_scores: list[int] = [85, 90, 95, 100]
    levels: dict[str, str] = {"优秀": "90 分以上", "良好": "80 分以上"}
    def average(scores: list[int]) -> float:
    return sum(scores) / len(scores)
    def report(scores: list[int]) -> tuple[int, int, float]:
    return max(scores), min(scores), sum(scores) / len(scores)
    print(f"班级:{class_name},共 {len(students)} 人:{'、'.join(students)}")
    print(f"平均分:{average(avg_scores):.2f}") # 92.50
    max_score, min_score, avg_score = report(avg_scores)
    print(f"最高分 {max_score} / 最低分 {min_score} / 平均分 {avg_score}")
    print("等级对照:", levels)
    # 故意把字符串列表传进去:注解只是提示,不会拦住它,报错来自 sum 运算本身
    # 取消下面一行的注释运行,会看到 TypeError: unsupported operand type(s) for +: 'int' and 'str'
    # print(average(["a", "b"]))

评论区

[ 标签 ]
# AI37# AI 编程2# AI工具1# AI绘图1# AI辅助开发2# Ajax7# Apifox1# AstrBot3# Astro2# CC Switch1# CDN2# Claude Code1# claudecode2# ClaudeCode1# Cloudflare2# CloudFlare2# CloudFlare-ImgBed3# coc4# CSS10# DeepSeek6# deepseek2# DELETE1# Docker5# EdgeOne3# Gist1# git1# GitHub1# hexo-circle-of-friends1# HTML9# HTTP10# ImageManager1# Java23# java13# JavaScript11# JavaWeb113# JDBC7# JSON2# JUnit1# LangChain25# Linux4# Logback1# Maven17# Muse Spark1# Mybatis1# MyBatis18# MySQL45# MySql1# NapCat1# Node.js1# obsidian2# Obsidian5# OpenCode4# ORM1# PathVariable1# PicGo1# PyCharm1# Python70# RequestBody1# RequestMapping1# RESTful风格1# skills1# Slf4j1# SpringBoot37# SpringMVC5# SQL2# Streamlit5# Svelte2# TailwindCSS1# Telegram3# Tlias2# Vercel1# vscode2# Vue20# Waline3# Web3# WebDAV1# Web基础6# Web开发6# WinSCP1# YAML1# 三层架构1# 中二宣言1# 书籍1# 使用文档10# 写作1# 函数2# 刷步数1# 前端52# 动态1# 动漫1# 包1# 单词2# 博客8# 博客工作流1# 博客开发2# 参数接收1# 友链1# 反思2# 后端48# 图床6# 地图1# 备份2# 大模型1# 奇思妙想1# 存储1# 学习方法6# 学校1# 宝塔面板3# 宝宝10# 实战4# 对象1# 导航栏1# 工具2# 布局2# 开发1# 开发工具1# 开发规范1# 开心1# 异常处理1# 影视2# 微信1# 性能优化2# 总结1# 想法15# 感受1# 感悟11# 指南1# 提示词工程2# 插件5# 故障排除1# 效率工具2# 教程10# 数据分析9# 数据库27# 数据结构1# 文件操作2# 斩神1# 日常95# 日志框架1# 朋友圈1# 朱元璋1# 模块1# 模板1# 正则表达式2# 测试3# 游戏2# 爬虫7# 生活迁移1# 电影2# 电脑1# 碎碎念1# 视觉识别1# 类1# 类型注解1# 网络基础2# 网络教室1# 羊毛2# 脚本2# 脚本工具1# 自动化2# 蓝奏云1# 表单1# 订阅推荐2# 记录2# 评论系统1# 词根1# 词缀1# 说说1# 足迹1# 跑步2# 路径参数1# 转载2# 运动1# 部署11# 部落冲突1# 配置1# 随机图1# 面向对象5# 音乐3# 音标1# 项目实战11# 饮食1# 驼峰命名1# 高德地图1
[ 公告 ]

如果你喜欢,那么欢迎来到我的世界!

了解更多
[ 音乐 ]
封面

音乐

暂未播放

0:000:00
暂无歌词
找不到相关结果。
[ contents ]
[ 全部文章 ]