第六章 类型注解与函数类型注解
类型注解不会影响程序运行,它只是给人和工具看的,它可以提高代码的可读性,让IDE开发工具智能提示更强,当然,加上类型后,可以更好的限定变量范围。编程语言中有很多类似的方式,例如前端Vue开发中使用TypeScript中的语法限定变量范围,Java中使用泛型来限定范围。
1. 变量类型注解
语法格式:变量名: 类型 = 值
# 变量类型注解:给变量加上类型说明,可增强代码的可读性、让 IDE 的提示更友好。
num: int = 100
price: float = 12.99
message: str = 'Hello Python'
is_vip: bool = True
result: None = None# 语法上不会报错,但这么写意义不大
# 注意:可以先写变量的类型注解,以后再赋值
# school: str并不是在定义变量,只是说明,如果未来有school变量,那应该是str类型。
school: str
# print('@@@@@@', school) # 直接打印未定义的变量会报错
school = 'Hello Python'
print('@@@@@@', school)
注意:可以先写变量的类型注解,以后再赋值。
备注:上述代码中,school: str并不是在定义变量,只是说明:如果未来有school变量,那应该是str类型。Python执行到school = 'Hello Python'这句代码时,才会真正的定义school变量。
# hobby是列表,并且列表中的所有元素必须是str类型。
hobby: list[str] = ['蓝球', '足球', '乒乓球']
# hobby是列表,并且列表中的的元素可以是:str或者int类型
hobby: list[str | int] = ['游泳', '登山', '探险']
# 上面这行代码的旧写法如下:
from typing import Union
hobby: list[Union[str, int]] = ['游泳', '登山', '探险']
# citys是集合,并且集合中所有的元素必须是str类型
citys: set[str] = {'北京', '上海', '广州'}
# citys是集合,并且集合中所有元素是:str或者float或者bool类型
citys: set[str | float | bool] = ['北京', '上海', '广州']
# persons是字典,键(key)是str类型,值(value)是int类型
persons: dict[str, int] = {'唐僧':99, '孙悟空':9999, '猪八戒': 999}
# persons是字典,键(key)是str或者int类型,值(value)是int类型
persons: dict[str | int, int] = {'唐僧':99, '孙悟空':9999, '猪八戒': 999}
# 元组的类型声明有点特殊,各位要留意一下:
# scores是元组,并且元组中仅包含1个int类型的元素。
scores: tuple[int] = (60,)
# scores是元组,并且元组中包含3个int类型的元素。
socres: tuple[int, int, int] = (10, 20, 30)
# socres是元组,并且元组中包含任意个数的元素,但每个元素的类型必须是int类型。
scores: tuple[int, ...] = [10, 20, 30, 40 ,50]
# scores是元组,并且元组中包含任意个数的元素,每个元素的类型可以是:int或者str
scores: tuple[int | str, ...] = (10, '张三', 20, '李四', 30)
# Python会根据初始化赋值推导变量的类型:
# 1.对于普通变量:后续如果改变类型,不会警告。
# 2.对于容器变量:要求内部元素类型必须与推导出来的一致,否则就会警告。
a = 100
a = 'Hello Python'
b = [10, 20, 30]
b.append('40') # 警告:应为类型int,但实际为str
2. 函数类型注解
语法格式:函数名(参数1: 类型, 参数2: 类型) -> 返回值类型。
# 示例1:设置参数类型注解,设置返回值类型注解。
def add(x: int, y: int) -> int:
return x + y
# 示例2:参数有默认值(Python可以推导出参数的类型),设置返回值类型
def add(x = 1, y = 2) -> int:
return x + y
# 示例3:设置多个返回值的类型注解
def show_numbers_info(nums: list[int]) -> tuple[int, int, float]:
max_value = max(nums)
min_value = min(nums)
result = max_value / min_value
return max_value, min_value, result
# 示例4:设置*args的类型注解,要求args中的每个参数都必须是int类型
def add(*args: int) -> int:
return sum(args)
# 示例5:设置**kwargs的类型注解,要求kwargs中的每组参数的值,必须是str或者int类型
def show_info(**kwargs: str | int):
print(kwargs)
# 获取函数的注解信息
def add(*args: int) -> int:
return sum(args)
print(add.__annotations__) # {'args': <class 'int'>, 'return': <class 'int'>}