❝Python入门第二十一课,主要是学习了类型注解,类型注解为变量和函数参数标预期类型,提升代码可读性,便于IDE检查与静态分析。
类型注解不会影响程序运行,它只是给人和工具看的,它可以提高代码的可读性、让IDE智能提示更强。
在 Python 中,主要有两种类型的注解,分别是:
❏ 变量类型注解
❏ 函数类型注解
变量类型注解
变量类型注解,就是给变量加上类型说明,可增强代码的可读性、让IDE的提示更友好。
同时,当一个代码文档比较长的时候,或者团队协作,类型注解在语法上是对类型的一种软约束,在IDE中鼠标放在变量上就会有类型提示,如果与类型注解不一致,则会显示波浪线警告。
语法格式:变量名: 类型 = 值。
num: int = 100price: float = 99.8message: str = '你好'is_vip: bool = Falseresult: None = None# 语法上没有问题,但这么写没有意义print(type(num), num) # <class 'int'> 100print(type(price), price) # <class 'float'> 99.8print(type(message), message) # <class 'str'> 你好print(type(is_vip), is_vip) # <class 'bool'> Falseprint(type(result), result) # <class 'NoneType'> None# 下面的写法违背了变量类型注解,在IDE中出现波浪线警告提示信息,但是运行代码后还是会赋值成功,所以称之为“软约束”num = '999'# 在 PyCharm IDE 内值'999'下面会出现黄色波浪线,鼠标悬浮提示“应为类型 'int',但实际为 'str' ”print(type(num), num) # <class 'str'> 999
注意:可以先写变量的类型注解,以后再赋值。语法如下:
school: str# print('*********', school) # 运行报错:NameError: name 'school' is not definedschool = '清华大学'print('我的理想大学是:', school) # 我的理想大学是: 清华大学
❝说明:上述代码中,school: str 并不是在定义变量,只是说明:如果未来有 school 变量,那应该是 str 类型。Python 执行到 school = ‘尚硅谷’这句代码时,才会真正的定义 school 变量。
容器类型的注解:
1、列表类型注解示例代码:
# 列表中的所有元素必须是 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)
2、集合类型注解示例代码:
# 集合中所有元素必须是 str 类型# cities: set[str] = {'北京', '上海', '深圳'}# 集合中的元素,可以是:str 或 float 或 boolcities: set[str | float | bool] = {'北京', '上海', '深圳'}cities.add('广州')cities.add(11.11)cities.add(True)cities.add(None)print(type(cities), cities)
3、字典类型注解示例代码:
# 字典的键是 str 类型,值是 int 类型# persons: dict[str, int] = {'张三': 100, '李四': 98, '王五': 89}# 字典的键是 str 或 int, 值是 int 类型persons: dict[str | int, int] = {'张三': 100, '李四': 98, '王五': 89}persons['赵六'] = 94persons[1] = 88print(type(persons), persons)
4、元组的类型注解有些特殊,请看示例代码:
# 元组中仅包含 1 个 int 类型的元素scores: tuple[int] = (60,)# 元组中包含 3 个 int 类型的元素scores2: tuple[int, int, int] = (60, 70, 80)# 元组中包含任意数量元素,每个元素的类型必须是 intscores3: tuple[int, ...] = (60, 70, 80, 90)# 元组中包含任意数量元素,每个元素的类型可以是:str 或 intscores4: tuple[int | str, ...] = (60, 70, 80, 90, '3.14')
类型推导注意事项
Python 中存在类型推导,根据变量初始赋值的实际数据,自动推断变量的类型。
- 对于容器类型:要求内部的元素类型必须和推导出来的一致,否则就会警告。
x = 100x = 'hello'y = [1, 2, 3]y.append('4') # 此行会有类型警告信息:应为类型 'int' (匹配的泛型类型 '_T'),但实际为 'str'
函数类型注解
函数类型注解就是给函数的『参数』和『返回值』添加类型说明。
语法格式:函数名(参数1: 类型, 参数2: 类型) -> 返回值类型。
1、给参数和返回值添加类型注解
defadd(x: int, y: int) -> int:return x + yprint(add(1, 2)) # 正常执行,返回:3print(add('1', '2')) # 可以正常执行,返回:12,但是实参'1'和'2'在IDE中有警告信息:应为类型 'int',但实际为 'str'
2、带默认值的参数,可以不写注解
defadd2(x = 1, y = 2):return x + yprint(add2(1, 2)) # 正常执行,返回:3print(add2('1', '2')) # 可以正常执行,返回:12,但是实参'1'和'2'在IDE中有警告信息:应为类型 'int',但实际为 'str'
3、设置多个返回值的类型注解
defshow_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_vprint(show_num_info([1, 2, 3])) # (3, 1, 3.0)
总结
个人理解,在Python中类型注解只是一种软约束,一种约定,需要程序员主动去遵循类型注解,如果执意违背类型注解,可能会得到异常结果。