首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从DNA到多肽链的Python“实现”

上次用Python做了一个DNA序列的简单统计,这次玩点复杂的,来看看怎么用Python将“DNA链”变成 “RNA链” 再变成 “AA链”(AA : 氨基酸,Amino Acid)。

「图片来源:Google」

当然,本文中实现的“中心法则”是简化过的,实际应用过程中还需要考虑更多的因素。这回就不先放代码,大家跟着一起写。

动手写代码之前一定要理清楚思路,这是编程中最为重要的一步思路不清,绕进去容易,出来可就不一定。要理清思路,就得把问题分解,一层一层把“洋葱”剥开。要不断问自己两个问题:我们到底要干嘛?怎么干?

过程看起来大概是这样子:

如果你身边有靠写代码吃饭的人(我们称之为Coder)问问这些Coder掌握了几门编程语言?通常情况下会在三~五门之间,十来门的也不是没有。初学编程的时候,感觉学好一门就不容易,掌握两三门语言好像已经很厉害了。不过在Coder的世界里,如果你不会至少两三门编程语言,大家反而会很惊讶。因为当你熟练掌握一门语言之后就会发现编程的“核心”万变不离其宗,只要抓住这个“核心”,还不是学什么语言会什么语言。所以,写代码最重要的还是这个“核心”能力:编程思维

很多教科书里会用一种叫“Pseudo Code”(伪代码)的东西来理清编程思路,大家可以谷歌必应百度一下。不过我个人更倾向于用另外一种更直观的方法:流程图。用“中心法则”这个问题来演示一下(这里的流程图不是经典的流程图,以后会介绍如何去绘制):

思路理清楚了,下面开始动手写代码:

第一步:DNA链“转录”成RNA链

先来看代码:

解析一下:

其实我们可以“偷个懒”:

前面好几行的代码,一行就搞掂,什么感觉,是不是很无力。这就是Python中一些“内置方法”省事的地方,人家已经帮你写好了,只要知道怎么用就行,不用重复造“轮子”。以后会大量介绍和使用这些“内置方法”和一些“外部方法”。

「 用法:

"字符串".replace("A", "B")

很简单,就是用 B 替换“字符串”中的所有 A

第二步:RNA链“翻译”成AA链

回头看下流程图,这个问题是要解决?通过将“RNA序列”跟“密码子表”比对来把RNA序列转换成AAS(Amino Acid Sequence,氨基酸序列)。

翻译”的第一步比较反人类,需要将“密码子表”转换成代码…曾试图在网上找现成的,无果… 迫于无奈,只能自己做一份…

「来源:维基百科 」

我们将用上面这张密码子表来转写成代码形式的密码子表:“密码子字典”。改写的形式其实不止一种,这里就结合后面的代码,讲一种比较好理解的方式。

转写之前需要先讲解一个小知识点,叫:“字典”(Dictionary)。

Python中的“字典”是一种储存数据的形式,简单来说:就是多个变量的集合。为什么叫“字典”,说明它跟普通的字典一定有相似性,相似在哪呢?先看看怎么定义和使用“字典”:

定义方法:

字典名 =

使用方法:

值 = 字典名[键]

在Python“字典”中,一个“键”(Key)一定只对应着一个“变量值”(Value),所以当你有很多类似的数据时,就可以通过给这些“数据”(变量值)贴上“标签”(键),然后储存在“字典”里。在你想要使用某个变量的时候,只需要用这个变量的“标签”去“字典”里检索就能拿到对应的“数据”。是不是有点类似用拼音在普通字典中查汉字。

回到我们的密码子表,现在需要做的就是把密码子表改写成Python里的“密码子字典”。你可以用“字典”概念里的“键-值”对(Key-Value),将“密码子”和“氨基酸”之间关系的表示成:

“密码子” : “氨基酸”

记得用“逗号”将每个“键-值”对分开。定义好之后,一种密码子必定是对应一种氨基酸(或者起始子和终止子),拿TTT、CTT、ATT做个例子:

依葫芦画瓢,完整的“密码子字典”就长这样子:

是不是多得有点吓人,“字典”这个概念理解起来可能还是有些抽象,不过还是那句话:代码用多了自然就会,看再多的理论都不如在实践中领悟的快。所以当务之急还是动手敲一遍。假如你敲完了整个字典,运行之后没有报错,那么就请收下我的膝盖 Orz

实在不想敲的,可以在文末找到,易微升编程平台上也有。

接下来看看怎么用这个 “密码子字典” 实现 RNA序列 “翻译” 成AA序列,代码如下:

这部分代码分为两“块”(Block):

第一块:验证RNA序列的完整性

第二块:“翻译”蛋白质

来看分解:

到这里,RNA转换成AA的工作就完成了(真实情况会复杂得多,还要考虑很多的因素,为了简化代码,文章里都省略掉了)。“翻译”的代码中有几个地方还需要特别补充一下,放到下期再讲。文章里用来做示例的DNA序列刚刚好是3的倍数,而且还能翻译成完整的序列,实际情况可能不会那么完美,鼓励大家试试不一样的序列。

细心的读者一定会发现,“翻译”过程中,第一块代码的内容在前面的“流程图”里并没有提到,是不是漏了?其实是有意为之。增加这一块代码的目的,是为了说明一个道理:编程的过程中总会不断遇到新的问题,或者有新的想法,因此在编程过程中你必须不断更新你的“流程图”。建议大家使用工具软件来构建自己的“流程图”,便于更新,正所谓工欲善其事,必先利其器。(具体有哪些工具,请大家自行谷歌必应百度)

看完文章,会不会有这种感觉:在用编程解决问题的时候,思维方式跟直觉中的思维方式不太一样。这就对了,编程的思维确实跟我们平时的思维有些差异。初学编程,除了语法之外,适应编程的思维方式也是一个非常重要的学习过程。

最后留个小问题,怎么把AA序列转换成”缩写形式“的AA序列:

提示:建立“字典”,再使用replace()替换,下期解答

易微升

如果大家身边没有Python编程环境,又不想为搭建环境而烦恼,那么可以使用易微升提供的在线编程环境(Jupyterlab)。大家可以留言或者在易微升的交流群里找管理员(微信号:173556705)申请免费账号,仅供学习使用,请大家爱护这个环境~

附上完整代码:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181227G0EX4P00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券