蟒.尝试编写一个名为 one_frame 的函数.似乎不起作用.帮助将不胜感激



截至目前,这是我的代码:

def get_orf(DNA):
codon = ''
if(DNA[0:3] == 'ATG'):
codon = DNA[0:3]
for x in range(3,len(DNA)+1,3):
if DNA[x:x+3] == "TAG"  or DNA[x:x+3] == "TAA" or DNA[x:x+3] == "TGA":
return codon
else: codon = codon + DNA[x:x+3] 
if codon[-3:] in ["TAG", "TAA", "TGA"]:
return codon
else: return 'No ORF'  
def one_frame(DNA):
x = 0
ORFlist = []
while x < len(DNA):
codon = DNA[x:]
if DNA.startswith('ATG'):
get_orf(DNA[x:])
if codon:
ORFlist.append(codon)
x += len(codon)
return(ORFlist)

get_orf函数工作正常,但我的one_frame函数不起作用。 one_frame函数应该将DNA字符串作为输入。它搜索 从左到右串成三个核苷酸的倍数,即在单个阅读框中。什么时候 它命中一个起始密码子"ATG",它在从该开始密码子开始的字符串切片上调用get_orf (直到最后(取回一个ORF。该 ORF 被添加到 ORF 列表中,然后函数跳过 在DNA链中前进到我们刚刚发现并开始寻找的ORF之后的点 下一个ORF。重复此操作,直到我们遍历了整个DNA链。

我可以看到一些明显的问题,但不确定你想要什么,所以希望这有帮助。首先,除非DNA以"ATG"开头,否则one_framefor环永远不会结束。我想你想检查codon.startswith而不是DNA.startswith.您还需要在 if 语句之外执行x+=命令,否则当您不点击"ATG"时,它将永远不会更新,因此您的循环将永远持续下去。您也根本没有使用get_orf的值。

我认为这将解决问题,

def one_frame(DNA):
x = 0
ORFlist = []
while x < len(DNA):
codon = DNA[x:]
# Check codon instead of DNA
if codon.startswith('ATG'):
# Record the return value of get_orf
orf_return_value = get_orf(DNA[x:])
if orf_return_value:
ORFlist.append(orf_return_value)
x += len(orf_return_value)
# Increment by 3 if we don't hit ATG
else:
x += 3
return(ORFlist)

最新更新