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 3
week = ['日','一','二','三','四','五','六'] 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 2
for 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():
-
列表推导式:
1
new_list = [f(x) for x in iterable if 条件]
0x1 数据结构与文件操作
1.0 字符串
1.0.1 定义字符串
-
单引号或双引号包裹:
1 2
a = "hello" b = 'world'
-
三引号用于多行文本:
1 2 3 4
text = """ 第一行 第二行 """
-
原始字符串(不处理转义):
1
path = r"C:ew_folder est"
|
|
-
**format()**
方法:1 2 3
template = "{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 3
s = "python" s[0] # 'p' s[-1] # 'n'
-
切片(
[start:stop:step]
):1 2 3 4 5 6
s = "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 2
for 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 = 超快多维数组 + 矢量化数学运算。
1
import 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 2
a[:, 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 2
np.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 风格操作
1
import 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 3
df.loc[(df['name']!='NaN') & (df['age']>18)] df.loc['20240101':'20240131'] df.loc[lambda d: d['score'] > 90]
-
**iloc**
:纯数字行列 -
**where**
:保持原形,条件不满足处填 NaN -
**query**
:SQL 风格字符串,列名可直接写1
df.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
。 - 缺失值:
dropna
vsfillna
,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 2
s = input() # e.g. "12345" print(" ".join(s)) # 输出:1 2 3 4 5
-
文本倒置/整数反转
1 2 3 4 5
s = input() print(s[::-1]) # 字符串倒置 n = int(input()) rev = int(str(n)[::-1]) # 整数反转
3.2 字符串与编码
-
ASCII 码互转
操作 示例 字符 → 码点 ord('A') # 65
码点 → 字符 chr(9731) # '☃'
-
常见范围
范围 码点区间 0–9
48 – 57 A–Z
65 – 90 a–z
97 – 122 -
切片技巧
1 2 3 4
s = "abcdefg" s[2:5] # 从索引 2 到 4,含头不含尾 s[:-1] # 除去最后一位 s[-1] # 仅最后一位
-
首字母/单词大写
1 2
s.title() # 每个单词首字母大写 s.capitalize() # 仅第一个字符大写
-
空白字符处理
1 2 3
s.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 6
nums = 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 8
def 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 5
n = 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 8
def 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 2
days = ["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)
→ 新列表 -
字典:按值排序:
1
items = sorted(d.items(), key=lambda kv: kv[1], reverse=True)
3.7 常用标准库
3.7.1 datetime
|
|
-
闰年判断
1 2
def 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
模块获取当前月/星期,并通过以上列表做映射。- 处理日期字符串时,经常需要识别或输出这些全称/缩写。