// complete reference

Python

Cheat Sheet

// Python 3.x 语法速查 · 数据结构 · 函数 · 类 · 标准库

01 / 基本数据类型
数值 & 布尔
# 整数(无限精度)
x = 42
big = 10_000_000   # 下划线分隔
h = 0xFF           # 十六进制
b = 0b1010         # 二进制

# 浮点
f = 3.14
e = 2.5e-3

# 复数
c = 3+4j

# 布尔(bool 是 int 子类)
True + True  # = 2
bool(0)      # False
bool("")     # False
bool([])     # False
字符串基础
# 字符串字面量
s = "hello"
s = 'world'
s = """多行
字符串"""

# f-string(推荐)
name = "Alice"
age = 30
print(f"{name} is {age}")
print(f"{age:05d}")   # 00030
print(f"{3.14159:.2f}")  # 3.14

# 原始字符串
path = r"C:\Users\name"

# 字节串
b = b"bytes"
类型转换 & 检查
int("42")        # 42
float("3.14")    # 3.14
str(100)         # "100"
bool(1)          # True
list("abc")      # ['a','b','c']
tuple([1,2])    # (1, 2)

# 类型检查
type(x) == int
isinstance(x, (int, float))

# None
x = None
if x is None:
    print("null")
02 / List · Dict · Set · Tuple
List 列表
lst = [1, 2, 3, 4, 5]

# 索引 & 切片
lst[0]       # 1
lst[-1]      # 5
lst[1:3]     # [2, 3]
lst[::-1]    # 反转

# 常用方法
lst.append(6)
lst.extend([7, 8])
lst.insert(0, 0)
lst.remove(3)   # 删第一个3
lst.pop()        # 删最后一个
lst.pop(0)      # 删索引0
lst.sort()
lst.sort(reverse=True)
lst.reverse()
lst.index(2)   # 找位置
lst.count(2)   # 计数

# 列表推导式
squares = [x**2 for x in range(10)]
evens = [x for x in lst if x % 2 == 0]
Dict 字典
d = {"name": "Alice", "age": 30}

# 访问
d["name"]              # KeyError 若不存在
d.get("age", 0)       # 默认值0
d.setdefault("x", 1) # 不存在则设置

# 增删改
d["email"] = "a@b.com"
del d["age"]
d.pop("name")
d.update({"x": 1, "y": 2})

# 遍历
for k, v in d.items(): ...
for k in d.keys(): ...
for v in d.values(): ...

# 字典推导式
inv = {v: k for k, v in d.items()}

# 合并(Python 3.9+)
merged = d1 | d2
Set & Tuple
# Set 集合
s = {1, 2, 3}
s = set([1,2,2,3])  # {1,2,3}
s.add(4)
s.discard(2)   # 不报错
s.remove(2)    # 不存在则报错

# 集合运算
a | b   # 并集 union
a & b   # 交集 intersection
a - b   # 差集 difference
a ^ b   # 对称差
a <= b  # 子集

# Tuple 元组(不可变)
t = (1, 2, 3)
t = 1, 2, 3      # 隐式打包
a, b, c = t     # 解包
a, *rest = t    # 星号解包
t[0]            # 索引可以
# t[0] = 1     # TypeError!

# named tuple
from collections import namedtuple
Point = namedtuple('Point', ['x','y'])
Collections 模块
from collections import (
    Counter, defaultdict, deque, OrderedDict
)

# Counter
c = Counter("abracadabra")
c.most_common(3)  # 前3个

# defaultdict
dd = defaultdict(list)
dd["key"].append(1)  # 无需初始化

# deque(双端队列)
dq = deque(maxlen=3)
dq.appendleft(0)
dq.popleft()
dq.rotate(1)

# OrderedDict(Py3.7+ dict已有序)
od = OrderedDict()
03 / 字符串方法
常用字符串方法
方法说明
s.upper() / s.lower()大/小写
s.strip() / lstrip() / rstrip()去空白
s.split(sep)分割为列表
sep.join(lst)列表合并为字符串
s.replace(old, new)替换
s.find(sub)找位置,-1表示未找到
s.startswith(p) / endswith(p)前/后缀
s.count(sub)子串出现次数
s.encode("utf-8")编码为bytes
s.zfill(n)零填充到宽度n
s.center(n, '-')居中填充
s.isdigit() / isalpha()检测字符类型
格式化 & 正则
# format 方法
"{} + {} = {}".format(1, 2, 3)
"{name}".format(name="Alice")
"{:>10.2f}".format(3.14)

# 正则表达式
import re
re.search(r'\d+', "abc123")
re.findall(r'\w+', text)
re.sub(r'\s+', ' ', text)
re.split(r'[,;]', text)
re.match(r'^abc', text)  # 从头匹配

# 编译正则(复用更快)
pat = re.compile(r'\d{4}-\d{2}-\d{2}')
pat.findall(text)
04 / 函数 · Lambda · 装饰器
函数定义
# 基本函数
def greet(name: str, greeting: str = "Hello") -> str:
    """文档字符串"""
    return f"{greeting}, {name}!"

# *args 和 **kwargs
def func(*args, **kwargs):
    print(args)    # tuple
    print(kwargs)  # dict

# 仅关键字参数
def func(a, *, b, c=0):  # b必须关键字
    ...

# 解包传参
args = [1, 2, 3]
func(*args)
func(**{"a":1, "b":2})
Lambda & 高阶函数
# lambda 匿名函数
square = lambda x: x**2
add = lambda x, y: x + y

