代码无法正确循环

时间:2016-12-13 13:27:40

标签: python loops

此代码应以更大的顺序打印所有编码序列,称为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

然后找到下一个序列

1 个答案:

答案 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上看到它。