跳转至

Python 入门学习

Python 是团队开展数据整理、生物信息学分析、流程开发和人工智能研究时最常用的编程语言之一。新生入组后,应优先掌握 Python 的基本用法,能够独立编写、运行和修改简单的数据处理脚本。

入门阶段不要求系统掌握 Python 的全部内容,也不建议同时学习过多教材。选择一套适合自己的材料,在较短时间内完成基础学习,并尽快通过实际任务巩固即可。

建议完成时间

Python 基础学习建议控制在 2—4 周,原则上不要超过一个月。


一、学习目标

完成本阶段学习后,应能够:

  • 在 Linux 环境中运行 Python 程序;
  • 理解变量、列表、字典、条件判断和循环;
  • 编写和调用简单函数;
  • 读取和写入文本文件;
  • 使用 Pandas 处理表格数据;
  • 根据报错信息定位常见问题;
  • 将分析过程整理为可以重复运行的脚本;
  • 使用虚拟环境管理项目依赖;
  • 使用 Git 保存和管理代码;
  • 独立完成简单的生物信息学数据处理任务。

二、学习资料

下面的材料不需要全部学习。根据自己的习惯,选择其中一套作为主线即可。

1. 书籍

推荐书目:

  • 《Python 编程:从入门到实践(第 3 版)》
  • 《Python 学习手册(第 4 版)》
  • 《流畅的 Python》

对于没有编程基础的新生,建议优先选择《Python 编程:从入门到实践》。

《Python 学习手册》内容较全面,可以作为后续查询资料使用。

《流畅的 Python》不适合作为第一本入门教材,建议具备一定基础后再阅读。

2. 在线教程

在线教程适合边看边练。遇到不理解的语法时,可以返回相应章节查询,不必逐字阅读全部内容。

3. 视频课程

可以参考以下视频,也可以自行检索其他资源:

选择视频课程时,建议注意:

  • 使用 Python 3;
  • 包含基本语法、函数和文件读写;
  • 包含 NumPy 和 Pandas 的基础内容;
  • 课程时间不宜过长;
  • 尽量跟随课程独立完成示例,而不是只观看视频。

视频只是辅助材料,不能代替实际编程。


三、学习建议

1. 选择一套主线材料

书籍、在线教程和视频课程选择其中一种作为主要学习材料即可。

不要在多套课程之间反复切换,否则容易花费大量时间比较课程,却没有真正开始编程。

遇到不清楚的内容时,再使用其他资料补充查询。

2. 基础学习时间不宜过长

Python 入门学习建议控制在两到四周,最长不要超过一个月。

入门阶段的目标是能够使用 Python 解决实际问题,而不是记住所有语法。许多知识只有在真正使用时才能理解。

3. 每学习一个知识点都要动手

学习过程中,建议按照以下方式进行:

  1. 阅读或观看一个知识点;
  2. 手动输入示例代码;
  3. 修改代码中的变量和参数;
  4. 观察输出结果;
  5. 独立完成一个类似的小练习。

不要直接复制整段代码而不理解其作用。

4. 尽早进入实际任务

完成变量、判断、循环、函数和文件读写后,就可以开始处理简单的科研数据。

例如:

  • 统计 FASTA 文件中的序列数量;
  • 计算 DNA 序列的 GC 含量;
  • 从文本中提取指定列;
  • 合并多个表格文件;
  • 根据样本信息表批量生成命令;
  • 统计表达矩阵中的缺失值;
  • 筛选满足条件的 SNP 或基因。

实际任务通常比反复学习语法更有效。

5. 不求甚解并不是坏事

入门阶段不必一次性理解所有底层原理。

有些知识可以先学会使用,在后续项目中逐步理解。例如:

  • 装饰器;
  • 生成器;
  • 上下文管理器;
  • 面向对象;
  • 异步编程;
  • Python 内部对象模型。

这些内容不是新生阶段的重点。


四、基本编程习惯

