在 Python 中,主要有两种类型的注解,分别是:
❏ 变量类型注解
❏ 函数类型注解
变量类型注解,就是给变量加上类型说明,可增强代码的可读性、让IDE的提示更友好。
同时,当一个代码文档比较长的时候,或者团队协作,类型注解在语法上是对类型的一种软约束,在IDE中鼠标放在变量上就会有类型提示,如果与类型注解不一致,则会显示波浪线警告。
1️⃣ 语法格式:变量名: 类型 = 值。
num: int = 100
price: float = 99.8
message: str = '你好'
is_vip: bool = False
result: None = None # 语法上没有问题,但这么写没有意义
print(type(num), num) # <class 'int'> 100
print(type(price), price) # <class 'float'> 99.8
print(type(message), message) # <class 'str'> 你好
print(type(is_vip), is_vip) # <class 'bool'> False
print(type(result), result) # <class 'NoneType'> None
# 下面的写法违背了变量类型注解,在IDE中出现波浪线警告提示信息,但是运行代码后还是会赋值成功,所以称之为“软约束”
num = '999' # 在 PyCharm IDE 内值'999'下面会出现黄色波浪线,鼠标悬浮提示“应为类型 'int',但实际为 'str' ”
print(type(num), num) # <class 'str'> 999
2️⃣ 注意:可以先写变量的类型注解,以后再赋值。语法如下:
school: str
# print('*********', school) # 运行报错:NameError: name 'school' is not defined
school = '清华大学'
print('我的理想大学是:', school) # 我的理想大学是: 清华大学
说明:上述代码中,school: str 并不是在定义变量,只是说明:如果未来有 school 变量,那应该是 str 类型。Python 执行到 school = ‘尚硅谷’这句代码时,才会真正的定义 school 变量。
3️⃣ 容器类型的注解:
列表类型注解示例代码:
# 列表中的所有元素必须是 str 类型
skills: list[str] = ['PHP', 'VUE', 'TypeScript']
# 列表中的元素,可以是:str 或 int 类型
price: list[str | int] = [100, 99, '88']
# 上面这行代码的旧写法如下:
# from typing import Union
# price: list[Union[int, str]] = [100, 99, '88']
price.append('77')
price.append(88.36)
print(type(price), price)
集合类型注解示例代码:
# 集合中所有元素必须是 str 类型
# cities: set[str] = {'北京', '上海', '深圳'}
# 集合中的元素,可以是:str 或 float 或 bool
cities: set[str | float | bool] = {'北京', '上海', '深圳'}
cities.add('广州')
cities.add(11.11)
cities.add(True)
cities.add(None)
print(type(cities), cities)
字典类型注解示例代码:
# 字典的键是 str 类型,值是 int 类型
# persons: dict[str, int] = {'张三': 100, '李四': 98, '王五': 89}
# 字典的键是 str 或 int, 值是 int 类型
persons: dict[str | int, int] = {'张三': 100, '李四': 98, '王五': 89}
persons['赵六'] = 94
persons[1] = 88
print(type(persons), persons)
元组的类型注解有些特殊,请看示例代码:
# 元组中仅包含 1 个 int 类型的元素
scores: tuple[int] = (60,)
# 元组中包含 3 个 int 类型的元素
scores2: tuple[int, int, int] = (60, 70, 80)
# 元组中包含任意数量元素,每个元素的类型必须是 int
scores3: tuple[int, ...] = (60, 70, 80, 90)
# 元组中包含任意数量元素,每个元素的类型可以是:str 或 int
scores4: tuple[int | str, ...] = (60, 70, 80, 90, '3.14')
4️⃣ 类型推导注意事项
Python 中存在类型推导,根据变量初始赋值的实际数据,自动推断变量的类型。
x = 100
x = 'hello'
y = [1, 2, 3]
y.append('4') # 此行会有类型警告信息:应为类型 'int' (匹配的泛型类型 '_T'),但实际为 'str'
函数类型注解就是给函数的『参数』和『返回值』添加类型说明。
语法格式:函数名(参数1: 类型, 参数2: 类型) -> 返回值类型。
1️⃣ 给参数和返回值添加类型注解
def add(x: int, y: int) -> int:
return x + y
print(add(1, 2)) # 正常执行,返回:3
print(add('1', '2')) # 可以正常执行,返回:12,但是实参'1'和'2'在IDE中有警告信息:应为类型 'int',但实际为 'str'
2️⃣ 带默认值的参数,可以不写注解
def add2(x = 1, y = 2):
return x + y
print(add2(1, 2)) # 正常执行,返回:3
print(add2('1', '2')) # 可以正常执行,返回:12,但是实参'1'和'2'在IDE中有警告信息:应为类型 'int',但实际为 'str'
3️⃣ 设置多个返回值的类型注解
def show_num_info(nums: list[int]) -> tuple[int, int, float]:
max_v = max(nums)
min_v = min(nums)
return max_v, min_v, max_v / min_v
print(show_num_info([1, 2, 3])) # (3, 1, 3.0)
个人理解,在Python中类型注解只是一种软约束,一种约定,需要程序员主动去遵循类型注解,如果执意违背类型注解,可能会得到异常结果。
🔥BuildAdmin是一个永久免费开源,无需授权即可商业使用,且使用了流行技术栈快速创建商业级后台管理系统。