前面我们请 ChatGPT 帮我们写了代码 (
偷个懒,用ChatGPT 帮我写段生物信息代码
),很简单的一个任务,从 FASTA 文件中提取特定基因的序列,整体写的很不错,虽然还存在一些问题。接下来我们把对代码的疑问和需要修改的点告诉 ,请他帮助完善。
下面文字记录下整个过程,也方便大家如果有兴趣,可以拷贝代码运行下,文后有视频录制了整个过程。
生信宝典 1: 请帮我写一段 python 代码从 FASTA 文件提取特定基因序列
ChatGPT 1: 当提取特定基因序列时,需要知道基因的ID或名称,因为在FASTA文件中,每个序列都有一个唯一的ID或名称。因此,假设我们想要从一个FASTA文件中提取名为 “gene_of_interest” 的基因序列,我们可以使用以下Python代码:
使用这个函数,我们可以从一个FASTA文件中提取名为 “gene_of_interest” 的基因序列:
注意,这个代码只会提取一个名为 “gene_of_interest” 的基因序列,如果FASTA文件中有多个同名的基因序列,只会提取第一个。如果需要提取所有同名基因序列,需要稍作修改。
点评
同样的问题,这次再次提出,给出的答案从文字上看不一样,完成的任务是一样的。
完成的任务比之前可以说是更好了
a) 基因名字的匹配采用的是全等 (这里我们没有告诉 ChatGPT Fasta 序列名字中可能会存在空格或竖线等分割的注释信息的干扰);
b) 可以处理多行序列格式的 FASTA 文件了
每一部分代码都加了注释,还抽提了函数,很赞
函数名起的很规范
生信宝典 2: 提取完目标序列后,可否直接 break 程序,我不需要代码继续运行下去
ChatGPT 2: 是的,你可以在找到目标序列后使用 break 语句来停止循环并退出函数。例如,在 : 条件成立后,你可以添加 break 语句来停止循环:
这样,当找到目标序列后,循环将立即停止,并且程序将从 return gene_seq 行继续执行,返回找到的序列。注意,break 语句只能在循环内部使用,因此你需要在 for 循环内部使用它。如果你使用了嵌套的循环,则 break 语句只会停止最内层的循环。
点评这部分我可能没有描述太清楚,ChatGPT看上去是理解了这个意思,但是 break 的位置不对,提前终止了,相当于什么都没干。
生信宝典 3: 上面的逻辑有些问题,不是匹配到 gene_name 就 break;而是再读取匹配到的gene_name 的序列后遇到下一个基因时再 break
ChatGPT 3: 你说得对,如果一个FASTA文件中有多个同名的基因序列,我们需要读取完所有同名序列,而不是只提取第一个。因此,我们需要稍微修改一下代码,在找到目标序列后继续读取下一个序列,直到找到下一个同名序列或文件结束。
以下是修改后的代码:
使用这个函数,我们可以从一个FASTA文件中提取名为 “gene_of_interest” 的所有基因序列:
注意,如果一个FASTA文件中没有名为 “gene_of_interest” 的序列,则会返回一个空字符串。
点评
这一次我尝试描述的更清楚些,当然我的语言也没组织好,不过却得到了正确的代码。
代码的 break 加的位置对了,输出一个匹配序列后就停止。
不对的地方是:
从 ChatGPT 给出的文字描述看ChatGPT 以为我要找出多条名字一样的基因的序列 (这是对我问题前半句的反应)。
后面的 break 是对我问题后半句的反应。
实际我应该只说我要什么结果,而不需要前面的解释,对 ChatGPT 的回答也许会更有帮助。
既然 ChatGPT 念念不忘提取多条序列,我们再问一下如何做。
生信宝典 3: 如何批量提取多个 不同 Gene_name 的序列
ChatGPT 3: 要批量提取多个不同基因序列,我们可以在 函数的基础上编写一个新的函数来完成这个任务。这个新函数将接受一个包含基因名称列表的参数,并使用 函数逐个提取每个基因的序列,并将结果保存到一个字典中。
以下是实现这个功能的示例代码:
使用这个函数,我们可以提取多个不同基因的序列。例如:
这个代码会读取FASTA文件,提取名为 “gene1”、”gene2” 和 “gene3” 的基因序列,并将结果保存到一个字典中。然后,它会逐个打印每个基因序列。注意,如果FASTA文件中没有某个基因的序列,则对应的字典值将为一个空字符串。
点评
ChatGPT充分利用了之前的代码,又生成了一个函数根据提供的基因名循环调用之前写的函数。
函数名用单复数做了区分:
extract_genes_from_fasta 和 extract_gene_from_fasta
上面每次提取一个基因的序列,都需要读一遍 fasta 文件,是否有些浪费了?
生信宝典 4: 上面的操作如何通过只读取一遍 fasta 文件就完成
ChatGPT 4: 如果要在只读取一遍FASTA文件的情况下提取多个基因序列,可以对 extract_genes_from_fasta 函数进行改进。一个可能的方法是,首先读取整个FASTA文件并将所有序列存储在一个字典中,然后在字典中查找每个目标序列。
以下是实现这个功能的示例代码:
这个函数首先打开FASTA文件,逐行读取所有序列并将它们存储到一个字典中,其中键为序列名称,值为序列本身。然后,它逐个查找每个目标基因,并将它们的序列保存到一个新的字典中。最后,它返回这个字典。
注意,这个方法的缺点是,它需要将整个FASTA文件读入内存中。如果文件非常大,这可能会导致内存问题。
点评
堪称完美。
提到的注意点也很棒,试试继续优化下
可以继续提问:上面的操作如何通过只读取一遍 fasta 文件就完成? 给了一个答案,很好的思路,但也还存在一些问题需要继续追问完善。
从上面来看,我们是可以一步步请 帮我们完成我们需要的编程工作和完善代码。这里面也需要我们:
清楚的描述问题和需求。
能了解基本的语法,发现代码中可能存在的问题,并提出进一步改进。