生信分析人员如何系统入门python(2019更新版)

2019-10-09 15:13:50 浏览数 (1)

引言

一般来说,使用 Python 做生信有两种情况:一种是专门分析生物学数据(主要是各种组学),以调包为主,日常工作就是熟悉各种包的文档,写各种脚本串联工具分析流程,大部分写的都是以快速实现为目的的即用即弃小脚本,对 Python 要求并不高,掌握最核心的语法就可以解决大部分问题,甚至面向对象这部分的编程都较少涉及。

另一种则是以开发工具算法,写包为主,也就是提供工具给前一种工作者使用,这就需要良好的数理基础,对编程也有更高的要求,毕竟软件运行时的效率也是很重要的。

Python 相关的知识点非常多,本篇文章既然是“生信工程师如何入门”系列,自然是抛砖引玉为主,帮助不了解 Python 的同学建立一个领域的概念,并可以据此开始自己的 Python 之旅。

Python 是什么?

Python 是一种面向对象、解释型计算机程序设计语言。Python 语言的哲学也颇具玩味,在这里和大家分享一下:

There should be one -- and preferably only one -- obvious way to do it.

这一点和 Perl 有着很大的差异,Perl 往往有多种实现目的的方式(而且即兴写出来的代码很容易在几个月后看不懂)。

Python 和 Perl 用哪个好?我自己是写 Python 为主的,Perl 一直只有勉强读懂的水平,因此无法做深入的评价。单从生信常用的编程任务而言,两者实现的逻辑是非常相似的(或者说,编程本身的实现逻辑理念都是近似的)。

另外,当你的程序有更高的复杂度需求时,也可以充分利用 Python 面向对象的特性,将生物信息的数据对象化,这种可重用机制在较为复杂的大项目中是可以显著提高效率的。

这里附上的是截止 2019 年 9 月的编程语言排行榜,可以看到 Python 已经是最流行的脚本编程语言。

为什么要用 Python

Python 语法简单,容易学习,工整的程序格式使其可读性非常强,并且易于维护。此外,它也可以很好的支持对象、模块和其他可重用机制,并支持 C 语言模块拓展。Python 有大量免费、稳定的第三方模块,并有方便的包管理工具(pip)。

它最大的缺点可能就是程序运行慢。

Python 可以实现的功能基本用 Perl 也能实现,强制缩进很容易让习惯使用 Perl 的你感觉有约束感。但 Python 工整的语法让你即使过很长时间,还能轻松读懂自己的代码,也可以在学习其他人的代码时有流畅的感受。

生物信息是一个交叉学科,Python 为我们实现各种不同目的的需求提供了充分的支持,不管你是想进行常规的文本处理,还是进一步进行深度的科学计算,亦或是将流行的各种算法应用于项目中。

Step0:学习前的准备

Python 可在官网下载:https://www.python.org/,当然更建议的方式是直接安装 Anaconda。Anaconda 是 Python 的一个发行版本,专注于数据分析,包括了常见的科学计算类库和包管理器 conda。此外,Anaconda 也深度整合了 R。

0.0 版本问题

Python 包括 2.* 版本和 3.* 版本,两者有部分语法不同且不兼容,推荐使用 3.* 版本。

0.1 代码编辑器的选择

代码编辑器可选用 Visual Studio Code、SubLime Text、Atom、PyCharm 等等,反正各有优势,网络上有很多评测文件,可以去看看,选用一个合适的。我自己常用的是 Visual Studio Code,安装了一系列插件,用起来很顺手。如果是做数据分析,可以用 Jupyter Notebook,混写思路说明文档、代码和结果展示,不管是交流还是保存中间结果都是非常便利的。

0.3 寻求帮助

任何一个关键词,都可以用 help(kyeword) 获得内置帮助文档。

在 IPython 环境下,支持直接使用 ?keyword 获取帮助信息。

Step1:学习基本语法

对于有编程基础的朋友,这一部分大致看一遍就可以上手了,在实践中熟悉语言的特性即可。毕竟只要有编程思想的底子在,做起来还是很快的。

  • 缩进:定义作用域的方式,通常为 4 个空格。相同缩进的行被认为是在相同的作用域中。
  • 赋值:使用 "=",初次赋值时不需要给出具体的类型,由等号右边的值决定变量的类型。
  • 运行程序有两种模式:「脚本式编程」就是你预先写好代码文件,然后一次性执行;「交互式编程」则是逐行输入,按下 Enter 键即执行。

变量 & 运算

  • 包括数字(Number)、字符串(String)、元组(Tuple)、列表(List)、字典(Dictionary)、集合(Sets),另外还包括了一个特殊空值(None)。 a = 100 ## 整型 b = 1.0 ## 浮点型 a = 'abc' ## 字符串 a = True ## 布尔值 a = None ## 空值 eg_tuple = (1, 2, 3) ## 元组 eg_list = [1, 2, 3] ## 列表 eg_dict = {'ele1':1, 'ele2':2, 'ele3':3} #词典
    • 字符串、列表、元组为「序列对象」,可以通过「下标偏移量」访问。
    • 元组(Tuple)、列表(List)、字典(Dictionary)、集合(Sets)为「容器」,可收纳多个数据。
  • 每种数据类型都内置了丰富的函数,你可以在实践的过程中慢慢熟悉。这里要善用 tab 键。比如你已经定义了一个变量 a = 100,想查看可以使用哪些方法,就可以输入 a. tab,Python 会有提示。IPython 和代码编辑器会自动给出提示。
  • 这里还需要了解一下可变数据类型 & 不可变数据类型这两种概念。可变数据类型允许在创建后被重新修改(列表、集合、字典)。不可变数据类型在赋值后无法被修改,只能被重新创建(除外上述类型)。

