Skip to main content
 首页 » 编程设计

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

2025年05月04日31pander-it

我正在开发一个从序列中识别 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 

问题似乎来 self 的 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