复杂类型:List、Dict、Optional、Union
正确使用 typing 模块中的泛型以及 Optional/Union。
复杂类型:List、Dict、Optional、Union 是 CoddyKit 上的免费 Python Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
typing 模块概览
在 Python 3.9 之前,List、Dict 和 Tuple 等泛型类型来自 typing。从 3.9 开始,可以直接使用内置类型。
from typing import List, Dict, Tuple, Optional, Union
# Python 3.9+: use list[int], dict[str,int] directly
# Python 3.8-: use typing.List[int], typing.Dict[str,int]List 与 Sequence
对可变序列使用 list[T];当接受任何有序序列(列表、元组或字符串)时,使用 Sequence[T]。
from typing import Sequence
def total(nums: list[int]) -> int:
return sum(nums)
def first(items: Sequence[str]) -> str:
return items[0] # works with list, tuple, strDict 与 Mapping
对可变字典使用 dict[K,V];对只读的类字典对象使用 Mapping[K,V]。
from typing import Mapping
def lookup(data: Mapping[str, int], key: str) -> int | None:
return data.get(key)
result = lookup({"a": 1, "b": 2}, "a")
print(result) # 1元组注解
固定长度:tuple[int, str, float]。可变长度:tuple[int, ...]。
def point() -> tuple[float, float]:
return (1.0, 2.0)
def first_n(n: int) -> tuple[int, ...]:
return tuple(range(n))
# Named tuple with types:
from typing import NamedTuple
class Point(NamedTuple):
x: float
y: floatOptional[T]
Optional[T] 是 T | None 的简写。当参数可以缺省时,它始终是合适的选择。
from typing import Optional
def find_user(user_id: int) -> Optional[dict[str, str]]:
db: dict[int, dict[str, str]] = {
1: {"name": "Alice"}
}
return db.get(user_id)联合类型
对于可能属于多种类型之一的值,可以使用 Union[X, Y] 或 X | Y(3.10+)。
from typing import Union
def stringify(value: Union[int, float, str]) -> str:
return str(value)
# Python 3.10+:
def stringify2(value: int | float | str) -> str:
return str(value)Literal 类型
Literal["a","b","c"] 将值限制为特定的一组字面量。
from typing import Literal
Mode = Literal["read", "write", "append"]
def open_file(path: str, mode: Mode) -> None:
with open(path, mode):
pass
open_file("data.txt", "read") # ok
# open_file("data.txt", "exec") # mypy errorTypedDict
TypedDict 用于注解字典的结构,使每个键都对应特定类型。
from typing import TypedDict
class User(TypedDict):
name: str
age: int
email: str | None
def greet(user: User) -> str:
return f"Hello, {user['name']}"
alice: User = {"name": "Alice", "age": 30, "email": None}Set 与 FrozenSet
使用 set[T] 注解集合,使用 frozenset[T] 注解冻结集合。
def unique(items: list[int]) -> set[int]:
return set(items)
def allowed_methods() -> frozenset[str]:
return frozenset({"GET", "POST", "DELETE"})Iterable 与 Iterator
对任何可以循环遍历的对象使用 Iterable[T];对具有 __next__ 的对象使用 Iterator[T]。
from typing import Iterable, Iterator
def evens(numbers: Iterable[int]) -> Iterator[int]:
return (n for n in numbers if n % 2 == 0)
for n in evens([1, 2, 3, 4, 5]):
print(n) # 2 4Any 与 NoReturn
Any 会让某个值退出类型检查。NoReturn 用于标记永不返回的函数(它们始终引发异常或无限循环)。
from typing import Any, NoReturn
def accept_all(x: Any) -> None:
print(x)
def crash(msg: str) -> NoReturn:
raise RuntimeError(msg) # never returns normally快速检查
Optional[str] 表示什么含义?
回顾
对集合使用 list[T]、dict[K,V] 和 tuple[T,...]。Optional[T] = T | None。对于多种类型,使用 Union[X,Y] 或 X|Y。使用 Literal 表示特定值,使用 TypedDict 表示带类型的字典结构,使用 Any 退出类型检查。
用 AI 导师学习 Python — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 76
- 课程
- 320
常见问题解答
「复杂类型:List、Dict、Optional、Union」课时是免费的吗?
是的 — 「复杂类型:List、Dict、Optional、Union」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「复杂类型:List、Dict、Optional、Union」这节课中我会学到什么?
正确使用 typing 模块中的泛型以及 Optional/Union。 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「复杂类型:List、Dict、Optional、Union」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 类型注解基础
- 复杂类型:List、Dict、Optional、Union
- TypeVar、泛型类与 Protocol
- 运行 mypy 与修复类型错误