类型注解基本介绍
类型注解是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]注意事项
- 在对变量进行直接赋值,或者涉及到变量的运算、容器的推导等场景时,解释器会自动推导出变量的类型
类型注解小结
类型注解的写法?
变量: 数据类型(如a: int)
常见类型的写法
int、float、bool、str、None、list、set、tuple、dict- 多类型:
str | int(使用|表示或)
为什么要使用类型注解,有什么好处呢?
- 代码结构更清晰、代码逻辑更安全、易维护
- 更准确的代码自动提示
- 提前发现代码潜在问题
重要提醒
如果对变量直接赋值、变量运算等场景,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语法说明
- 参数类型:在参数名后加
: 类型 - 返回值类型:在函数名后加
-> 类型
函数类型注解小结
函数中类型注解的语法?
pythondef calc_data(scores: list[int]) -> tuple[int, int, float]: ...推荐使用场景
- 对于需要团队协作开发和长期维护的项目,推荐使用类型注解
总结口诀
- 变量注解:冒号后面写类型,等号后面给值
- 容器注解:list[str]、dict[str, int]、tuple[str, int, int]
- 多类型:用
|分隔,如str | int - 函数注解:参数冒号写类型,箭头后面写返回
- 类型推断:直接赋值自动推,不用手写也行
- 动态语言:注解只是提示,不是强制约束
相关
练习题
一、知识回顾(读完直接做下面的实践题)
- 类型注解的作用:让代码结构更清晰、逻辑更安全、更易维护;还能带来更准确的代码自动提示,提前发现潜在问题
- 变量类型注解的语法是
变量名 : 数据类型 = 值,如a: int = 695 - 常见类型注解的写法:整数
int、小数float、布尔bool、字符串str、空值None - 容器类型注解:字符串列表
list[str]、字符串集合set[str]、键是字符串值是整数的字典dict[str, int]、三个元素依次为字符串、整数、整数的元组tuple[str, int, int] - 一个变量可能有多种类型时,类型之间用
|(竖线)分隔,如str | int - 类型推断:直接赋值、变量运算、容器的推导等场景,Python 会自动推导出类型,不用手写注解
- Python 是动态类型语言,类型注解只是提示,并不是强制约束——注解写错了也不会因此报错
- 函数类型注解:参数类型写在参数名的后面(用冒号隔开),返回值类型写在函数名后面的
->符号之后 - 函数注解示例
def calc(scores: list[int]) -> float::参数是整数列表、返回值是小数;如果函数返回多个值,返回值类型写成元组(tuple) - 推荐使用场景:需要团队协作开发和长期维护的项目
二、裸写题
批改(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}- 参考答案(做完再点开)
python# 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)批改(2026-09-28):✅ 正确。
def average(scores: list[int]) -> float注解到位,实测输出92.5。- 提示(先自己想,实在想不出再点开)
一级 · 思路:参数注解写在参数名后面,返回值注解写在函数名那一行的右箭头后面 二级 · 方法:
def 函数名(参数: 类型) -> 返回类型:三级 · 骨架:def average(scores: ____[int]) -> ____:- 参考答案(做完再点开)
python# 2-2 def average(scores: list[int]) -> float: return sum(scores) / len(scores) print(average([85, 90, 95, 100])) # 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, ____]:- 参考答案(做完再点开)
python# 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
三、综合题
- 用带类型注解的方式定义 4 个变量:班级名(字符串)、学生名单(字符串列表)、三科平均分(整数列表)、等级对照表(键和值都是字符串的字典)
- 写函数
average(scores):参数标注整数列表、返回值标注小数,返回平均分 - 写函数
report(scores):一次返回最高分、最低分、平均分,返回值标注"三个元素的元组" - 打印班级、人数、平均分(保留 2 位小数)、最高分/最低分和等级对照表
- 故意把字符串列表传给第 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):____}")- 参考答案(做完再点开)
pythonclass_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"]))