标准类型操作符

利用 Python 可以进行数值运算、逻辑运算、判断表达式。

控制结构

这一部分也和各种编程语言大同小异,主要需要学习条件表达式,if 语句,for 循环,while 循环,以及循环控制关键词(break,continue,pass)。

代码语言:javascript复制
## 简单 if 语句
if condition_test:
    statement
## for 循环
for i in 序列:
    statement
## while 循环
while condition:
    statement
## 三元操作符
X if C else Y

Step2:函数、模块

函数和模块实质上是将成块的指令封装成可以重复调用的代码块,并借着函数名和模块名,给了一套未来调用的接口。

函数

代码语言:javascript复制
## 定义函数
def eg_function(a, b):
    c = a   b
    return c
## 调用函数
x = eg_function(3, 4)

传递给函数的参数形式,基本方法有基于顺序的位置传参和关键词传参,另外还有更灵活的包裹传参,可以进一步了解。

这里还可以学习一下「递归」的概念。递归是函数调用其自身的操作(在函数定义中,调用函数自身)。

模块

在 Python 中,一个 .py 文件就构成一个模块。通过引入模块,你就可以复用之前的 Python 程序,调用模块中的函数。模块实质上是比函数更高一层的封装模式。常见的功能编入模块就成为了所谓的库(library)。标准库就是 Python 官方提供的库。

代码语言:javascript复制
## 引入模块
import module_name
## 引入某模块的函数
from module_name import function_name

那么 Python 如何能找到模块呢?主要是三个路径:

  1. 标准库的安装路径
  2. 环境变量 PYTHONPATH 所包含的路径
  3. 当前文件夹

由于 Python 在很多领域上的使用都是通过拓展包来实现的,是后续学习的基础。

这一部分需要掌握 pip 或 conda。以 pip 为例:

代码语言:javascript复制
## 安装模块
pip install module
## 查看已安装模块
pip list
## 搜索某个模块
pip search module

接下去,你就可以按照需求学习各个感兴趣的领域相关包了。

Step3:Python 中的类和对象

Python 有一条哲学理念是:一切皆对象。由此可见对象在 Python 中的重要性。

之前描述的都是面向过程的编程范式,但 Python 可以用「对象」来构建更大的框架。用 Python 中的类(Class)具体说明一下:类就是对事物的抽象表达(比如我们把自然界的生物分类,植物、动物、细菌),子类也很好理解,就是类下更小一级的分类(动物类别下的爬行动物、哺乳动物、鸟类)。对每个类都可以定义属性和方法(鸟类属性:颜色;鸟类方法:吃、飞)。

代码语言:javascript复制
## 定义类
class Bird(object):
    feather = True
    reproduction = "egg"
    def chirp(self, sound):
        print(sound)

上述例子中,用关键词 class 定义了一个类,名字是 Bird,括号里有一个关键词 object,然后分别定义了两个属性 feather 和 reproduction 及一个函数 chirp。

代码语言:javascript复制
## 创建对象
mypet = Bird()
## 调用对象的方法
mypet.chirp('gaga') ## 打印输出 'gaga'

另外,列表、元组、字符串、词典都是对象,甚至函数、模块也都是,均可以查询到相应的属性和方法。

Step4:更多的应用场景

Python 可以应用的场景很多,大多是通过拓展包的方式实现的。下面列举了一些生信可能会用到的场景,有需求的朋友可以进一步学习,由于篇幅限制,只做简单的介绍。

文本处理

这应该是生信应用场景中最频繁出现的了。需要学习一下文本对象的创建(open),文件操作常常和上下文管理器一起使用。

代码语言:javascript复制
## 常规文件操作
infile = open(text_file, 'r')
execution_code
infile.close()

## 使用上下文管理器
with open(text_file, 'r') as infile:
    execution_code

这里是为了自动关闭文件(一个很容易被遗忘的操作)。接着你需要学习一下包 re 来处理正则表达式。

生物信息

Biopython 有很多功能,比如将生物信息学文件解析成 Python 可用的数据结构,继而可以被循环 or 索引。还提供了常见在线生物信息学程序的接口(如 NCBI、ExPASy 等)。这里不做更详细的介绍了,可以自行去查阅一下官方帮助文档(http://biopython.org/DIST/docs/tutorial/Tutorial.html)。

Biopython 最大的价值在于帮助你集中注意力在解决需要回答的问题,而不是把过多精力分散到特定文件格式的解析中,大家可以类比其为R语言的bioconductor。

数据分析与可视化

NumPy 提供了高效的数据结构和方法,SciPy 提供了科学计算相关函数,Pandas 是一个综合数据分析包。还有做机器学习和深度学习的 scikit-learn 和 TensorFlow。数据可视化主要涉及 matplotlib、seaborn、pyecharts 等。

数据库与 Web 开发

主流数据库都有相应的 Python 模块支持,均可以完成大部分的数据库操作 ,比如数据行的选择、插入、替换、删除,数据表的创建等等。

Web 开发有流行的框架 Django 和 Flask,还有非常轻量级的 WebPy。推荐书籍参考

最后,给大家附上了之前自己在学习过程中整理的思维导图笔记。里面内容涉及了很多本篇文章没有提及的细节,可以在初学的阶段有一个宏观的把控。

当然,代码还是需要在练习中精进的~

0 人点赞