从循环中的序列中获取下一组字母

Getting the next set of letters from a sequence in a loop

我正在开发一个从序列中识别 ORF 的程序。当程序应该分析序列中的密码子时,我似乎遇到了一个错误。 我的代码是:

def __init__(self,sequence):
    self.sequence = Seq(sequence)
    self.reverse = self.sequence.reverse_complement()
    self.sequence = str(self.sequence)
    self.stopcodons = ["TAG", "TAA", "TGA"]
    self.start = 'ATG'
    self.length = 0
    self.result = ("+",0,0,0,0)

def codon(self,frame):
    start = frame
    while start +3 <=len(self.sequence):
        yield (self.sequence[start:start+3],start)
        start += 3
    #print (start)

def direction(self):
    direction = "+"
    for frame in range(3):
      self.ORF(frame, direction)
    direction = "-"
    for frame in range(3):
        self.sequence = self.reverse
        self.ORF(frame, direction)
    SeqAnalyzer.results()

def ORF(self, frame, direction):
    orf_beg = 0
    codon_frame = self.codon(frame)
    while True:
        i, index = next(codon_frame)
        if i in self.start or not self.start and i not in self.stopcodons:
            orf_beg = index + 1
        elif i in self.stopcodons:
            orf_ending = index + 3
            length = (orf_ending - orf_beg) + 1
            if length > self.length:
                self.length = length
                self.result = (direction, frame, orf_beg, orf_ending, length)
                print(self.result)
            break
def results(self):
    print("'{}{:+d} {:>5d}..{:>5d} {:>5d}'" .format(self.result))

当 运行 时,我得到一个错误:

File "C:/Users/Alex/OneDrive/Python/Lab 5/findORFs.py", line 33, in direction

self.ORF(frame, direction)
File "C:/Users/Alex/OneDrive/Python/Lab 5/findORFs.py", line 44, in ORF

i, index = next(codon_frame)
StopIteration

问题似乎出在我的 Next(codon_frame) 上,但我不知道该如何解决。

而不是

codon_frame = self.codon(frame)
while True:
    i, index = next(codon_frame)`

你可能应该这样做:

for i, index in self.codon(frame):

如果出于某种原因您想继续手动执行此操作,则需要使用 try/except:

包装 next() 调用
try:
    i, index = next(codon_frame)
except StopIteration:
    break

替换:

codon_frame = self.codon(frame)
while True:
    i, index = next(codon_frame)

与:

for i, index in self.codon(frame):