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 当成布尔值。

核心:Python变量就像一个标签,贴在数据对象上。你可以随时把这个标签撕下来,贴到另一个数据上。这就是动态类型语言的特点。

3.2 数据类型:Python的几种“物种”

理解数据类型,就是理解你的数据长什么样。我来列一个我用得最多的几种。

3.2.1 数字类型:int 和 float

整数(int)和浮点数(float)。我建议你用 type() 函数随时检查类型,这在调试时特别管用。

a = 10      # int
b = 3.14    # float
print(type(a))  # 输出:
print(type(b))  # 输出:
我曾经踩过的坑:做质控时,计算信号强度平均值,结果一直不对。后来发现文件里的值是以字符串形式读取的,直接做加法成了拼接“0.5”+“0.6”=“0.50.6”。记住:从文件或网络拿到的数据,先确认类型!

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[:])或者明确告诉调用方你的函数会修改参数。
第3章 知识体系:变量、数据类型与运算符 变量与数据类型 数字 (int, float) 字符串 (str) 布尔 (bool) 容器 (list, dict等) 运算符:算术 / 比较 / 赋值 / 逻辑 核心思维:类型决定操作,可变/不可变决定行为 牢记 type() 和 id() 两个调试利器

总结一下:这一章的概念是后面所有代码的基础。我建议你把每种数据类型都亲手敲一遍代码,看看它们在内存里的表现。遇到复杂问题时,回到本源想一想——这个变量的类型是什么?它可变吗?往往答案就在这些基础里。