// Python 3.x 语法速查 · 数据结构 · 函数 · 类 · 标准库
# 整数(无限精度)
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")
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]
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 集合
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'])
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()
| 方法 | 说明 |
|---|---|
| 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)
# 基本函数
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 匿名函数
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)
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)
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__ (上下文管理器)
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"))
| 函数 | 用法 |
|---|---|
| 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) | 属性字典/列表 |
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) # 写文件
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)