1. 文件和变量名称应清楚

推荐:

sample_count = 100
expression_matrix = "expression.tsv"

不推荐:

a = 100
x = "expression.tsv"

变量名称应能够说明其含义,但也不必写得过长。

2. 不要直接修改原始数据

原始数据原则上只读保存。程序生成的结果应写入单独的输出目录。

project/
├── raw_data/
├── processed_data/
├── scripts/
├── results/
└── logs/

3. 不要在脚本中保存密码

禁止将以下信息直接写入代码并提交到 Gitea:

  • 账号密码;
  • SSH 私钥;
  • API Token;
  • 数据库密码;
  • 云服务密钥。

敏感信息应通过环境变量或受控配置文件管理。

4. 不要写死个人路径

不推荐:

input_file = "/home/zhangsan/project/data/sample.tsv"

推荐:

from pathlib import Path

input_file = Path("data/sample.tsv")

更进一步,可以通过命令行参数指定输入文件。

5. 保留必要的运行记录

正式分析至少应记录:

  • 输入文件;
  • 输出文件;
  • 软件版本;
  • 运行参数;
  • 参考基因组版本;
  • 运行日期;
  • 代码版本。

6. 不要忽略报错信息

程序报错时,应首先阅读最后几行内容。

常见错误包括:

错误类型 常见原因
SyntaxError 语法错误
IndentationError 缩进错误
NameError 变量未定义
FileNotFoundError 文件或路径不存在
KeyError 字典键或表格列名不存在
TypeError 数据类型不符合要求
ValueError 数值或格式不符合要求
ModuleNotFoundError 缺少软件包
PermissionError 没有文件或目录权限

提问时,应提供完整命令、完整报错和相关输入信息,不要只截取报错的最后一行。


五、AI 辅助学习

可以使用 Claude Code、Codex 或其他 AI 工具辅助:

  • 解释语法和报错;
  • 生成简单示例;
  • 检查代码逻辑;
  • 补充注释和文档;
  • 将重复操作整理为脚本;
  • 编写测试用例。

使用时应注意:

  1. 不要直接执行自己无法理解的命令;
  2. 不要向外部服务提交未公开数据;
  3. 不要上传账号密码、Token 和私钥;
  4. AI 生成的代码必须经过实际测试;
  5. 涉及统计方法和研究结论时必须自行核实;
  6. 修改正式项目代码前,应先通过 Git 保存当前版本;
  7. 提交练习时,应能够说明代码的主要逻辑。

比较有效的提问应包含:

  • 要解决的问题;
  • 输入文件格式;
  • 预期输出;
  • 已有代码;
  • 完整报错;
  • 运行环境和 Python 版本。

例如:

我有一个制表符分隔的样本信息文件,包含 sample、species 和 tissue 三列。
我希望筛选 species 为 pig 的记录,并统计每种 tissue 的样本数量。
请使用 Pandas 编写脚本,输入和输出文件通过命令行参数指定。

六、阶段练习

下面四道练习按照难度逐步增加,覆盖 Python 基础语法、文件读写、数据清洗和生物信息学分析。

建议学习顺序:

  1. 完成基本语法学习后完成 Q1;
  2. 完成字符串和文件读写学习后完成 Q2;
  3. 完成字典或 Pandas 学习后完成 Q3;
  4. 掌握 Linux、GTF/BED 格式和基本生物信息学知识后完成 Q4。

通用要求

每道题应提交:

  • Python 脚本;
  • 运行产生的结果文件;
  • 一份简短的 README.md
  • 必要的测试数据或测试说明。

所有程序应满足以下要求:

  • 使用 Python 3;
  • 能够在 Linux 终端中运行;
  • 输入和输出路径尽量通过命令行参数指定;
  • 不在代码中写死个人目录的绝对路径;
  • 不直接修改原始输入文件;
  • 遇到异常输入时给出清楚的报错信息;
  • README 中说明运行命令、输入文件、输出文件和依赖环境。

