<p>让我们来看一个特别的错误:<code>o: '{'</code>。在</p>
<p>注意,<code>ord('o')</code>是111,所以让我们看看<code>range(111,130)</code>中的整数的{<cd3>}:</p>
<p>从<code>o</code>开始,移动12,将您带到<code>{</code>字符:</p>
<pre><code>In [75]: ' '.join([chr(x) for x in range(111,130)])
Out[75]: 'o p q r s t u v w x y z { | } ~ \x7f \x80 \x81'
^ 1 2 3 4 5 6 7 8 9 ...12
</code></pre>
<p>所以你得到错误输出的原因是因为你的公式</p>
^{pr2}$
<p>没有考虑到如果移位将您从与<code>a-z</code>或<code>A-Z</code>关联的ords中跳出来时会发生什么。(注意<code>a-z</code>和<code>A-Z</code>的ord范围也不是连续的!)在</p>
<hr/>
<p>以下是有关如何修复的提示:</p>
<pre><code>In [82]: alphabet = string.ascii_lowercase + string.ascii_uppercase
In [83]: alphabet.index('o')
Out[83]: 14
In [84]: alphabet[alphabet.index('o')+12]
Out[84]: 'A'
</code></pre>
<p>但是</p>
<pre><code>In [85]: alphabet[alphabet.index('O')+12]
</code></pre>
<p>结果是<code>IndexError: string index out of range</code>。这是因为<code>len(alphabet)</code>是52,而且</p>
<pre><code>In [91]: alphabet.index('O')+12
Out[91]: 52
</code></pre>
<p>不知怎么的,我们需要52才能回到0。您可以使用<a href="http://docs.python.org/2/reference/expressions.html#binary-arithmetic-operations" rel="nofollow">^{<cd13>} modulo operator</a>:</p>
<pre><code>In [92]: 52 % 52
Out[92]: 0
</code></pre>