类型提示
Python 中的所有值都有一个类型,例如,6 的类型是 int(整数的缩写),
'seven' 的类型是 str(字符串的缩写)。6.7 是一个 float,是
浮点数的缩写,意味着一个有小数点的数字。内置的 type 函数返回其参数的类型。
>>> type(1)
<class 'int'>
>>> type('seven')
<class 'str'>
>>>> type(lambda x: x + 1)
<class 'function'>
Python 是 动态类型 的,这意味着名称(也称为变量) 没有类型。一个名称可以分配给一个类型的值,然后 分配给一个不同类型的值:
>>> x = 6
>>> x = 'seven'
这种行为与 静态类型 语言(如 Java)形成对比,在静态类型语言中, 变量具有固定的类型。
当你编写代码时,给读者一个关于 名称预期具有什么类型的值的提示通常很有用。如果你正在编写一个将被其他人使用的函数,描述每个参数的预期类型和 返回值是有帮助的文档。类型检查是一个确保分配给变量的值具有预期类型的过程,对于查找错误也非常有用。由于这些好处,Python 程序通常包含 类型提示,它允许你描述代码中变量的预期类型。
单个变量的类型提示看起来像变量名后的冒号, 后跟预期类型:
x: int = 6
y: string = "seven"
z: float = 1.5
你还可以为函数的参数和返回值添加类型提示:
def fibonacci(n: int) -> int:
...
在上面的 fibonacci 中,输入参数 n 预期具有类型 int。箭头(->)是返回值类型提示的一部分,-> int
意味着这个函数预期返回一个 int。
列表的类型提示可以只是 list,但如果列表中的项目都
意味着具有相同的类型,那么提示也可以包括项目的类型。例如,list[int] 描述一个整数列表,list[str] 是
一个字符串值列表。
s: list = [1, 'two', 3.0]
t: list[int] = [4, 5]
u: list[float] = [6.7]
类型提示可以列出多种类型,用 | 分隔,以指示变量
可以采用任何枚举类型。
s: list[int | float] = [4, 4.5, 5]
这种语法通常用于指示变量可能是某种类型,或者可能是 None:
s: str | None = 'fibonacci'
s = None
Python 的解释器不强制名称只能绑定到具有提示中类型的 值,所以这段代码将运行而没有错误:
>>> x: int = 'not an int'
>>> x
'not an int'
>>> type(x)
<class 'str'>
上面,当我们调用 type(x) 时,我们不是找到变量 x 的类型,因为变量没有类型!相反,我们找到 x 的值的类型。这是因为要评估调用表达式,Python 在应用函数之前评估操作数。所以,要评估 type(x),Python 首先
将 x 评估为字符串 'not an int',然后获取
'not an int' 的类型。
鉴于 Python 在运行程序时不强制执行类型提示,你可能会
想知道为什么它们有用!一个原因是类型提示是很好的文档。它们也很有用,因为像 pyright 和
mypy 这样的类型检查器将检查程序中的类型,并告诉你类型提示何时
与实际值类型不匹配。类型检查通常是查找有用的错误的方法。
我们不会总是在这个课程中使用类型提示,我们也不会强制 你的代码使用类型提示。我们会尝试在认为它们对你有帮助的地方使用它们!你还会在网页上找到的 Python 代码中注意到它们。