推荐目录结构:

python_practice/
├── Q1/
│   ├── README.md
│   └── q1.py
├── Q2/
│   ├── README.md
│   ├── q2.py
│   └── seq.fa
├── Q3/
│   ├── README.md
│   ├── q3.py
│   ├── S1.csv
│   ├── S2.csv
│   └── S3.csv
└── Q4/
    ├── README.md
    └── q4.py

Q1:组合计数与浮点数精度

背景

在群体遗传学、生态学和参数模拟中,经常需要枚举一组参数的不同取值组合。看似简单的数值比较,也可能受到浮点数表示方式的影响。

任务一:浮点数枚举

有四个变量 abcd,每个变量均可从以下 11 个数中取值:

values = [
    0, 0.1, 0.2, 0.3, 0.4, 0.5,
    0.6, 0.7, 0.8, 0.9, 1.0,
]

统计满足以下条件的**有序四元组** (a, b, c, d) 的数量:

a + b + c + d = 1.0

“有序”表示:

(0.1, 0.2, 0.3, 0.4)

和:

(0.4, 0.3, 0.2, 0.1)

被视为不同结果。

至少使用以下两种方法完成:

  1. 直接枚举浮点数,并使用 math.isclose() 判断总和是否接近 1.0
  2. 将所有数乘以 10,转换成整数后再进行枚举。

比较两种方法得到的结果是否一致。

任务二:整数枚举

abcd 均从以下整数中取值:

values = list(range(11))

统计满足以下条件的有序四元组数量:

a + b + c + d = 10

输出要求

生成 Q1_result.txt,至少包含:

float_enumeration_count: ...
integer_scaled_count: ...
integer_enumeration_count: ...
results_consistent: True
思考题

在 README 中简要回答:

  1. 为什么不推荐直接使用以下判断?

a + b + c + d == 1.0
2. 浮点数问题和整数问题在数学上是否可以相互转换? 3. 是否可以不使用四层循环完成统计? 4. 如何使用数学方法验证程序结果?

完成标准

  • 正确理解“有序四元组”;
  • 能够使用嵌套循环和条件判断;
  • 能够使用 math.isclose()
  • 理解浮点数不能总是精确表示十进制小数;
  • 两种实现方式得到一致结果;
  • 能够解释结果,而不是只输出一个数字。

Q2:FASTA 序列处理与文件读写

输入文件

给定文件 seq.fa 下载地址,其格式如下:

>sequence_1 an example
AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC
>sequence_2 another example
GATTACAAGATTTGTGAATTTTTTATGTTTATTCTTTTTTATACATTTGTACTTTGTATGGAGGTTTACT

程序不能假定一条序列只占一行。下面这种多行序列也应能够正确解析:

>sequence_1 an example
AGCTTTTCATTCTGACTGCA
ACGGGCAATATGTCTCTGT
GTGGATTAAAAAAAGAGTGT
CTGATAGCAGC

FASTA 标题中,第一个空格之前的内容作为序列编号。

例如:

>sequence_1 an example

其序列编号为:

sequence_1

本题建议首先使用 Python 标准库自行解析 FASTA,不使用 Biopython。完成后,可以再使用 Biopython 验证结果。

任务一:读取 FASTA

seq.fa 中的全部序列读入程序,并保存为类似以下结构:

{
    "sequence_1": "AGCT...",
    "sequence_2": "GATT...",
}

解析时应:

  • 忽略空行;
  • 合并同一条序列的多行内容;
  • 将序列统一转换为大写;
  • 保持序列在原文件中的顺序;
  • 检查序列编号是否重复;
  • 检查是否存在标题之前的序列内容。

任务二:计算反向互补序列

提取 sequence_1,计算其反向互补序列。

碱基互补关系为:

原碱基 互补碱基
A T
T A
C G
G C
N N

如果出现表格中没有定义的字符,程序应给出明确错误,而不是静默忽略。

将结果保存为 Q2.1_revcomp.fa

