到目前为止,这是我的代码:
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来返回一个开放源码。这个开放源码被添加到一个开放源码列表中,然后函数跳到DNA字符串中我们刚刚找到的开放源码之后的位置,开始寻找下一个开放源码。
发布于 2018-10-18 00:32:27
我可以看到一些明显的问题,但不确定你到底想要什么,所以希望这能有所帮助。首先,除非one_frame以'ATG‘开头,否则你在DNA中的循环永远不会结束。我想你应该检查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)https://stackoverflow.com/questions/52858811
复制相似问题