<p><code>n += nextmet</code>不会做您想要的事情,因为当控件返回到<code>for</code>循环的顶部时,<code>n</code>会重置为范围内的下一个数字。因此,您可以使用<code>while</code>循环,而不是使用<code>for</code>循环。例如</p>
<pre><code>maxloop = len(protein)
n = 0
while n < maxloop:
met = protein.find("M", n)
if met == -1:
break
#etc
n = nextmet + 1
</code></pre>
<p>我把<code>if</code>语句放在那里,因为如果<code>find</code>找不到它的目标,它将返回-1。你知道吗</p>
<hr/>
<p>这里有一个更完整的演示,现在你给了我们一些数据来处理。你知道吗</p>
<pre><code>protein = '''DIMGYF*GLTGSR*VLSSGWIRAQSCTECG*SSEAGVEVRGVRQTDRHSQPARSAV*
SELQILFSFHLLSNCPELAPVAPGLVFRECPESLVSSRPREESPAAQALLTAAESSGTHAPAGGSRRAAAAA
KNFPGWEDRRQVAESRSQLLQAFPAS*ASPRR*RPEGGGEPRKRRRTCAQLRSHRLLNLGEREPRLPGAPSP
*QRRRGQVVGVRAAKTRRRPATAGSALIRSAGRAAALGSEFACGLRGTAAHEERSVSDRDFSKPGSARESTS
KSAGGILINPALPGASW*GGRSGDDSQRVRALLEKLSLSKAPGGAGVPRLPQPCCGPETCARSPN*PHVK*
RTVL*LQRWKRPSMTMPSTPRSSRPRADLMATVTPRS*'''
#Get rid of newlines
protein = protein.replace('\n', '')
print("5'3' Frame 1:\n{0}\n".format(protein))
maxloop = len(protein)
n = 0
while n < maxloop:
met = protein.find("M", n)
if met == -1:
break
stop = protein.find("*", met)
if stop == -1:
print('Error: no * found for frame starting at residue', met + 1)
break
orf = protein[met:stop]
print("Open reading frame starting at residue", met + 1, ":", orf)
n = stop + 1
</code></pre>
<p><strong>输出</strong></p>
<pre><code> 5'3' Frame 1:
DIMGYF*GLTGSR*VLSSGWIRAQSCTECG*SSEAGVEVRGVRQTDRHSQPARSAV*SELQILFSFHLLSNCPELAPVAPGLVFRECPESLVSSRPREESPAAQALLTAAESSGTHAPAGGSRRAAAAAKNFPGWEDRRQVAESRSQLLQAFPAS*ASPRR*RPEGGGEPRKRRRTCAQLRSHRLLNLGEREPRLPGAPSP*QRRRGQVVGVRAAKTRRRPATAGSALIRSAGRAAALGSEFACGLRGTAAHEERSVSDRDFSKPGSARESTSKSAGGILINPALPGASW*GGRSGDDSQRVRALLEKLSLSKAPGGAGVPRLPQPCCGPETCARSPN*PHVK*RTVL*LQRWKRPSMTMPSTPRSSRPRADLMATVTPRS*
Open reading frame starting at residue 3 : MGYF
Open reading frame starting at residue 358 : MTMPSTPRSSRPRADLMATVTPRS
</code></pre>