>sequence_1_revcomp
反向互补序列

任务三:碱基计数

统计反向互补序列中 ATCGN 的数量。

将结果保存为 Q2.2_counts.tsv

base    count
A   ...
T   ...
C   ...
G   ...
N   ...

同时检查:

A + T + C + G + N

是否等于反向互补序列长度。

任务四:截取每条序列的前 10 个碱基

提取每条序列前 10 个碱基,保存为 Q2.3_head10.tsv

sequence_id head10
sequence_1  AGCTTTTCAT
sequence_2  GATTACAAGA

如果某条序列不足 10 bp,保留其完整序列,并在程序运行时输出警告。

任务五:序列去重

根据 head10 进行去重,并统计每个片段出现在哪些序列中。

输出文件为 Q2.4_unique_heads.tsv

head10  sequence_count  sequence_ids
AGCTTTTCAT  1   sequence_1
GATTACAAGA  1   sequence_2

如果多个序列具有相同的前 10 个碱基,应将序列编号用英文逗号连接。

思考题

在 README 中简要回答:

  1. 为什么不能简单地把 FASTA 文件每一行都当成一条序列?
  2. 字符串反转和反向互补有什么区别?
  3. 字典和集合在本题中分别适合解决什么问题?
  4. 使用集合去重时,是否一定能够保留原始顺序?

完成标准

  • 能够解析单行和多行 FASTA;
  • 能够正确提取序列编号;
  • 能够完成字符串反转和碱基互补;
  • 能够使用字典进行碱基计数;
  • 能够使用字符串切片;
  • 能够处理重复序列和异常字符;
  • 输出文件包含清楚的表头。

Q3:表达量数据合并与清洗

背景

在高通量测序项目中,经常需要合并多个样本的表达量结果。实际数据文件可能存在重复记录、格式不统一或文件扩展名与真实格式不一致等问题。

现有三个文件下载地址

S1.csv
S2.csv
S3.csv

分别代表三个样本的 miRNA 表达量。

虽然文件扩展名为 .csv,但文件内容实际使用**制表符**分隔。程序应根据文件的真实格式读取,而不能仅根据扩展名判断分隔符。

示例:

#miRNA  read_count  precursor   total   seq seq(norm)
ssc-let-7a  116100.15   ssc-let-7a-1    116100.15   116100.15   15000.30
ssc-let-7a  116294.65   ssc-let-7a-2    116294.65   116294.65   15025.43
ssc-let-7b  85000.20    ssc-let-7b  85000.20    85000.20    10981.34

本题只需要使用以下两列:

  • #miRNA
  • read_count

任务一:读取和检查文件

分别读取 S1.csvS2.csvS3.csv

程序应检查:

  • 是否存在 #miRNA 列;
  • 是否存在 read_count 列;
  • read_count 是否能够转换为数值;
  • 是否存在空的 miRNA 名称;
  • 同一个 miRNA 是否重复出现。

对缺失列、非法数值等问题应给出明确报错,不建议静默跳过。

任务二:处理重复 miRNA

如果同一个 miRNA 在同一个文件中出现多次,使用其所有 read_count 的平均值作为该样本的最终表达量。

例如:

ssc-let-7a  116100.15
ssc-let-7a  116294.65

应合并为:

ssc-let-7a  116197.40

结果统一保留两位小数。

任务三:筛选共有 miRNA

只保留同时出现在 S1S2S3 三个样本中的 miRNA。

注意区分:

  • 并集:至少出现在一个样本中;
  • 交集:同时出现在所有样本中。

本题要求使用交集。

任务四:生成表达矩阵

将结果保存为 merged_counts.tsv

miRNA   S1_count    S2_count    S3_count
ssc-let-7a  116197.40   ... ...
ssc-let-7b  85000.20    ... ...

输出要求:

  • 使用制表符分隔;
  • 包含表头;
  • 每个 miRNA 只出现一次;
  • 表达量保留两位小数;
  • 按 miRNA 名称排序,以保证每次运行结果顺序一致。

