Python 高级语法速览
3098 字
15 分钟
Python 高级语法速览
适合已有 Python 基础语法 + 数据容器基础的同学,快速建立高级语法知识框架。
目录
- 一、模块与包
- 二、函数进[[#decorator]]阶
- 三、装饰器
- 四、迭代器与生成器
- 五、面向对象进阶
- 六、异常处理进阶
- 七、文件与上下文管理器
- 八、常用内置模块速查
- 九、类型提示
- 十、海象运算符与模式匹配
一、模块与包
模块 = 一个 .py 文件;包 = 含 __init__.py 的文件夹。
# 导入方式import os # 导入整个模块from os.path import join # 导入具体函数from collections import defaultdict as dd # 别名导入常用技巧:
# 动态导入(字符串 → 模块)import importlibmod = importlib.import_module("json")
# __name__ 判断:脚本直接运行 vs 被导入if __name__ == "__main__": main() # 只在直接运行时执行总结:要么导入模块要么从包里选部分 def 函数,导入包的模块同理

模块
![[Pasted image 20260615185414.png]]

包
概念:包含模块 特点:在包下有个__init__ py 文件包含包的基本信息:作者/版本 示例
二、函数进阶
传参方式:
- 位置传参(同 java)
- 关键字传参(同下)
- 默认参数(放在非默认之后 )
- 不定数参数传参:
(*name/data/args) 加*号 **name用于不定数关键字传参 `
2.1 不定长参数类型
def func(a, b=10, *args, **kwargs): # a → 位置参数(必填) # b=10 → 默认参数 # *args → 接收多余位置参数,打包为 tuple # **kwargs → 接收多余关键字参数,打包为 dict print(a, b, args, kwargs)
func(1, 2, 3, 4, x=5) # 1 2 (3, 4) {'x': 5}2.2 仅限关键字参数
def connect(*, host, port): # * 后面的参数必须用关键字传入 print(host, port)
connect(host="localhost", port=3306) # ✅# connect("localhost", 3306) # ❌ TypeError2.3 Lambda 匿名函数
定义 Lamba 参数:函数体 示例:
square = lambda x: x ** 2# 常与 sorted / map / filter 搭配nums = [3, 1, 4, 1, 5]sorted(nums, key=lambda x: -x) # [5, 4, 3, 1, 1]list(map(lambda x: x * 2, nums)) # [6, 2, 8, 2, 10]list(filter(lambda x: x > 2, nums)) # [3, 4, 5]例题:data_list.sort(key=lambda item : len(item))这段代码不废话精准解析实现流程
data_list.sort()触发原地排序,遍历列表每个元素。- 遍历中依次将单个元素传入
lambda的形参item。 - 执行
len(item),得到当前元素字符串长度,作为该元素的排序权重。 - 依据权重从小到大,重新排列原列表,完成排序。
解析:
一、data_list.sort()(无 key、无匿名函数)精准流程
- 原地排序,遍历列表每个元素。
- 直接以元素自身作为排序依据。
- 按默认升序规则重排原列表,完成。
data_list.sort(key=lambda item: len(item))(带匿名函数)精准流程
- 原地排序,遍历列表每个元素。
- 逐个把单个元素赋值给匿名函数形参
item。 - 执行
len(item),得到排序权重。 - 按权重升序重排原列表,完成。
精准流程(无冗余)
data_list.sort()触发原地排序,遍历列表每个元素。- 遍历中依次将单个元素传入
lambda的形参item。 - 执行
len(item),得到当前元素字符串长度,作为该元素的排序权重。 - 依据权重从小到大,重新排列原列表,完成排序。
data_list.sort()触发原地排序,遍历列表每个元素。
- 遍历中依次将单个元素传入
lambda的形参item。 - 执行
len(item),得到当前元素字符串长度,作为该元素的排序权重。 - 依据权重从小到大,重新排列原列表,完成排序。
2.4 闭包
def make_counter(): count = 0 def counter(): nonlocal count # 声明修改外层变量 count += 1 return count return counter
c = make_counter()print(c(), c(), c()) # 1 2 3类型注解
语法格式:
// 基本语法示例a: int=597 #则a作用:帮助锁定变量名对应类型
基本类型有:
int str None bool float
特点:: int 格式
函数下的类型注解
语法格式:
// 基本语法示例def A(scores: list[int])-> float/tuple[?,?,?]作用:指定返回类型 特点:
示例:
// 代码示例可能的问题:
三、装饰器
本质:接收函数 → 返回新函数的高阶函数,用 @ 语法糖。
import time
def timer(func): def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) print(f"{func.__name__} 耗时 {time.time()-start:.4f}s") return result return wrapper
@timerdef heavy_work(): time.sleep(0.5)
heavy_work() # heavy_work 耗时 0.5012s带参数的装饰器(三层嵌套):
def repeat(n): def decorator(func): def wrapper(*args, **kwargs): for _ in range(n): func(*args, **kwargs) return wrapper return decorator
@repeat(3)def say_hi(): print("Hi!")
# say_hi() 输出 3 次 Hi!保留原函数信息 → 用 functools.wraps:
from functools import wraps
def my_decorator(func): @wraps(func) # ← 加这一行 def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper四、迭代器与生成器
4.1 迭代器协议
# 任何实现了 __iter__() 和 __next__() 的对象都是迭代器it = iter([1, 2, 3])next(it) # 1next(it) # 24.2 生成器(yield)
def countdown(n): while n > 0: yield n # 暂停并返回值,下次从这里继续 n -= 1
for i in countdown(3): print(i) # 3 2 1生成器表达式(惰性求值,省内存):
# 列表推导 → 一次性全部存入内存squares_list = [x**2 for x in range(1000000)]
# 生成器表达式 → 按需生成,几乎不占内存squares_gen = (x**2 for x in range(1000000))4.3 yield from 委托
def flatten(nested): for item in nested: if isinstance(item, list): yield from flatten(item) # 递归委托 else: yield item
list(flatten([1, [2, [3, 4], 5], 6])) # [1, 2, 3, 4, 5, 6]五、面向对象进阶
Print(对象.__dic__)#打印各属性值5.1 类方法 & 静态方法
class Date:
def __init__(self, year, month, day): self.year, self.month, self.day = year, month, day
@classmethod def from_string(cls, s): # cls → 类本身,常用于替代构造器 y, m, d = map(int, s.split("-")) return cls(y, m, d)
@staticmethod def is_valid(s): # 不访问类和实例,纯工具函数 parts = s.split("-") return len(parts) == 3
d = Date.from_string("2026-06-14")print(Date.is_valid("2026-06-14")) # True
- Self 是 java this,init 方法是 java构造方法
- def 内部中的示例方法时都要带上 self 参数,调用传参不用写上
5.2 属性装饰器 @property
class Circle: def __init__(self, radius): self._radius = radius
@property def radius(self): # getter → 像访问属性一样 return self._radius
@radius.setter def radius(self, value): # setter → 带校验 if value < 0: raise ValueError("半径不能为负") self._radius = value
@property def area(self): # 只读属性 return 3.14159 * self._radius ** 2
c = Circle(5)print(c.area) # 78.53975,像属性一样访问c.radius = 10 # ✅# c.area = 100 # ❌ AttributeError5.3 魔术方法(常用)
概念:函数自带的特殊行为,可以重写覆盖 语法格式:
// 基本语法示例__str__作用: 示例:
class Vector: def __init__(self, x, y): self.x, self.y = x, y
def __repr__(self): # 调试用,开发者看的 return f"Vector({self.x}, {self.y})"
def __str__(self): # print() 时展示 return f"({self.x}, {self.y})"
def __add__(self, other): # v1 + v2 return Vector(self.x + other.x, self.y + other.y)
def __len__(self): # len(v) return int((self.x**2 + self.y**2) ** 0.5)
def __eq__(self, other): # v1 == v2 return self.x == other.x and self.y == other.y
def __getitem__(self, index): # v[0], v[1] return (self.x, self.y)[index]
def __contains__(self, value): # value in v return value in (self.x, self.y)5.4 继承与 MRO
class A: def greet(self): return "A"class B(A): def greet(self): return "B"class C(A): def greet(self): return "C"class D(B, C): pass
d = D()print(d.greet()) # B(按 MRO 顺序:D → B → C → A)print(D.__mro__) # 查看方法解析顺序super() 调用父类:
class B(A): def greet(self): return super().greet() + " + B" # A + B5.5 抽象类
from abc import ABC, abstractmethod
class Shape(ABC): @abstractmethod def area(self): ... # 子类必须实现
class Rect(Shape): def __init__(self, w, h): self.w, self.h = w, h def area(self): return self.w * self.h
# Shape() # ❌ 不能实例化抽象类r = Rect(3, 4) # ✅六、异常处理进阶
6.1 完整结构
#基本语法#多项匹配,相当于分岔路try: result = 10 / 0except ZeroDivisionError as e: print(f"错误: {e}") # 捕获特定异常except (TypeError, ValueError): print("类型或值错误") # 同时捕获多种except Exception as e: print(f"未知错误: {e}") # 兜底else: print("没有异常时执行")finally: print("无论如何都执行") # 清理资源6.2 自定义异常
class AppError(Exception): def __init__(self, code, msg): self.code = code self.msg = msg def __str__(self): return f"[{self.code}] {self.msg}"
raise AppError(404, "资源未找到")6.3 异常链
try: open("不存在.txt")except FileNotFoundError as e: raise ValueError("配置文件缺失") from e # 保留原始异常七、文件与上下文管理器
7.1 文件操作
# 读写with open("data.txt", "r", encoding="utf-8") as f: content = f.read() # 全部读取 # lines = f.readlines() # 按行读取为 list # for line in f: # 逐行迭代(最省内存) # print(line.strip())
with open("out.txt", "w", encoding="utf-8") as f: f.write("Hello\n")
# 常用模式: "r"读 / "w"写(覆盖) / "a"追加 / "rb"二进制读7.2 自定义上下文管理器
class Timer: def __enter__(self): import time self.start = time.time() return self # as 后面绑定的对象
def __exit__(self, exc_type, exc_val, exc_tb): self.elapsed = time.time() - self.start print(f"耗时: {self.elapsed:.4f}s") return False # True=吞掉异常, False=继续抛出
with Timer() as t: sum(range(1000000))# 耗时: 0.0312s更简洁的写法(contextlib):
from contextlib import contextmanager
@contextmanagerdef timer(): import time start = time.time() yield # yield 之前 = __enter__,之后 = __exit__ print(f"耗时: {time.time()-start:.4f}s")
with timer(): sum(range(1000000))八、常用内置模块速查
8.1 collections 实用容器
from collections import Counter, defaultdict, namedtuple, deque
# Counter — 计数Counter("abracadabra") # {'a':5, 'b':2, 'r':2, 'c':1, 'd':1}Counter([1,2,2,3]).most_common(1) # [(2, 2)]
# defaultdict — 带默认值的 dictdd = defaultdict(list)dd["key"].append(1) # 不存在时自动创建空 list
# namedtuple — 轻量不可变对象Point = namedtuple("Point", ["x", "y"])p = Point(1, 2)print(p.x, p.y) # 1 2
# deque — 双端队列,两端 O(1) 插入/弹出dq = deque([1, 2, 3])dq.appendleft(0) # [0, 1, 2, 3]dq.pop() # [0, 1, 2]8.2 functools 实用函数
from functools import lru_cache, reduce, partial
# lru_cache — 自动缓存(记忆化)@lru_cache(maxsize=128)def fib(n): return n if n < 2 else fib(n-1) + fib(n-2)
# reduce — 累积运算reduce(lambda a, b: a + b, [1, 2, 3, 4]) # 10
# partial — 固定部分参数int2 = partial(int, base=2)int2("1010") # 108.3 itertools 迭代工具
import itertools
# 排列组合list(itertools.permutations("ABC", 2)) # [('A','B'),('A','C'),('B','A'),...]list(itertools.combinations("ABC", 2)) # [('A','B'),('A','C'),('B','C')]
# 链接多个可迭代对象list(itertools.chain([1,2], [3,4])) # [1, 2, 3, 4]
# 分组(需先排序)data = sorted(["apple","banana","avocado","blueberry"], key=lambda x: x[0])for k, g in itertools.groupby(data, key=lambda x: x[0]): print(k, list(g))# a ['apple', 'avocado'] b ['banana', 'blueberry']8.4 pathlib 文件路径(推荐替代 os.path)
from pathlib import Path
p = Path("data") / "logs" / "app.log" # 自动拼接路径p.exists() # 是否存在p.parent # 父目录p.suffix # .logp.stem # appp.read_text(encoding="utf-8") # 读取内容p.write_text("hello", encoding="utf-8") # 写入内容list(Path(".").glob("**/*.py")) # 递归查找所有 .py8.5 json 序列化
import json
data = {"name": "Alice", "age": 25, "hobbies": ["reading", "coding"]}
# Python对象 → JSON字符串s = json.dumps(data, ensure_ascii=False, indent=2)
# JSON字符串 → Python对象obj = json.loads(s)
# 文件读写with open("data.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2)
with open("data.json", "r", encoding="utf-8") as f: obj = json.load(f)九、类型提示
Python 是动态类型语言,类型提示不影响运行,但能提升 IDE 提示和可读性。
from typing import Optional, Union, Callable
# 基本用法def greet(name: str, times: int = 1) -> str: return (f"Hi {name}! ") * times
# Optional = Union[X, None]def find(user_id: int) -> Optional[str]: # 返回 str 或 None ...
# Union 多类型def process(value: Union[int, str]) -> str: # Python 3.10+ 可写 int | str ...
# 容器类型from typing import Dict, List, Tuple, Setdef stats(scores: Dict[str, List[int]]) -> Tuple[float, float]: ...
# Callable 类型def apply(func: Callable[[int, int], int], a: int, b: int) -> int: return func(a, b)Python 3.10+ 简化写法:
def greet(name: str, age: int | None = None) -> str: # 用 | 替代 Union ...十、海象运算符与模式匹配
10.1 海象运算符 :=(Python 3.8+)
# 赋值的同时用于表达式,减少重复计算if (n := len("hello")) > 3: print(f"长度 {n} 超过 3") # 长度 5 超过 3
# while 循环中常用while (line := input("输入: ")) != "quit": print(f"你输入了: {line}")
# 列表推导中过滤并复用data = [1, 5, 12, 3, 20]results = [y for x in data if (y := x * 2) > 10] # [24, 6, 40]10.2 match-case 模式匹配(Python 3.10+)
def handle(status): match status: case 200: return "成功" case 404: return "未找到" case 500: return "服务器错误" case _: # _ = 通配符,匹配任意 return f"未知状态: {status}"
# 结构匹配match command: case ["quit"]: print("退出") case ["go", direction]: print(f"向{direction}走") case ["go", direction, distance]: print(f"向{direction}走{distance}步")速记总结
| 知识点 | 一句话记忆 |
|---|---|
*args, **kwargs | 接收任意数量位置参数/关键字参数 |
| 装饰器 | @decorator = func = decorator(func) |
yield | 暂停函数,下次从暂停处继续,按需生成值 |
@property | 把方法伪装成属性访问,可加校验 |
@classmethod | 第一个参数是类本身(cls),常用作替代构造器 |
@staticmethod | 不访问类/实例的纯工具函数 |
nonlocal | 闭包内修改外层变量 |
with open() | 自动管理文件关闭,安全读写 |
lru_cache | 给函数加缓存,相同参数直接返回结果 |
pathlib.Path | 面向对象的文件路径操作,推荐替代 os.path |
:= 海象运算符 | 赋值的同时用于判断/表达式 |
match-case | 类似 switch-case 的模式匹配(3.10+) |
| 类型提示 | def f(x: int) -> str: 不影响运行,提升可读性 |
__name__ == "__main__" | 脚本被直接运行时才执行,被 import 时不执行 |
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
Python 高级语法速览
https://firefly.cuteleaf.cn/posts/编程学习/python/python高级/