当前位置:首页|资讯|ChatGPT|编程

如果 ChatGPT 给出的的代码不太完善,如何请他一步步改好?

作者:生信宝典发布时间:2023-03-03

前面我们请 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 文件就完成? 给了一个答案,很好的思路,但也还存在一些问题需要继续追问完善。

从上面来看,我们是可以一步步请 帮我们完成我们需要的编程工作和完善代码。这里面也需要我们:

清楚的描述问题和需求。

能了解基本的语法,发现代码中可能存在的问题,并提出进一步改进。


Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1