Python 高级语法速览

3098 字
15 分钟
Python 高级语法速览

适合已有 Python 基础语法 + 数据容器基础的同学,快速建立高级语法知识框架。


目录#


一、模块与包#

模块 = 一个 .py 文件; = 含 __init__.py 的文件夹。

# 导入方式
import os # 导入整个模块
from os.path import join # 导入具体函数
from collections import defaultdict as dd # 别名导入

常用技巧:

# 动态导入(字符串 → 模块)
import importlib
mod = 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) # ❌ TypeError

2.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、无匿名函数)精准流程

  1. 原地排序,遍历列表每个元素。
  2. 直接以元素自身作为排序依据。
  3. 按默认升序规则重排原列表,完成。

data_list.sort(key=lambda item: len(item))(带匿名函数)精准流程

  1. 原地排序,遍历列表每个元素。
  2. 逐个把单个元素赋值给匿名函数形参 item
  3. 执行 len(item),得到排序权重。
  4. 按权重升序重排原列表,完成。
精准流程(无冗余)#
  1. data_list.sort() 触发原地排序,遍历列表每个元素。
  2. 遍历中依次将单个元素传入 lambda 的形参 item
  3. 执行 len(item),得到当前元素字符串长度,作为该元素的排序权重
  4. 依据权重从小到大,重新排列原列表,完成排序。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
@timer
def 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) # 1
next(it) # 2

4.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 # ❌ AttributeError

5.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 + B

5.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 / 0
except 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
@contextmanager
def 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 — 带默认值的 dict
dd = 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") # 10

8.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 # .log
p.stem # app
p.read_text(encoding="utf-8") # 读取内容
p.write_text("hello", encoding="utf-8") # 写入内容
list(Path(".").glob("**/*.py")) # 递归查找所有 .py

8.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, Set
def 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高级/
作者
伊月酱
发布于
2026-06-14
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Firefly
Hello, I'm Firefly.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
28
分类
10
标签
49
总字数
28,946
运行时长
0
最后活动
0 天前

文章目录