# sorted 自定义键
sorted(lst, key=lambda x: x[1])
sorted(people, key=lambda p: p.age)

# map / filter / reduce
list(map(lambda x: x*2, lst))
list(filter(lambda x: x>0, lst))

from functools import reduce
reduce(lambda a,b: a+b, [1,2,3])

# partial 偏函数
from functools import partial
double = partial(pow, exp=2)
装饰器 Decorator
import functools

# 基本装饰器
def my_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print("before")
        result = func(*args, **kwargs)
        print("after")
        return result
    return wrapper

@my_decorator
def hello():
    print("hello")

# 带参数的装饰器
def repeat(n):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            for _ in range(n):
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeat(3)
def hi(): print("hi")
生成器 & 迭代器
# 生成器函数
def fib():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

# 生成器表达式
gen = (x**2 for x in range(10))
next(gen)    # 0

# itertools
import itertools
list(itertools.islice(fib(), 10))
itertools.chain([1,2], [3,4])
itertools.product('AB', repeat=2)
itertools.combinations('ABCD', 2)
itertools.permutations('ABC', 2)
05 / 类与继承
类定义
class Animal:
    # 类变量
    species_count = 0

    def __init__(self, name: str, age: int):
        self.name = name     # 实例变量
        self._age = age      # 约定私有
        self.__secret = 42  # 名称改写
        Animal.species_count += 1

    def speak(self) -> str:
        return f"{self.name} makes a sound"

    @property
    def age(self): return self._age

    @age.setter
    def age(self, v):
        if v < 0: raise ValueError
        self._age = v

    @classmethod
    def get_count(cls): return cls.species_count

    @staticmethod
    def is_alive(): return True

    def __repr__(self):
        return f"Animal({self.name!r})"

    def __str__(self):
        return self.name
继承 & 魔法方法
class Dog(Animal):
    def __init__(self, name, age, breed):
        super().__init__(name, age)
        self.breed = breed

    def speak(self):  # 重写
        return "Woof!"

# 多继承
class C(A, B): ...

# dataclass(Python 3.7+)
from dataclasses import dataclass, field

@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0
    tags: list = field(default_factory=list)

# 常用魔法方法
# __len__  __getitem__  __setitem__
# __iter__  __next__  __contains__
# __add__  __eq__  __lt__  __hash__
# __enter__  __exit__  (上下文管理器)
06 / 异常处理 & 文件操作
异常处理
try:
    result = 10 / 0
except ZeroDivisionError as e:
    print(f"Error: {e}")
except (TypeError, ValueError) as e:
    print(e)
else:
    print("no error")  # try成功时
finally:
    print("always runs")

# 自定义异常
class AppError(Exception):
    def __init__(self, msg, code=0):
        super().__init__(msg)
        self.code = code

raise AppError("bad input", code=400)

# 重新抛出
except Exception:
    logger.error(...)
    raise  # 原样重抛
文件操作
# 读取文件
with open("file.txt", "r", encoding="utf-8") as f:
    content = f.read()       # 全部
    lines = f.readlines()   # 行列表
    for line in f: ...      # 逐行

# 写入文件
with open("out.txt", "w") as f:
    f.write("hello\n")
    f.writelines(lines)

# 追加模式
with open("log.txt", "a") as f: ...

# pathlib(推荐)
from pathlib import Path
p = Path("dir/file.txt")
p.read_text(encoding="utf-8")
p.write_text("content")
p.exists()
p.mkdir(parents=True, exist_ok=True)
list(p.glob("**/*.py"))
07 / 常用内置函数
内置函数速查
函数用法
len(x)长度
range(n) / range(a,b,s)数字序列
enumerate(it, start=0)带索引遍历
zip(a, b, ...)并行遍历
sorted(it, key=, reverse=)排序新列表
min() / max() / sum()聚合
abs() / round() / pow()数学
any(it) / all(it)逻辑聚合
map(f, it)映射
filter(f, it)过滤
open(path, mode)文件
print(*args, sep, end)输出
input(prompt)读取输入
repr(x) / str(x)字符串表示
hash(x) / id(x)哈希/内存地址
getattr / setattr / hasattr反射
vars(obj) / dir(obj)属性字典/列表
os · sys · json
import os, sys, json

# os 模块
os.getcwd()
os.listdir(".")
os.path.join("dir", "file")
os.path.exists(path)
os.makedirs(path, exist_ok=True)
os.environ.get("HOME")
os.getenv("PATH")

# sys 模块
sys.argv        # 命令行参数
sys.path        # 模块搜索路径
sys.exit(0)    # 退出
sys.stdin / sys.stdout / sys.stderr

# json 模块
data = json.loads('{"a":1}')   # 解析
text = json.dumps(data, indent=2, ensure_ascii=False)
with open("f.json") as f:
    data = json.load(f)        # 从文件
json.dump(data, f, indent=2)  # 写文件
datetime · re
from datetime import datetime, date, timedelta

# 当前时间
now = datetime.now()
today = date.today()

# 解析 & 格式化
dt = datetime.strptime("2024-01-15", "%Y-%m-%d")
dt.strftime("%Y/%m/%d %H:%M")

# 时间运算
one_week = timedelta(weeks=1)
next_week = now + one_week
delta = dt2 - dt1
delta.days  # 天数差

# timestamp
ts = datetime.now().timestamp()
datetime.fromtimestamp(ts)

# subprocess
import subprocess
result = subprocess.run(
    ["ls", "-la"], capture_output=True, text=True
)
print(result.stdout)