Python 速查手册
全部
代码 | 说明 |
|---|
x = 10; y = "hello" | 动态类型变量赋值,无需声明类型 |
a, b = 1, 2; a, b = b, a | 多变量赋值与优雅交换 |
print(f"{x = }, {y!r}") | f-string 调试:x= 输出变量名和值 |
pi: float = 3.14 | 类型注解(仅提示,不强制) |
if __name__ == '__main__': main() | 作为脚本直接运行时才执行 |
x = None # 空值 | None 表示空值,判断用 is None |
True, False # 首字母大写 | 布尔值是 int 子类,True == 1 |
# 单行注释 """文档字符串""" | 注释与模块/函数文档字符串 |
type(x), isinstance(x, int) | 查看类型 / 类型检查 |
lst = [1, 2, 3]; lst.append(4) | 列表:尾部追加 O(1) |
lst.insert(0, 0); lst.extend([5, 6]) | insert 头部插入 O(n);extend 合并列表 |
lst.pop(); lst.pop(0); lst.remove(3) | 按索引弹出(默认末位)/ 按值删除 |
lst = [3, 1, 2]; lst.sort(reverse=True) | 原地排序;sorted(lst) 返回新列表 |
lst = [0] * 5; m = [[0] * 3 for _ in range(3)] | 初始化列表;二维列表必须用推导式 |
tup = (1, 2, 3); a, *rest = [1, 2, 3, 4] | 元组不可变;星号解包收集剩余元素 |
d = {'a': 1}; d['b'] = 2 | 字典:键值对,查找 O(1) |
d.get('x', 0) # 键不存在返回默认值 | get 避免-KeyError |
d.setdefault('k', []).append(1) | 不存在则设默认值并返回,一行初始化列表 |
d1 | d2 # Py3.9+ 合并字典 | 管道符合并字典(后者覆盖前者) |
for k, v in d.items(): ... | 遍历键值对(keys()/values() 同理) |
s = {1, 2, 3}; s.add(4); a & b | c - d | 集合去重;支持交/并/差运算 |
from collections import deque; q = deque([1,2]); q.appendleft(0); q.popleft() | 双端队列:两端操作均 O(1),适合做队列 |
from collections import Counter; Counter("aabbbc").most_common(2) | 计数器:统计频率取前 N |
from collections import defaultdict; dd = defaultdict(list); dd["k"].append(1) | 带默认值字典:访问不存在的键自动初始化 |
f'我叫{name},今年{age}岁,{price:.2f}元' | f-string 格式化,:2f 保留两位小数 |
f'{n:,} {r:8.2%} {b:08b}' | 千分位/百分比/二进制补零格式化 |
s.strip(); s.lstrip(); s.rstrip() | 去除两端/左/右空白(可传字符集) |
'a,b,c'.split(','); '-'.join(['a','b']) | 分割与拼接字符串 |
s.replace('old', 'new'); s.startswith('x') | 替换与前缀判断(endswith 同理) |
s.upper(); s.lower(); s.title(); s.capitalize() | 大小写转换 |
s.find('x'); 'x' in s; s.count('x') | 查找(无则-1)/ 包含判断 / 计数 |
s[1:4]; s[::-1]; s[::2] | 切片:区间 / 反转 / 步长取值 |
s.zfill(5); '42'.rjust(5, '0'); '3.14'.center(10, '*') | 补零与对齐填充 |
'123'.isdigit(); 'abc'.isalpha(); 'a1'.isalnum() | 字符类型判断 |
if x > 0: ...
elif x == 0: ...
else: ... | 条件分支(注意缩进即语法) |
y = '偶数' if n % 2 == 0 else '奇数' | 三元条件表达式 |
for i, v in enumerate(lst, start=1): ... | 遍历同时获取索引(从 1 开始计数) |
for a, b in zip(lst1, lst2): ... | 并行遍历多个序列(按最短截断) |
for k, v in sorted(d.items(), key=lambda x: x[1], reverse=True): ... | 按值降序遍历字典 |
while True:
if done: break | while 循环与 break/continue |
for-else: for x in lst:
if hit: break
else: ... | 循环正常结束(未 break)时执行 else |
match cmd:
case "go" | "g": ...
case _: ... | match 结构化匹配(Python 3.10+) |
from itertools import product, combinations; product("01", repeat=3) | 笛卡尔积/组合等迭代工具 |
def f(a, b=2, *args, **kwargs): ... | 可变参数:args 收元组,kwargs 收字典 |
def f(*, key_only): ... | 星号后为仅关键字参数,必须按名传递 |
def fib(n): return 1 if n < 2 else fib(n-1) + fib(n-2) | 递归与条件表达式一行写法 |
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n): ... | 缓存装饰器:记忆化递归提速 |
def deco(fn):
def wrapper(*a, **kw):
r = fn(*a, **kw)
return r
return wrapper | 装饰器模板:包装函数增强行为 |
from functools import wraps
@wraps(fn)
def wrapper(...): ... | 装饰器保留原函数名与文档 |
f = lambda x, y: x + y | 匿名函数:适合作为 key 参数 |
sorted(lst, key=lambda x: x.age, reverse=True) | 按对象属性排序 |
sorted(words, key=str.lower) | 忽略大小写排序(str.lower 无需括号) |
from functools import partial; int2 = partial(int, base=2) | 偏函数:固定部分参数 |
def gen():
yield 1
yield 2 | 生成器:惰性逐个产出,省内存 |
def add(a: int, b: int) -> int:
return a + b | 函数类型注解(配合 typing/mypy) |
class Dog:
def __init__(self, name):
self.name = name | 类定义与构造方法 |
def __str__(self): return f"Dog({self.name})" | print 对象时的友好输出 |
def __repr__(self): ... | 调试时的官方表示(无 __str__ 时兜底) |
class Dog(Animal):
super().__init__() | 继承并调用父类方法 |
@classmethod
def create(cls): return cls() | 类方法:第一个参数是类,常作工厂 |
@staticmethod
def util(): ... | 静态方法:与类状态无关的工具函数 |
@property
def area(self): return self._r ** 2 | 把方法伪装成只读属性 |
from dataclasses import dataclass
@dataclass
class P:
x: float
y: float = 0 | 数据类:自动生成 __init__/__repr__/__eq__ |
from dataclasses import field
@dataclass
class T:
tags: list = field(default_factory=list) | dataclass 可变默认值必须用 field |
__slots__ = ("x", "y") | 限制实例属性并节省内存 |
def __len__(self); def __getitem__(self, i); def __eq__(self, o) | 魔术方法:支持 len()/下标/比较 |
from enum import Enum
class Color(Enum):
RED = 1 | 枚举类型 |
with open('a.txt', encoding='utf-8') as f:
text = f.read() | 上下文管理器自动关闭文件;读全文 |
for line in f: ...
lines = f.readlines() | 逐行遍历大文件(省内存)/ 一次读所有行 |
with open('out.txt', 'w', encoding='utf-8') as f:
f.write('hi') | 写文件(w 覆盖 / a 追加) |
import json
json.dump(obj, f, ensure_ascii=False, indent=2) | 写入 JSON(中文不转义、带缩进) |
json.loads(s); json.dumps(obj, default=str) | JSON 字符串互转(default 处理不可序列化对象) |
import csv
with open("d.csv", newline="") as f:
rows = csv.DictReader(f) | 按字典方式读取 CSV |
try:
...
except (ValueError, KeyError) as e:
...
finally: ... | 异常捕获(多类型/别名/finally 必然执行) |
raise ValueError("非法输入") from e | 抛出异常并保留原始异常链 |
try:
risky()
except Exception:
pass | 吞掉异常(仅限明确意图,调试慎用) |
import os; os.environ.get("KEY", "默认") | 读取环境变量 |
[x * 2 for x in lst if x > 0] | 列表推导式:映射 + 过滤 |
{k: v for k, v in pairs if v} | 字典推导式 |
{x % 3 for x in range(100)} | 集合推导式:自动去重 |
gen = (x * 2 for x in range(10**8)) | 生成器表达式:惰性求值不占内存 |
[f(x) for row in m for x in row] | 嵌套循环推导式:展平二维列表 |
list(map(str, nums)); list(filter(None, lst)) | map 映射 / filter 过滤(None 过滤假值) |
sum(lst); max(lst, key=len); any(x > 0); all(x > 0) | 聚合与全称/存在判断 |
list(zip(*matrix)) | 矩阵转置(星号解包 + zip) |
from pathlib import Path
Path("a") / "b.txt"; p.read_text(encoding="utf-8") | 面向对象路径操作:拼接/读写一步到位 |
Path(".").glob("*.py"); p.exists(); p.stem; p.suffix | glob 匹配文件/存在性/文件名与后缀 |
import datetime
datetime.date.today(); datetime.datetime.now() | 当前日期与时间 |
datetime.datetime.strptime('2024-01-02', '%Y-%m-%d') | 字符串解析为时间;strftime 为反向格式化 |
from datetime import timedelta
dt + timedelta(days=7) | 日期加减时间差 |
import re
re.findall(r"\d+", s); re.sub(r"\s+", " ", s) | 正则:提取所有匹配 / 替换 |
import random
random.choice(lst); random.sample(lst, 3); random.random() | 随机选取/抽样/[0,1) 随机数 |
import math
math.ceil(x); math.floor(x); math.sqrt(2) | 数学函数 |
import hashlib
hashlib.sha256(data).hexdigest() | 计算 SHA256 摘要 |
import time
time.time(); time.sleep(1) | 时间戳与休眠 |
import logging
logging.basicConfig(level=logging.INFO) | 标准日志(不要用 print 做生产日志) |
import sys
sys.argv; sys.path; sys.exit(1) | 命令行参数/模块搜索路径/退出码 |
import argparse; argparse.ArgumentParser() | 命令行参数解析 |
from typing import Optional, List # 3.9+ 可用 list[int] | 类型提示常用工具 |
import unittest / pytest(第三方) | 测试框架;pytest 断言更简洁 |
pip install -r requirements.txt | 安装依赖清单 |
python -m venv .venv && source .venv/bin/activate | 创建并激活虚拟环境(Windows 用 activate.bat) |
pip freeze > requirements.txt | 导出当前环境依赖 |
def bad(x, acc=[]): ... # 共享同一个列表
def good(x, acc=None):
acc = acc or [] | 可变默认参数只创建一次,用 None 代替 |
a = [1, 2]; b = a; b.append(3) # a 也变了
b = a.copy() | 赋值只是引用,浅拷贝用 copy()/list() |
import copy; copy.deepcopy(nested) | 嵌套结构必须深拷贝,浅拷贝只复制第一层 |
a = 256; b = 256; a is b # True
a = 257; b = 257; a is b # 可能 False | is 只比身份;小整数缓存导致假象,值比较用 == |
fns = [lambda: i for i in range(3)] # 全是 2
fns = [lambda i=i: i for i in range(3)] # 0,1,2 | 闭包捕获变量本身,用默认参数固化当前值 |
0.1 + 0.2 == 0.3 # False
from decimal import Decimal; Decimal('0.1') + Decimal('0.2') | 浮点精度问题,金额计算用 Decimal |
s = input() # 'abc'
int(s) # ValueError | 字符串转数字前注意校验(isdigit/try) |
lst = [1, 2, 3]
for x in lst:
lst.remove(x) # 跳元素! | 遍历时修改列表会跳过元素,应遍历副本 |
d = {}; k = [1]
d[k] = 1 # TypeError | dict 键必须可哈希(不可变),列表不行用元组 |
except Exception as e:
print(e.args) | 异常对象不是字符串,取信息用 args 或 str(e) |
1 < x < 10 # 链式比较
round(2.5) == 2 # 银行家舍入 | round 是四舍六入五取偶,不是四舍五入 |
点击任意行可复制代码;内容基于 Python 3.8+,个别特性(如 match 语句)需 3.10+