任务五:输出数据处理摘要

生成 merge_summary.txt,记录:

S1 raw rows: ...
S1 unique miRNAs: ...
S2 raw rows: ...
S2 unique miRNAs: ...
S3 raw rows: ...
S3 unique miRNAs: ...
Shared miRNAs: ...

实现要求

建议首先使用 Python 标准库和字典完成。

可以使用的数据结构示例:

{
    "ssc-let-7a": [116100.15, 116294.65],
    "ssc-let-7b": [85000.20],
}

完成后,可以再使用 Pandas 实现一次,并比较两个版本的结果是否完全一致。

思考题

在 README 中简要回答:

  1. 为什么不能仅根据 .csv 扩展名判断文件使用逗号分隔?
  2. 为什么重复 miRNA 不能直接保留第一条记录?
  3. 交集和并集分别适用于什么分析场景?
  4. 如果某个样本中缺少某个 miRNA,是否可以填充为 0?这样做需要什么前提?
  5. 如何验证纯 Python 版本与 Pandas 版本的结果一致?

完成标准

  • 能够读取带表头的制表符文件;
  • 能够检查必要列;
  • 能够使用字典聚合重复数据;
  • 能够正确计算平均值;
  • 能够计算三个集合的交集;
  • 能够生成规范的 TSV 文件;
  • 能够输出数据清洗摘要;
  • 理解文件扩展名不一定代表真实文件格式。

Q4:GTF 解析、基因组坐标和外部工具

难度说明

本题属于进阶练习。建议在掌握 Python 文件处理、Linux 命令、GTF/BED 格式和基本基因组学知识后完成。

背景

在功能基因组学研究中,经常需要从基因注释中提取基因坐标、计算启动子区域,并判断不同基因组区间之间是否重叠。

本题使用猪参考基因组:

Sscrofa11.1

为保证分析结果可重复,固定使用 Ensembl release 114。

任务一:准备数据

下载猪的 GTF 注释文件以及基因组文件:

https://ftp.ensembl.org/pub/release-116/gff3/sus_scrofa/Sus_scrofa.Sscrofa11.1.116.gff3.gz
https://ftp.ensembl.org/pub/release-116/fasta/sus_scrofa/dna/Sus_scrofa.Sscrofa11.1.dna_sm.toplevel.fa.gz
samtools faidx Sus_scrofa.Sscrofa11.1.dna.toplevel.fa

从 FASTA 索引中提取染色体长度:

cut -f1,2 \
    Sus_scrofa.Sscrofa11.1.dna.toplevel.fa.fai \
    > chrom.sizes

不能混用不同参考基因组版本的 GTF、FASTA 和染色体长度文件。

任务二:使用 Python 解析压缩 GTF

使用 Python 标准库中的 gzip 模块直接读取 .gtf.gz 文件,不要求先完整解压到磁盘。

程序应:

  • 跳过以 # 开头的注释行;
  • 按制表符拆分每一行;
  • 检查每行是否包含 9 列;
  • 解析第 9 列 attributes 字段;
  • 提取 gene_idgene_namegene_biotype
  • 只保留 feature 类型为 gene 的记录;
  • 只保留 gene_biotypeprotein_coding 的基因。

如果某条记录没有 gene_name,仍应保留该基因,并使用 gene_id 作为名称。

任务三:生成 protein-coding 基因 BED 文件

将筛选后的基因转换为 BED6 格式,保存为 genes.bed

BED6 包含以下六列:

chrom   start   end name    score   strand

本题规定:

  • name 使用 gene_id
  • score 固定为 0
  • strand+-

需要注意:

  • GTF 使用 1-based、闭区间
  • BED 使用 0-based、左闭右开区间

对于 GTF 坐标:

start = GTF_start
end   = GTF_end

对应 BED 坐标为:

BED_start = GTF_start - 1
BED_end   = GTF_end

