蟒蛇。试图编写一个称为one_frame的函数。似乎不起作用。帮助将不胜感激

时间:2018-10-17 15:45:24

标签: python-3.x

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

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字符串为止。

1 个答案:

答案 0 :(得分:1)

我可以看到一些明显的问题,但是不确定您想要什么,希望对您有所帮助。首先,除非DNA以'ATG'开头,否则for中的one_frame循环将永远不会结束。我认为您想检查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)