<p>打印字符串中出现差异的原因确实是<code>print</code>函数的一个怪癖。你知道吗</p>
<p>这个程序更深层次的问题是它没有产生正确的答案。这是因为试图确定解密字符是否在可接受范围内的大丑陋<code>if</code>是不正确的。你知道吗</p>
<p>这在两个方面是不正确的。第一个是<code>(asciiValue >= 90)</code>应该是<code>(asciiValue >= 97)</code>。编写所有这些表达式的更好方法是将它们表示为<code>(asciiValue >= ord('a'))</code>和<code>(asciiValue == ord(' '))</code>等等,这样就避免了难以理解的数字,从而避免了这种错误。你知道吗</p>
<p>第二种方法是表达式没有正确分组。从他们的立场来看,他们是这样做的:</p>
<pre><code>character is not in the range 'A' to 'Z',
or character is in the range 'a' to 'z',
or character is 'space',
then count this as an error
</code></pre>
<p>所以一些应该是好的字符(特别是从'a'到'z'和空格)被认为是坏的。要修复此问题,需要重新处理圆括号,以便条件为:</p>
<pre><code>character is not in the range 'A' to 'Z',
and character is not in the range 'a' to 'z',
and character is not space,
then count this as an error
</code></pre>
<p>或者(这是你尝试的风格)</p>
<pre><code>character is not (in the range 'A' to 'Z'
or in the range 'a' to 'z'
or a space)
</code></pre>
<p>我不会给你精确的表达式来修复这个程序,你自己来解决会更好。(处理这种复杂性的一个好方法是将其移到一个单独的函数中,该函数返回<code>True</code>或<code>False</code>。这使得测试您的实现是否正确变得很容易,只需使用不同的字符调用函数并查看结果是否符合您的要求。)</p>
<p>当您得到正确的表达式时,您会发现程序发现了一个不同的“最佳密钥”,并且该密钥的解密字符串不包含任何行为与<code>print</code>异常的愚蠢越界字符。你知道吗</p>