<p>你用序数使事情变得不必要的复杂化。实际上,你使用的“字母表”有256个符号,而你只对26个感兴趣。你知道吗</p>
<p>理想情况下,你只需要你的符号在0到25之间的数字范围内,一旦你达到26,你会再次扭曲到0。你可以用序数来实现这一点,但是你必须使用正确的偏移量。你知道吗</p>
<p>现在,假设您只使用大写字母。它们的序数从65到90不等。所以一旦你到了91,你就想转到65。你知道吗</p>
<pre><code>if temp3 > 90:
temp3 -= 26
</code></pre>
<p>另一个问题是您只需添加<code>temp1</code>和<code>temp2</code>。<code>temp1</code>可以保持为介于65和90之间的数字,但是<code>temp2</code>应该是键偏移量,范围从0到25。因此,当您计算<code>temp2</code>时,您真的应该这样做</p>
<pre><code>temp2 = int(keylist[stringposition-1]) - 65
</code></pre>
<p>这将从概念上解决您的问题,但您的算法仍然不正确。while循环的目的是将关键字的长度至少扩展为消息的长度。其他所有内容必须在左边缩进4个空格,这样它们就不是循环的一部分。明确地说</p>
<pre><code>while len(keyword1)<=len(message1):
keyword1+=keyword1
newkeyword=keyword1[:len(message1)]
for mesletter in message1:
keynumber = ord(keyletter)
stringofnumbs.append(mesnumber)
for keyletter in newkeyword:
keynumber = ord(keyletter)
keylist.append(keynumber)
temp1 = int(stringofnumbs[stringposition])
temp2 = int(keylist[stringposition]) - 65
temp3 = temp2+temp1
if temp3 > 90:
temp3 -= 26
encdec.append(temp3)
stringposition += 1
etc
</code></pre>
<p>在上面的代码块中,我想指出我纠正的更多错误。你应该迭代<code>newkeyword</code>,而不是<code>keyword1</code>,而且你还必须增加每个字母的<code>stringposition</code>计数器。你知道吗</p>
<hr/>
<p>对于一个更有效、更不复杂的算法,可以考虑将代码发布到<a href="https://codereview.stackexchange.com/">Code Review</a>,以便进行回顾,并从得到的反馈中学习。你知道吗</p>
<p>虽然不是编写代码的最佳方法,但在保持代码不变的同时,仍然可以进行一些基本的整理。基本上,一旦你的消息和关键字的长度相同,你就可以遍历这对字母,然后计算加密的字母,这样就可以把它存储在一个列表中。没有理由存储中间步骤,例如将消息和关键字转换为数字列表。你知道吗</p>
<pre><code>if message1.isalpha() and keyword1.isalpha():
message1 = message1.upper()
keyword1 = keyword1.upper()
if len(keyword1) < len(message1):
keyword1 = keyword1 * (len(message1) / len(keyword1)) + keyword1
keyword1 = keyword1[:len(message1)]
for m, k in zip(message1, keyword1):
encrypted = ord(m) + (ord(k) - 65)
if encrypted > 90:
encrypted -= 26
encdec.append(chr(encrypted))
print ('\nThe endcoded text is:')
print (''.join(encdec))
</code></pre>