3、Python基础:变量、数据类型与运算符归纳总结
这章咱们来聊聊Python最基础的几个概念。别看它们简单,我做了这么多年项目,发现很多线上事故的根因,恰恰是这些基础没打牢。尤其是咱们做MD批处理质控的,数据量大、格式杂,变量类型搞混了,轻则报错,重则污染一批数据。
所以,别小看这章。把底子夯实了,后面写脚本才顺手。
3.1 变量:给数据贴个标签
变量是什么?说白了,就是给数据起个名字。Python里用等号 = 来赋值。你不用提前声明类型,Python解释器会自动判断。我个人很喜欢这种“随性”,写快脚的利器。
# 给一个字符串赋值
sample_id = "MD_QC_20231015_001"
threshold_value = 0.85
is_pass = True
你看,Python会自动把 "MD_QC_20231015_001" 当成字符串,0.85 当成浮点数,True 当成布尔值。
3.2 数据类型:Python的几种“物种”
理解数据类型,就是理解你的数据长什么样。我来列一个我用得最多的几种。
3.2.1 数字类型:int 和 float
整数(int)和浮点数(float)。我建议你用 type() 函数随时检查类型,这在调试时特别管用。
a = 10 # int
b = 3.14 # float
print(type(a)) # 输出:
print(type(b)) # 输出:
3.2.2 字符串类型:str
字符串用单引号、双引号、三引号包起来都可以。处理MD文件时,字符串操作非常多。
file_name = "MD_QC_20231015_001.tsv"
header_line = "SampleID\tIntensity\tQuality"
# 使用 f-string 格式化,我个人的最爱
batch_id = "QC_001"
full_name = f"{file_name}_{batch_id}"
os.path.join() 或者 Python 3.4+ 的 pathlib,比手动拼接字符串加斜杠安全得多。
3.2.3 布尔类型:bool
只有两个值:True 和 False。在条件判断里太常用了。
quality_passed = False
if quality_passed:
print("该样本通过质控")
else:
print("需要重新检测")
3.2.4 列表与元组:list 和 tuple
列表用 [],可以增删改。元组用 (),创建后不能改。你想想看,如果是一组样本ID,我经常用列表,方便我后续追加。
# 列表:可变的
sample_ids = ["S001", "S002", "S003"]
sample_ids.append("S004") # 没问题
# 元组:不可变的
fixed_parameters = (0.85, 0.90, 0.95)
# fixed_parameters[0] = 0.80 # 这会报错!
3.2.5 字典与集合:dict 和 set
字典是键值对,用来快速查找。集合是唯一元素的无序集合,常用于去重。
# 字典:存样本ID和其对应的质控结果
qc_results = {
"S001": "pass",
"S002": "fail",
"S003": "pass"
}
# 集合:快速找出有哪些独特的批次
batch_numbers = {"QC001", "QC002", "QC003", "QC001"} # QC001 只会出现一次
3.3 运算符:让数据动起来
有了数据,怎么处理它们?靠运算符。这部分我结合做质控的实际场景来讲,你会记得更牢。
3.3.1 算术运算符
| 运算符 | 名称 | 示例 | 说明 |
|---|---|---|---|
+ |
加 | 10 + 5 |
整型相加得15,字符串拼接 |
- |
减 | 10 - 5 |
5 |
* |
乘 | 3 * 4 |
12,字符串重复也行 |
/ |
除 | 7 / 2 |
3.5,结果是浮点数 |
// |
整除 | 7 // 2 |
3,向下取整 |
% |
取余 | 7 % 2 |
1,判断奇偶常用 |
** |
幂 | 2 ** 3 |
8 |
// 在处理批次时分页时特别好用。比如100个样本,每批30个,可以用 sample_count // 30 + 1 算出需要的批次数。
3.3.2 比较运算符
比较运算符返回布尔值,True或False。我经常用它来过滤数据。
sample_quality_score = 0.92
# 检查是否通过阈值
if sample_quality_score >= 0.9:
print("通过质控")
else:
print("未通过")
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
== |
等于 | "page" == "page" |
True |
!= |
不等于 | 10 != 5 |
True |
> |
大于 | 10 > 5 |
True |
< |
小于 | 10 < 5 |
False |
>= |
大于等于 | 10 >= 5 |
True |
<= |
小于等于 | 10 <= 5 |
False |
3.3.3 赋值运算符
就是缩短写法,让你少打几个字。我个人觉得 += 用得最多。
total_samples = 0
# 读取一个批次后,自动累加
total_samples += 1 # 等价于 total_samples = total_samples + 1
total_samples -= 1 # 等价于 total_samples = total_samples - 1
total_samples *= 2 # 等价于 total_samples = total_samples * 2
3.3.4 逻辑运算符
逻辑运算符专门连接多个条件。在复杂的质控逻辑里,几乎是必备项。
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
and |
与 | True and False |
False |
or |
或 | True or False |
True |
not |
非 | not True |
False |
# 实际场景:样本必须同时满足条件A和条件B
condition_a = quality_score >= 0.9
condition_b = missing_rate < 0.05
if condition_a and condition_b:
print("样本合格")
else:
print("样本不合格,需要标记异常")
3.3.5 成员运算符与身份运算符
这部分我进项目后才真正用起来。成员运算符检查某个值是否在容器里。
acceptable_batches = ["MD_QC_A", "MD_QC_B", "MD_QC_C"]
current_batch = "MD_QC_B"
# 成员运算符 in
if current_batch in acceptable_batches:
print("该批次在允许列表里")
# 身份运算符 is,检查是否是同一个对象
a = [1, 2, 3]
b = a
c = [1, 2, 3]
print(a is b) # True,指向同一对象
print(a is c) # False,值相等但对象不同
3.4 可变与不可变:核心思维
这一点很多新手会忽略。Python里,有些数据类型能改,有些不能。搞清楚这个,能避免不少bug。
| 类型 | 可变吗 | 典型用法 |
|---|---|---|
int, float |
不可变 | 数值计算 |
str |
不可变 | 标签、文件名、样本ID |
bool |
不可变 | 条件判断结果 |
list |
可变 | 动态数据集、临时存储 |
tuple |
不可变 | 固定的参数列表、配置项 |
dict |
可变 | 键值映射、缓存结果 |
set |
可变 | 去重、集合运算 |
new_list = original_list[:])或者明确告诉调用方你的函数会修改参数。
总结一下:这一章的概念是后面所有代码的基础。我建议你把每种数据类型都亲手敲一遍代码,看看它们在内存里的表现。遇到复杂问题时,回到本源想一想——这个变量的类型是什么?它可变吗?往往答案就在这些基础里。