例如,GTF 中:

3   3

表示第 3 个碱基,对应 BED:

2   3

任务四:计算 TSS 上游 2000 bp 区域

基于每个 protein-coding 基因的转录起始位点,计算其上游 2000 bp 区域。

对于正链基因:

promoter_start = gene_BED_start - 2000
promoter_end   = gene_BED_start

对于负链基因:

promoter_start = gene_BED_end
promoter_end   = gene_BED_end + 2000

本题定义的启动子区域不包含 TSS 所在碱基。

只保留满足以下条件的区域:

0 <= promoter_start < promoter_end <= chromosome_length

因此:

  • 正链基因靠近染色体起点时,可能不足 2000 bp;
  • 负链基因靠近染色体末端时,也可能不足 2000 bp;
  • 两种情况都需要结合 chrom.sizes 判断。

将结果保存为 promoters.bed,同样使用 BED6 格式。

所有保留的 promoter 长度都必须恰好为 2000 bp:

end - start = 2000

任务五:检查 promoter 与基因区域重叠

使用 bedtools intersect 找出与任意 protein-coding 基因区域发生重叠的 promoter。

命令示例:

bedtools intersect \
    -a promoters.bed \
    -b genes.bed \
    -wa \
    -wb \
    > promoter_gene_overlap.bed

输出中应同时包含 promoter 和与其重叠的 gene 信息。

也可以在 Python 中使用 subprocess.run() 调用 bedtools:

import subprocess

with open("promoter_gene_overlap.bed", "w") as output_handle:
    subprocess.run(
        [
            "bedtools",
            "intersect",
            "-a",
            "promoters.bed",
            "-b",
            "genes.bed",
            "-wa",
            "-wb",
        ],
        stdout=output_handle,
        check=True,
        text=True,
    )

使用 check=True,确保 bedtools 执行失败时,Python 程序不会继续产生看似正常的结果。

任务六:结果检查

程序运行结束后,生成 Q4_summary.txt

protein_coding_genes: ...
positive_strand_genes: ...
negative_strand_genes: ...
valid_promoters: ...
discarded_boundary_promoters: ...
promoters_overlapping_genes: ...

同时完成以下检查:

  • genes.bed 中所有 start 均不小于 0;
  • 所有记录满足 start < end
  • promoters.bed 中所有区域长度均为 2000 bp;
  • 所有 promoter 均未超出对应染色体边界;
  • 正链和负链 promoter 方向正确;
  • 随机人工检查至少 5 个正链和 5 个负链基因;
  • BED 文件按染色体和起始坐标排序。

排序示例:

sort -k1,1 -k2,2n \
    genes.bed \
    > genes.sorted.bed

sort -k1,1 -k2,2n \
    promoters.bed \
    > promoters.sorted.bed

选做内容

  1. 不使用 bedtools,使用 Python 实现区间重叠判断;
  2. 比较 Python 和 bedtools 的结果;
  3. 统计每个 promoter 重叠的基因数量;
  4. 区分 promoter 与自身基因、其他基因的重叠;
  5. 比较不同 promoter 长度,例如 500 bp、1000 bp 和 2000 bp;
  6. 将脚本改写为可以接受物种、GTF、FASTA 索引和 promoter 长度参数的通用程序。
思考题

在 README 中简要回答:

  1. 为什么 GTF 转 BED 时只需要对起始坐标减 1?
  2. 为什么正链和负链基因的上游方向不同?
  3. 为什么计算负链 promoter 时必须知道染色体长度?
  4. 为什么不能混用不同版本的参考基因组和注释文件?
  5. bedtools intersect -wa -wb 中的 -wa-wb 分别表示什么?
  6. promoter 与其他基因重叠是否一定代表计算错误?

