此代码应以更大的顺序打印所有编码序列,称为sequentie。 然而,它无限地打印出第一个找到的序列。
def getCodons(sequentie):
DNA = sequentie
while 'atg' in DNA:
start = DNA.find('atg')
codon = getSequentie(DNA, start)
DNA = DNA[DNA.index(codon):]
def getSequentie(DNA, start):
print ('')
print ("Sequentie:")
while start+2 < len(DNA):
codon = DNA[start:start+3]
if codon == "tag" or codon == "taa" or codon == "tga":
print (codon, end=' ')
return codon
break
print (codon, end=' ')
start+=3
所以输出:
Sequentie: atg aag ttt ttg gta gtt aag ata aag ctc gag act gat att tca tat act gga tga tga
Sequentie: atg aag ttt ttg gta gtt aag ata aag ctc gag act gat att tca tat act gga tga tga
Sequentie: atg aag ttt ttg gta gtt aag ata aag ctc gag act gat att tca tat act gga tga tga
Sequentie: atg aag ttt ttg gta gtt aag ata aag ctc gag act gat att tca tat act gga tga tga ......
为sequentie ccagaatggttactatggacatccgccaaccatacaagctatggtgaaatgctttatctatctcatttttagtttcaaagcttttgttataacacatgcaaatccatatccgtaaccaatatccaatcgcttgacatagtctgatgaagtttttggtagttaagataaagctcgagactgatatttcatatactggatgatttagggaaacttgcattctattcatgaacgaatgagtcaatacgagacacaaccaagcatgcaaggagctgtgagttgatgttctatgctatttaagtatttttcgggagatatatatatcttattgttctcctcctcccgagtcaagttgttctaagaaagaaggatctatttcattttgtggattgtctagtttcagggacagacggggtttaggggaagcgctatccgtggctgctatgacatcgaagaaactctgcacgacatggtatgtaatct
我想得到 Sequentie: atg aag ttt ttg gta gtt aag ata aag ctc gag act gat att tca tat act gga tga tga
然后找到下一个序列
答案 0 :(得分:0)
主要问题是你在外循环中不断找到相同的“atg”实例。这是因为 getSequentie 返回一个始终以“atg”开头的字符串。因此,在循环的下一次迭代中, start 将为0( DNA 字符串以“atg”开头)。从那一刻起,DNA.index(codon)
将始终产生零,因此在下一次迭代中没有任何变化,从而导致无限循环。
您可以在此处添加1来解决此问题:
DNA = DNA[DNA.index(codon)+1:]
这样 DNA 总会变得更短,因此循环将是有限的。
您还应该定义在找不到结束密码子时您想要发生的事情。在这种情况下,第二个函数将返回None
,第一个函数应该处理它(它应该退出)。在这种情况下,甚至可能不会打印序列。
最好延迟打印,直到获得最终结果。第二个函数可以返回序列结束的索引(如果未找到结束密码子,则返回None
)。然后,您可以使用序列填充结果变量,并将打印保留给调用者。
以下是应用这些和其他一些更改后的代码:
def getCodons(sequentie):
DNA = sequentie
start = 0
codons = []
while 'atg' in DNA:
start = DNA.find('atg', start)
end = getSequentie(DNA, start)
if not end:
break
codons.append(' '.join([DNA[i:i+3] for i in range(start, end, 3)]))
start = end
return codons
def getSequentie(DNA, start):
for start in range(start, len(DNA)-2, 3):
if DNA[start:start+3] in ("tag", "taa", "tga"):
return start+3
sequences = getCodons('ccagaatggttactatggacatccgccaaccatacaagctatggtgaaatgctttatctatctcatttttagtttcaaagcttttgttataacacatgcaaatccatatccgtaaccaatatccaatcgcttgacatagtctgatgaagtttttggtagttaagataaagctcgagactgatatttcatatactggatgatttagggaaacttgcattctattcatgaacgaatgagtcaatacgagacacaaccaagcatgcaaggagctgtgagttgatgttctatgctatttaagtatttttcgggagatatatatatcttattgttctcctcctcccgagtcaagttgttctaagaaagaaggatctatttcattttgtggattgtctagtttcagggacagacggggtttaggggaagcgctatccgtggctgctatgacatcgaagaaactctgcacgacatggtatgtaatct')
print('\n'.join(sequences))
在repl.it上看到它。