0xB 写在前面的话
本文档是 Python 数据分析考试的参考/复习资料,涵盖 基本语法、常用函数、简单算法实现 等内容。
- 适用人群:一编程基础的同学(备考)
- 纯粹没过函数的或者自己写过的请不要用本文档,本文档不包含足够例子!
- 作者:Danvei233(@GitHub)
- 第零章是基本语法和纲要(速查)
- 使用GPT-o3润色
0xD 目录
[TOC]
0x0 基本语法与数据类型
0.1 变量与数据类型概览
| 分类 | 内置类型 | 典型字面量 / 赋值示例 | 构造函数 (函数式写法) | 常见操作 | 备注 |
|---|---|---|---|---|---|
| 数字 (Numeric) | int float complex | a = 3 b = 1.2 c = 2+3j | int("42") float("3.14") complex(2, 3) | 加减乘除 + - * / 幂 ** 取整除 // 取余 % | bool 本质上继承自 int (True==1, False==0) |
| 布尔 (Boolean) | bool | flag = True is_ok = (3 == 1) | bool(0) → False | 逻辑与 and 逻辑或 or 取反 not | 只可取值 True/False |
| 序列 (Sequence) | str list tuple range | s = "hello" s2 = f"{name}" lst = [1, 2, 3] tpl = (1, 2) r = range(0, 5) | str(123) list("abc") tuple([1,2]) range(5) | 切片 [:] 拼接 + 成员测试 in 长度 len() | str、tuple、range 不可变;list 可变 |
| 映射 (Mapping) | dict | d = {"name": "Bob", "age": 18} | dict(name="Bob", age=18) | 取值 d[key] 遍历 for k,v in d.items() | 键必须可哈希 (hash) |
| 特殊单值 | NoneType | x = None | — | 占位、空值 | 只有一个实例 None |
提示:
type(obj)可查看变量实际类型,isinstance(obj, T)用于类型判断(推荐),构造函数可以用于转换类型。
0.2 函数及其结构
函数:带名字的可复用代码块,对输入(参数)进行处理并可返回输出(返回值)。
0.2.1 定义语法
| |
def关键字后跟函数名和参数列表,末尾必须有冒号:。- 函数体必须统一缩进(推荐 4 个空格)。
return没有表达式时等价于return None。
0.2.2 函数命名规则
- 不与现有标识符重复,区分大小写。
- 以字母或
_开头,不能以数字开头,且不含特殊符号。 - 推荐 snake_case 或驼峰
camelCase,关键是自描述。 例如:is_leap_year(year)一看即知其功能与返回值。
0.2.3 参数类型
- 位置参数:调用时按顺序一一对应。
- 默认参数:形参中写
param=value并放在末尾,可在调用时省略。 - 可变长度:
*args、**kwargs(进阶用法,考试可选)。
参数在函数调用结束后即被销毁,仅在函数体内部可见。
0.2.4 调用函数
| |
0.2.5 变量作用域
- 局部变量:在函数体内声明,只在该函数内可见。
- 全局变量:在函数外部声明;若需在函数中修改,必须使用
global关键字。
0.3 对象(class)
一句话: 类是“设计图”,对象是根据设计图做出的“实物”。
0.3.1 代码骨架(从上到下一次写完)
| |
写顺序:
class➜ 类变量 ➜__init__➜ 其他def,全部 4 空格缩进。
0.3.2 实例化(真机到手)
| |
- 访问属性:
a.val或MyClass.common_val。 - 改类变量:
MyClass.common_val = 99➜ 所有对象一起变。
0.3.3 速记要点
**self**必写:缺了会报错missing 1 required positional argument: 'self'。- 类变量 vs 实例变量:类变量大家共用;实例变量(
self.xxx)只属于自己。 - 私有/保护名:
_name单下划线:只是提醒“内部用”。__name双下划线:Python 会改名混淆,一般外部访问不到。
0.4 包(package)
一句话: 包就是把相关功能组织成文件夹,让项目结构清晰。
0.4.1 包的基本结构
| |
- 包 (
package_name) 是包含__init__.py的文件夹。 - 模块 (
module1.py) 可以导入、调用其中的变量、函数、类。
0.4.2 导入语法示例
| |
- 注意语法顺序:必须写作
from 包名 import 名称,而**import 名称 from 包名**是不合法的。 import ... as可以给包或模块起简短别名。from ... import ...让调用更直接(无需写全路径)。
0.4.3 常见用途
- 将不同功能拆分到不同模块,保持代码整洁。
- 方便多人协作,每人维护独立模块。
0.5 数字类型计算
0.5.1 数字类别回顾
- int:任意精度整数,如
42、0b1010。 - float:双精度浮点,如
3.14、6.02e23。 - complex:形如
3+4j,含实部和虚部。
0.5.2 一元运算与常用函数
| 运算/函数 | 输入 | 结果 | 示例 |
|---|---|---|---|
+x / -x | 数字 | 原值 / 相反数 | -5 |
abs(x) | 数字 | 绝对值 | abs(-3) → 3 |
round(x, n) | 浮点 | 四舍六入五靠偶;n 为保留位数 | round(3.1416, 2) → 3.14 |
int(x) / float(x) | 数字或可转换字符串 | 类型转换 | int(3.9) → 3 |
divmod(a,b) | 两整数 | (a//b, a%b) 二元组 | divmod(17,4) → (4,1) |
0.5.3 二元运算符
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
+ - * / | 加减乘除(/ 返回 float) | 7/2 | 3.5 |
// | 地板除(向负无穷取整) | -7//2 | -4 |
% | 取余 | 7%2 | 1 |
** | 幂运算 | 2**10 | 1024 |
pow(x,y[,m]) | 幂,可带模 | pow(2,10,1000) | 24 |
| `« » & | ^ ~` | 位运算 | 5<<1 |
0.5.4 math 标准库速查
| |
需要高精度时,使用
from decimal import Decimal;处理分数可用from fractions import Fraction。
0.5.5 精度陷阱与解决办法
| |
0.5.6 小技巧
环绕取模:凯撒偏移
(idx + k) % 26。例2:把输入的数字映射到星期:1 2 3week = ['日','一','二','三','四','五','六'] i = int(input('输入数字(任意整数):')) % 7 print('星期' + week[i])取十位:
n // 10 % 10;(//留高位 %留低位) 后三位:n % 1000。商余同得:
q, r = divmod(n, m)。
0.6 分支控制与循环
0.6.1 比较与逻辑运算符
| 类型 | 符号 | 含义 | 读法 / 记忆小技巧 | 示例 |
|---|---|---|---|---|
| 比较 | == | 相等 | “两个等号表示比较” | 5 == 5 → True |
!= | 不等 | “! 表示 not,和 == 组合成 ≠” | 5 != 3 → True | |
> | 大于 | “尖嘴向左,左边更大” | 5 > 3 → True | |
< | 小于 | “尖嘴向右,右边更大” | 3 < 5 → True | |
>= | 大于等于 | 读作 “大于等于”,写作 >=(记:先 > 后 =) | 5 >= 5 → True | |
<= | 小于等于 | 读作 “小于等于”,写作 <=(记:先 < 后 =) | 3 <= 5 → True | |
| 逻辑 | and | 与 | 两边都真才真 | True and False → False |
or | 或 | 一真即真 | True or False → True | |
not | 非 | 取反 | not True → False |
真值规则:0、
None,False为假,其他皆真。
0.6.2 if / elif / else
| |
- 三元表达式:
gender = '男' if isBoy(me) else '女'。
0.6.3 循环结构
while
| |
for
| |
遍历字典:
for k,v in d.items():(更多请看下面)。range(start, stop, step)不含stop,step可为负。同时遍历两个序列:
1 2for a, b in zip(list1, list2): ...
推导式
| |
0.6.4 循环相关语句
break:退出最近一层循环。continue:跳过本次迭代,继续下一次。pass:占位语句,什么都不做。
0.6.5 常见坑
- 浮点比较:用
abs(a-b) < 1e-9。 - 修改列表时遍历:可先复制
for x in lst[:]或倒序遍历。 - 死循环:确保循环体内有让条件变假的语句。
后续章节:文件 I/O、Numpy & Pandas 简明指南…
分支(if / elif / else)
| |
- 条件表达式由比较运算符(
== != > < <= >=)和逻辑运算符(not and or)组合而成。 - 禁止在条件中用浮点数判断相等,易出错。必要时用整数或阈值范围判断。
- 可以写
if x in some_list或if key in some_dict。
循环
| |
range(start, end, step):包含start,不包含end,步长step。遍历字典:
for k, v in d.items():for k in d.keys():for v in d.values():
列表推导式:
1new_list = [f(x) for x in iterable if 条件]
0x1 数据结构与文件操作
1.0 字符串
1.0.1 定义字符串
单引号或双引号包裹:
1 2a = "hello" b = 'world'三引号用于多行文本:
1 2 3 4text = """ 第一行 第二行 """原始字符串(不处理转义):
1path = r"C:ew_folder est"
| |
**format()**方法:1 2 3template = "{0} 同学成绩:{1:.2f}".format(name, score) # 或指定名称 template2 = "{n} 成绩:{s:.1f}".format(n=name, s=score)常见格式说明:
:.2f保留两位小数。:>10右对齐,占 10 个字符宽度。:<10左对齐。:^10居中对齐。
1.0.3 切片与索引获取
按索引访问单个字符:
1 2 3s = "python" s[0] # 'p' s[-1] # 'n'切片(
[start:stop:step]):1 2 3 4 5 6s = "abcdefg" s[1:4] # 'bcd' (包含索引1,不包含4) s[:3] # 'abc' s[3:] # 'defg' s[::2] # 'aceg' (步长2) s[::-1] # 'gfedcba' (反转)
1.0.4 常用字符串方法
重要提示: 字符串在 Python 中是 不可变 的——几乎所有方法都会返回 新字符串,原变量保持不变。别忘了把返回值接收进变量,否则你的修改会“丢失”。
核心方法详解
len(s)→int- 作用:返回长度。
- 返回值:整数。原字符串不变。
s.upper()/s.lower()→str- 作用:大小写转换。
- 返回值:新字符串;
s本身不变。
s.find(sub, start=0, end=len)→int- 作用:子串第一次出现的位置。
- 返回值:索引;未找到返回
-1。
s.replace(old, new, count=-1)→str- 作用:把所有(或前
count个)old换成new。 - 返回值:新字符串;不会就地修改。
- 作用:把所有(或前
s.split(sep=None, maxsplit=-1)→list[str]- 作用:按分隔符拆成列表;默认按空白拆。
- 返回值:列表;原字符串不变。
sep.join(iterable)→str- 作用:把迭代器里的元素用
sep连接。 - 返回值:新字符串。
- 小技巧:
' '.join(['Hello', 'Python'])→'Hello Python'。
- 作用:把迭代器里的元素用
s.strip(chars=None)/lstrip/rstrip→str- 作用:去掉两端或左/右侧指定字符(默认空白)。
- 返回值:新字符串。
- 判断类方法(返回
bool):s.isalpha():全是字母。s.isdigit():全是数字。s.isalnum():字母或数字。s.startswith(prefix)/s.endswith(suffix):前缀/后缀判断。
- 其他常用格式化/变形:
s.title():每个单词首字母大写。s.capitalize():首字母大写,其余小写。- 切片反转:
s[::-1]。 - s.strip() # 去除首尾空白 s.lstrip() # 去除左侧空白 s.rstrip() # 去除右侧空白
例子汇总
| |
1.0.5 输入与输出
input()
| |
map(func, iterable)会返回**map**对象(惰性迭代器),常见用法是再包一层list()、tuple()或直接用在for循环里:for x in map(int, data): ...。input(prompt)在控制台显示提示文字,等待用户敲回车。- 返回值永远是字符串,需要时自行用
int()/float()/split()等转换。
print()
| |
- 关键字参数:
sep:多个参数之间的分隔符,默认' '。end:行尾结束符,默认' ';改成''可取消自动换行。file:输出目标,默认sys.stdout;可重定向到文件对象。flush:True时立即刷新缓冲区。
小贴士:
print(*iterable, sep=' ')可快速逐行打印列表内容。
1.0.6 map()
| |
小结
map()不会立刻产生新列表,而是返回 map 对象;如果要多次使用,最好list(map(...))。eval(input())能一次读多个 Python 表达式并直接变成对应类型,但有 安全隐患;考试能用就用,开发别随便用。
1.1 列表
1.1.1 创建方式
| |
1.1.2 访问与切片
| |
1.1.3 常用统计函数
| |
1.1.4 修改与管理方法
| 方法调用 | 作用 | 就地修改? | 返回值 |
|---|---|---|---|
lst.append(x) | 在尾部加一个元素 | ✅ | None |
lst.extend(it) | 追加一个可迭代对象里的所有元素 | ✅ | None |
lst.insert(i, x) | 在索引 i 处插入 | ✅ | None |
lst.pop(i=-1) | 删除并返回索引 i(默认最后一个) | ✅ | 被弹出的元素 |
lst.remove(x) | 删 第一个 值等于 x 的元素 | ✅ | None |
lst.clear() | 清空列表 | ✅ | None |
lst.index(x) | 返回 x 第一次出现的索引 | ❌ | int |
lst.count(x) | 统计 x 出现次数 | ❌ | int |
lst.sort(key=None, reverse=False) | 原地排序 | ✅ | None |
lst.reverse() | 原地反转 | ✅ | None |
sort()vssorted():lst.sort()会直接改变原列表且返回None;sorted(lst)则生成新列表并保持原列表不变。- 不可变对象(如字符串)放进列表后,列表里只是存“引用”,若对象本身不可变就安全;可变对象(如另一个列表)若在别处修改,会反映到这里。
这样一来,数字‑字符串‑列表三大“最常用基本类型”就都有完整速查了。
如果还想再补其它容器(如元组、字典)或深入讲 sort() 的自定义 key,随时说!
## 1.2 字典(dict)
### 1.2.1 创建与赋值
| |
键必须唯一,而且必须是可哈希的不可变对象(数字、字符串、元组…)。
### 1.2.2 安全取值
直接 d[key] 若键不存在会抛 KeyError。常见两种“稳取”写法:
| |
### 1.2.3 常用方法速查
| 调用 | 作用 | 返回值 | 备注 |
|---|---|---|---|
d.get(k, default=None) | 取值 | 找到:值;没找到:default | 不报错 |
d.pop(k, default=KeyError) | 删除并返回键 k | 找不到:KeyError 或 default | 就地改 |
d.keys() / d.values() / d.items() | 分别拿到键 / 值 / (键,值) 迭代器 | dict_keys 等 | 可转 list() |
d.update(other) | 用 other 里的键值批量更新 | None | 就地改 |
d.clear() | 清空字典 | None | 就地改 |
len(d) | 键的个数 | int | 内置函数 |
### 1.2.4 遍历套路
| |
### 1.2.5 字典排序
按键排序(最简单)
1 2for k in sorted(info): # 默认升序 print(k, info[k])按值排序
1 2# sorted() 接收 key=,返回的是新列表 items = sorted(info.items(), key=lambda kv: kv[1]) # 按 value 升序多级排序
lambda返回 元组 → 先比第一项,再比第二项:1 2# 先按 value 降序,再按 key 升序 items = sorted(info.items(), key=lambda kv: (-kv[1], kv[0]))如果想对「多级元组排序」再整体反转,请不要写
sorted(..., reverse=True)—— 这样会把所有维度一起翻转; 正确做法:- 先写好带正负号的多级
key; - 或者先排好,再调用一次
items.reverse()。
- 先写好带正负号的多级
### 1.2.6 lambda 一口讲清
lambda 参数: 表达式→ 匿名小函数,用一次就丢。在
sorted,map,filter等场景下当“回调”最常见。1 2# 把字典按 value 从大到小排 sorted(info.items(), key=lambda kv: kv[1], reverse=True)
小贴士
- 字典元素无序(Python 3.7+ 保证“插入顺序”但不用于逻辑排序)。
pop()/update()都会修改原字典;想保持原数据别直接动它。- 字典很适合当“哈希表”做 O(1) 查询,例如记录字符频次、缓存计算结果等。
## 1.3 文件简单操作
### 1.3.1 open() 基本语法
| |
| 形参 | 常用取值 | 说明(一句话记住就够) |
|---|---|---|
filepath | "data.txt" / "./dir/log.csv" | 文件相对或绝对路径 |
mode | "r" 读 "w" 写(覆盖) "a" 追加"rb" 二进制读 "wb" 二进制写 | r=read w=write a=append |
encoding | "utf-8"(最常用) | 文本文件的字符集;二进制模式不用写 |
"w"会清空旧文件;若想安全一些,先用"a"或检查os.path.exists()。- 省略
encoding可能在不同系统读写中文时乱码,最好显式写"utf‑8"。
### 1.3.2 推荐写法:with … as
| |
考点:用 *with* 可以自动关闭文件,省去 *f.close()*,也能避免忘关导致数据没落盘。
### 1.3.3 常用读写方法
| 调用 | 用途 | 返回值 / 行为 | 典型示例 |
|---|---|---|---|
f.read() | 读完整个文件 | 字符串 | data = f.read() |
f.readline() | 读一行(含 \n) | 字符串 | line = f.readline() |
f.readlines() | 按行读全部 | 列表,每行一元素 | lines = f.readlines() |
f.write(s) | 写入字符串 s | 写入字节数 (int) | f.write("hello\n") |
f.writelines(list) | 连续写多行 | None | f.writelines(lines) |
f.close() | 手动关文件 | None | 不用 with 时必须调 |
- 读完后文件指针在末尾,想再读需要
f.seek(0)把指针移回开头。write()不自动换行,记得手动加\n。- 二进制模式 (
"rb","wb") 读写得到/要求bytes而非str。
### 1.3.4 最常见 2 个模板
① 逐行读取并处理
| |
② 写分析结果
| |
只要记住“with open(...) as f: ➜ f.read / f.write ➜ 自动关闭”,文件 I/O 的基础就够用了。
0x2 数据分析
#此节过于坑爹(半节课讲了4-5节的内容??) 故附上官方文档以供打印!本文档此处只简单列出基础用法。用于提示!!!!!
入门教程 — pandas 2.2.3 文档 - pandas 数据分析库
2.1 NumPy 库
一句话记住: NumPy = 超快多维数组 + 矢量化数学运算。
1import numpy as np # ⚠️ 别写成 import np as np
2.1.1 数组创建
| 方法 | 功能 | 示例 |
|---|---|---|
np.array(obj, dtype=…) | 列表 → 数组;可指定类型 | np.array([[1,2],[3,4]], dtype=np.int32) |
np.arange(start, stop, step) | 等差序列 | np.arange(0, 10, 2) |
np.linspace(start, stop, num) | 均分 num 个点 | np.linspace(0, 1, 5) |
np.zeros(shape) | 全 0 | np.zeros((2,3)) |
np.ones(shape) | 全 1 | np.ones((2,3)) |
np.eye(N) / np.eye(M,N,k) | 单位阵 / 偏移对角阵 | np.eye(5)``np.eye(3,5,2) |
np.full(shape, fill_value) | 固定值⚠️ 若 ***\**\*fill_value\*\**\*** 是列表,其长度必须 == 最后一维长度 | np.full((2,3,4), 9)``np.full((2,3,4), [1,2,3,4]) |
2.1.1.1 随机数组
| 方法 | 功能 | 示例 | ⚠️ 易错点 |
|---|---|---|---|
np.random.random(shape) | [0,1) 均匀 | np.random.random((2,3)) | 只能传形状元组,不能分写 m,n |
np.random.randn(d1,d2,…) | 标准正态 | np.random.randn(2,3) | 不能把整体 shape 打包成元组 |
np.random.randint(low, high, size=shape) | 整数随机 | np.random.randint(0, 10, size=(2,3)) |
2.1.2 数组修改
2.1.2.1 形状 & 类型
| 操作 | 说明 | ⚠️ 提示 |
|---|---|---|
a.reshape(new_shape) | 更改形状,元素总数不变 | 多余/不足都会报错,不会自动填补 |
a.T / a.transpose() | 转置 | |
a.astype(dtype) or a.dtype = dtype | 改类型 | 常用别名:np.int_, np.float_ 等 |
2.1.2.2 数据级改动
- 切片换序:
a[::-1]、a[:, ::-1] - 合并:
np.concatenate([a,b], axis=…) - 插入:
np.insert(a, index, values, axis=…)
2.1.3 属性查询 & 切片
| 属性含义快速查看 | ||
shape | 形状 (行, 列, …) | a.shape |
dtype | 元素类型(int32、float64…) | a.dtype |
ndim | 维度数 | a.ndim |
size | 元素总数 | a.size |
nbytes | 占用字节数 | a.nbytes |
| itemsize | 每个元素占字节 | a.itemsize |
多维切片范式
1 2a[:, s:e:step] # 多行部分列 a[i, j] # 单个元素
2.1.4 逻辑运算 & 条件筛
| |
⚠️ 逻辑运算符要用
***\**\*&\*\**\***/***\**\*|\*\**\***,并加括号
1(a > 1) & (a < 5)
2.1.5 广播 (Broadcasting)
| 场景 | 例子 | ⚠️ 注意 |
|---|---|---|
| 标量 × 数组 | a * 3 | |
| 不同形状数组 | (3,1) × (1,4) → (3,4) | |
| 数值陷阱 | 0**0 得到 1 | 1/0 → inf,可 np.isinf 检测 |
向量/矩阵乘法
1 2np.dot(a, b) # 点乘 np.cross(a, b) # 叉乘
2.1.6 统计 & 聚合
| 函数 | 作用 |
|---|---|
a.sum(axis) / a.mean(axis) | 求和 / 均值 |
a.min / a.max | 最小 / 最大 |
a.var / a.std | 方差 / 标准差 |
轴解释:
axis=0⇢ 按行聚合(看成“列方向”);axis=1⇢ 按列聚合。
2.1.7 拷贝语义
| 方法 | 数据是否复制 | 用途 |
|---|---|---|
b = a.view() | 否 | 轻量别名,共享底层数据 |
b = a.copy() | 是 | 深拷贝,互不影响 |
2.1.8 删除 & 去重
| 操作 | 示例 | ⚠️ 坑点 |
|---|---|---|
| 去重 | np.unique(a) | |
| 删除 | np.delete(a, idx, axis=None) | ① axis=None → 扁平化后删② 删单元会破坏矩阵形状,结果一维 |
⚡ 速记清单
**import numpy as np**(别写成import np)。- 随机数组:
random.random(shape)只能形状元组,random.randn直接写维度。 - 逻辑运算记得
**&**** /***\*|\****+ 括号**。 np.where(cond, x, y)三个参数不可少。- 转置
a.T,改形a.reshape(new_shape)不改变元素总数。 view()共享数据,copy()独立数据。0**0 == 1;1/0→inf。np.delete的axis表示在哪个轴上删索引,写错会降维。
2.2 Pandas 库概览
一句话记住: Pandas = “带标签的一维 Series + 二维 DataFrame” + 大量 SQL 风格操作
1import pandas as pd # ⚠️ 别写成 import pandas as np
2.2.1 读入数据
| 函数 | 主要参数 | ⚠️ 坑点 |
|---|---|---|
pd.read_csv(filepath, sep=',', header='infer', names=…, index_col=…, skiprows=…) | sep 分隔符header: 行号或 Nonenames: 自指定列名index_col: 哪列做索引skiprows: 跳过前几行 | **header=True** 写法非法! 应写 header=0 或 header=None |
其他:read_excel, read_sql… | 此处不展开 |
| |
基本信息速查
| |
2.2.2 核心数据结构
| 结构 | 创建方式 | 说明 |
|---|---|---|
| Series | pd.Series(list_or_dict) | ⚠️ 首字母大写;若用字典,索引跟随字典键 |
| DataFrame | pd.DataFrame(dict_or_ndarray) | 单行视作 Series,但 df[['name']] 仍返回 DataFrame |
2.2.2.1 Series 访问
| |
2.2.2.2 DataFrame 访问
| 方式 | 示例 | 返回 |
|---|---|---|
| 按列 | df['col'] | Series |
| 多列 | df[['c1','c2']] | DataFrame |
| 重排列顺序 | df[['c3','c1','c2']] | New DataFrame |
**.loc** | df.loc['row', 'col'] | 标签取值 |
**.iloc** | df.iloc[0, 1] | 纯整数位置 |
**.at** / **.iat** | 单元素极速定位 | df.at['r','c'] |
⚠️
**.iloc**不支持布尔 / label,只接受整数;切片右端 包含。
2.2.3 查询(五大套路)
**loc**— 最推荐:逻辑、切片、函数一把抓1 2 3df.loc[(df['name']!='NaN') & (df['age']>18)] df.loc['20240101':'20240131'] df.loc[lambda d: d['score'] > 90]**iloc**:纯数字行列**where**:保持原形,条件不满足处填 NaN**query**:SQL 风格字符串,列名可直接写1df.query("age > 18 and city == 'Beijing'")布尔索引:
mask = (df['x']>0); df[mask]
2.2.4 新增 / 修改列
| 方法 | 示例 |
|---|---|
| 直接赋值 | df['new'] = df['old'] * 1.2 |
**loc** 写列 | df.loc[:, 'flag'] = (df['score']>60) |
str 处理 | df['city'] = df['city'].str.replace('市','') |
| 类型转换 | df['age'] = df['age'].astype(int) |
**apply(func, axis)** | 行级: axis=1;列级: axis=0df['sum'] = df.apply(lambda r: r.a+r.b, axis=1) |
多列 apply | 返回 pd.Series 并 join |
2.2.5 统计与描述
| |
| 相关矩阵 | 示例 |
|---|---|
| 协方差 | df[['x','y']].cov() |
| 相关系数 | df[['x','y']].corr() |
2.2.6 缺失值处理
| 函数 | 关键参数 | 说明 |
|---|---|---|
isnull / notnull | - | 返回布尔同维度 |
dropna(axis=0, how='any', inplace=False) | axis: 0 行 / 1 列how: 'any' 或 'all' | 删除包含空值的行/列 |
fillna(value=…, method=…, axis=0, inplace=False) | value: 单值或列名→值字典method: 'ffill' / 'bfill' | 前向 / 后向填充 |
2.2.7 排序 & 重排
| |
⚡ 速记清单
**read_csv**参数:**sep**+**header**+**names**+**index_col**;header=True写法会炸!Series/DataFrame首字母大写。**loc**万能:标签、逻辑、函数,且可同时赋值。.iloc只认整数位;切片右端包含。- 新列可直接
df['new'] = …;行级计算记得axis=1。 - 缺失值:
dropnavsfillna,method='ffill'/'bfill'。 value_counts()计类别;describe()看全貌。sort_values支持多列 & 不同升降序:ascending=[…]。
2.3 Matplotlib – pyplot 速查
核心流程
plt.figure()创建画布plt.plot()/plt.scatter()绘图- 设置标题、标签、网格、图例
plt.savefig()+plt.show()输出
2.3.1 画布
| |
- 若不调用
plt.figure(),会默认创建一个新画布。 fig = plt.gcf()可以获取当前 Figure 对象。
2.3.2 直线图:plt.plot
| |
**fmt**** = 颜色 + 标记 + 线型**(顺序不限,可缺省其中任意部分)。
| 组件 | 代码 | 说明 |
|---|---|---|
| 颜色 | b g r c m y k w | blue/green/red/cyan/magenta/yellow/black/white |
| 标记 | . o v ^ < > s * + x D | point/circle/tri_down/tri_up/…/square/star/plus/x/diamond |
| 线型 | - / -- / -. / : / '' | solid/dashed/dash-dot/dotted/none |
| |
⚠️
- 只要线条、默认蓝色:
"-"等同于"b-"- 只要标记、无线条:
"o"等同于"bo"- tri是三角形的意思
2.3.3 散点图:plt.scatter
| |
- 若要按数值映射颜色,可传入数组给
c=并指定cmap。
2.3.4 注释元素
| |
2.3.5 保存与显示
| |
⚡ 速记清单
**fmt**** (***\*plt.plot\****)** = 颜色 + 标记 + 线型,任意组合、省略。- 直线图 用
plt.plot(x,y, fmt);散点图 用plt.scatter(x,y, s, c, marker). label+plt.legend()→ 自动生成图例(线对应关系)。- 调用
plt.grid(True)加网格;透明度由alpha控制。 - 先
savefig(dpi≥150),再show()。
0x3 常用算法与技巧
下面汇总一些在编程竞赛与日常脚本中常见又好用的小技巧,涵盖输入输出、字符串处理、循环套路、常用库、取余妙用和文件操作。复制即可记入笔记。
3.1 输入/输出 技巧
批量读入多变量
1 2# ⚠️ eval 存在安全风险,仅限竞赛或受信数据 a, b, c = eval(input()) # 输入格式如:1,2,3分割并转类型
1 2 3# 正确写法 a, b, c = map(int, input().split()) # 输入:1 2 3 → 全转为 int # 同理:map(float, …)、map(str, …)字符间隔插入
1 2s = input() # e.g. "12345" print(" ".join(s)) # 输出:1 2 3 4 5文本倒置/整数反转
1 2 3 4 5s = input() print(s[::-1]) # 字符串倒置 n = int(input()) rev = int(str(n)[::-1]) # 整数反转
3.2 字符串与编码
ASCII 码互转
操作 示例 字符 → 码点 ord('A') # 65码点 → 字符 chr(9731) # '☃'常见范围
范围 码点区间 0–948 – 57 A–Z65 – 90 a–z97 – 122 切片技巧
1 2 3 4s = "abcdefg" s[2:5] # 从索引 2 到 4,含头不含尾 s[:-1] # 除去最后一位 s[-1] # 仅最后一位首字母/单词大写
1 2s.title() # 每个单词首字母大写 s.capitalize() # 仅第一个字符大写空白字符处理
1 2 3s.strip() # 去除首尾空白 s.lstrip() # 去除左侧空白 s.rstrip() # 去除右侧空白常用判别 / 转换
方法 说明 s.isdigit()全部为数字 s.isalpha()全部为字母 s.isnumeric()数字字符(含中文数字) s.upper()全部转大写 s.endswith(x)是否以 x 结尾 s.startswith(x)是否以 x 开头 s.count(sub)子串出现次数
3.3 循环 常见模板
每行打印 n 个数
1 2 3 4 5 6nums = list(range(1, 21)) n = 5 for i, v in enumerate(nums, 1): print(v, end=' ') if i % n == 0: print()简易素数判断($O(\sqrt n)$)
1 2 3 4 5 6 7 8def is_prime(x): if x < 2: return False i = 2 while i * i <= x: if x % i == 0: return False i += 1 return True乘法表
1 2 3 4 5n = 9 for i in range(1, n+1): for j in range(1, i+1): print(f"{j}×{i}={i*j}", end='\t') print()斐波那契
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15# 指定项数 def fib(n): a, b = 0, 1 for _ in range(n): print(a, end=' ') a, b = b, a + b print() # 指定最大值 def fib_upto(maxv): a, b = 0, 1 while a <= maxv: print(a, end=' ') a, b = b, a + b print()
3.4 取余 (%) 的妙用
凯撒密码(字符串循环移位)
1 2 3 4 5 6 7 8def caesar(s, shift): res = [] for ch in s: if 'a' <= ch <= 'z': res.append(chr((ord(ch)-97+shift)%26 + 97)) else: res.append(ch) return ''.join(res)星期循环
1 2days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"] idx = (idx + k) % 7
3.5 快速文件操作:with 语句
| |
Tips:
- 常见算法尽量封装成函数,主流程清晰;
- 注重边界条件(
0,1的特殊处理);- 保持代码简洁,适时注释。
3.6 排序
列表:
lst.sort()→ 原地升序;sorted(lst, reverse=True)→ 新列表字典:按值排序:
1items = sorted(d.items(), key=lambda kv: kv[1], reverse=True)
3.7 常用标准库
3.7.1 datetime
| |
闰年判断
1 2def is_leap(y): return (y%4==0 and y%100!=0) or (y%400==0)
3.7.2 random
| |
3.8 常见英文单词:月份 & 星期
月份(Months)
| 序号 | 全名 | 缩写 |
|---|---|---|
| 1 | January | Jan |
| 2 | February | Feb |
| 3 | March | Mar |
| 4 | April | Apr |
| 5 | May | May |
| 6 | June | Jun |
| 7 | July | Jul |
| 8 | August | Aug |
| 9 | September | Sep |
| 10 | October | Oct |
| 11 | November | Nov |
| 12 | December | Dec |
星期(Weekdays)
| 序号 | 全名 | 缩写 |
|---|---|---|
| 1 | Monday | Mon |
| 2 | Tuesday | Tue |
| 3 | Wednesday | Wed |
| 4 | Thursday | Thu |
| 5 | Friday | Fri |
| 6 | Saturday | Sat |
| 7 | Sunday | Sun |
⚠️ Tip:
- Python 中可用
datetime模块获取当前月/星期,并通过以上列表做映射。- 处理日期字符串时,经常需要识别或输出这些全称/缩写。