完成标准

  • 能够使用 gzip 读取压缩文本;
  • 能够解析 GTF 的九列结构和 attributes 字段;
  • 能够筛选 protein-coding gene;
  • 能够正确完成 GTF 到 BED 的坐标转换;
  • 能够分别计算正链和负链 promoter;
  • 能够使用染色体长度过滤越界区域;
  • 能够调用 bedtools 完成区间重叠分析;
  • 能够对结果进行基本质量检查;
  • 能够说明关键坐标计算的依据。

七、练习提交

完成练习后,将代码提交到个人 Gitea 仓库。

建议每道题使用一次或多次独立提交,提交信息应说明具体修改内容。

推荐:

完成Q1整数枚举
增加Q1浮点数精度比较
支持多行FASTA解析
完成三个样本miRNA表达矩阵合并
修正负链启动子坐标计算

不推荐:

update
修改代码
final
test

README 应包含的内容

每道题的 README 至少应说明:

### Q1

#### 题目说明

简要说明本题需要完成的任务。

#### 运行环境

- Python 版本
- 依赖软件
- 外部工具版本

#### 运行方法

```bash
python q1.py

输入文件

说明输入文件名称和格式。

输出文件

说明输出文件名称和内容。

实现思路

简要说明程序的主要处理流程。

结果检查

说明如何确认结果正确。

思考题

回答题目中提出的思考题。

## 代码检查重点

代码提交后,可以请师兄师姐进行简单检查。检查重点包括:

- 程序结果是否正确;
- 是否存在写死的路径;
- 输入异常时是否有明确提示;
- 代码是否能够重复运行;
- README 是否能够让其他人理解和运行程序;
- 是否记录了软件版本和关键参数;
- 是否真正理解代码中的每一步。

允许使用 AI 工具辅助解释问题、检查代码和排查报错,但提交者应能够说明程序的主要逻辑。

不能解释的代码,不应直接作为练习答案提交。

---

## 八、Linux 和 R 学习建议

## Linux

Linux 不建议与 Python 完全分开学习。

在学习 Python 的同时,应逐步掌握:

- 文件和目录操作;
- 文本查看和检索;
- 文件权限;
- SSH 登录;
- 软件环境;
- 管道和重定向;
- Shell 脚本;
- Slurm 作业提交。

很多 Python 程序最终需要在 Linux 服务器上运行,因此 Linux 是使用 Python 开展科研工作的基础。

## R

没有编程基础的新生,建议先完成 Python 基础学习,再开始学习 R,暂时不学亦可。

R 可以在后续用于:

- 统计分析;
- 数据可视化;
- 差异表达分析;
- 富集分析;
- 单细胞分析;
- 生物统计建模。

入门阶段不建议同时系统学习 Python 和 R,以免分散精力。

---

## 九、学习完成要求

完成以下内容后,可以认为已经具备基本的 Python 使用能力:

- [ ] 完成一套 Python 基础课程或教材的核心章节;
- [ ] 独立编写至少 5 个简单程序;
- [ ] 能够读取和处理 CSV、TSV 文件;
- [ ] 能够使用函数组织代码;
- [ ] 能够在 Linux 终端运行 Python 脚本;
- [ ] 能够创建并使用虚拟环境;
- [ ] 能够阅读常见报错;
- [ ] 能够使用 Git 管理代码;
- [ ] 完成 Q1;
- [ ] 完成 Q2;
- [ ] 完成 Q3;
- [ ] 开始或完成 Q4;
- [ ] 将练习代码提交到个人 Gitea 仓库;
- [ ] 为每道练习编写 README。

!!! note "关于学习进度"
    没有必要等到“全部学完”才开始处理实际数据。

    掌握基本语法和文件读写后,就应尽快进入实际任务。在使用过程中遇到不熟悉的知识,再针对性学习和补充。

!!! warning "数据安全"
    练习时优先使用公开数据、模拟数据或经过批准的示例数据。

    未经允许,不得将团队内部数据、未发表结果、服务器配置信息、账号密码和访问密钥上传到公开平台或外部 AI 服务。
本文阅读量  次
本站总访问量  次
Authors: Wind