- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
运行 python 3.5。我开始研究基本加密,并决定尝试编写一个简单的凯撒密码。非常简单的逻辑:
1) 对于给定的纯文本消息,在我的 LETTERS 字符串中查找每个消息符号的索引
2)将shift键添加到索引
3) 得到的数字就是密码符号的索引
4) 如果结果数字大于 LETTERS 字符串的长度,则从该数字中减去 LETTERS 字符串的长度(这将处理回绕到字符串开头的情况。
这是该程序的代码。
凯撒密码2.py
LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrustuvwxyz1234567890!@#$%^&*()><.,?/"
message = str(input("Enter a message. "))
key = int(input("Enter a whole number key (1-79). "))
mode = str(input("Press 'E' to encrypt or 'D' to decrypt. "))
def encrypt_message(plain_message):
translated = " "
for symbol in plain_message:
if symbol in LETTERS:
num = LETTERS.find(symbol)
num += key
if num > len(LETTERS):
num -= len(LETTERS)
translated += LETTERS[num]
else:
translated += symbol
return translated
def decrypt_message(cipher_message):
translated = " "
for symbol in cipher_message:
if symbol in LETTERS:
num = LETTERS.find(symbol)
num -= key
if num < 0:
num += len(LETTERS)
translated += LETTERS[num]
else:
translated += symbol
return translated
def main():
if mode == "E" or mode == "e":
print(encrypt_message(message))
elif mode == "D" or mode == "d":
print(decrypt_message(message))
if __name__ == "__main__":
main()
程序似乎工作正常,但是当我运行测试用例时,我开始注意到一些 Shift 键在 encrypt_Message() 的以下行抛出 IndexError:
translated += LETTERS[num]
因此,我决定编写另一个脚本,使用 encrypt_Message() 中的代码来测试所有可能 key 的任何给定消息。我发现,我通过该函数传递的任何明文消息都会导致一些 Shift 键(通常是 5 - 10 个键)在同一行抛出 IndexError。所有其余 key 均按预期返回密文。
调试这些错误抛出键上的代码向我展示了为这些特定键翻译明文消息的一些要点,即以下行:
num = LETTERS.find(symbol)
返回 LETTERS 的长度而不是 LETTERS 中符号的索引,然后代码似乎从那里挂起。 if 语句不会触发来调整 num 变量,因此当它到达翻译后的语句时,num 变量的索引超出范围。
我的问题是为什么会发生这种情况?为什么代码对大多数键按预期工作,而对其余键抛出此异常?
有什么想法吗?谢谢。
最佳答案
Python 索引列表从 0 开始。这将产生以下效果:
>>> x = ['a', 'b', 'c', 'd']
>>> len(x)
4
>>> x[0]
'a'
>>> x[3]
'd'
>>> x[4]
IndexError: list index out of range
请注意,对于包含 4 个元素的列表,x[4]
已经超出了范围。根据经验,可被视为入站的最大索引为 len(x) - 1
。
就您而言,错误是
if num > len(LETTERS):
应该是
if num >= len(LETTERS):
关于Python 凯撒密码索引错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38487663/
我刚刚开始学习 C 语言类(class),并且遇到了命令行参数的问题。分配是这样的(还有更多,但这是开头有关命令行参数的部分): - 你的程序必须接受一个命令行参数,一个非负整数。 - 如果您的程序在
我需要检查命令行参数中是否有非数字字符。例如: ./problem 20x 应该打印出“不是数字”,因为它包含一个 x。我的代码似乎没有循环遍历命令行参数中的所有字符。 我基本上尝试了不同类型的循环,
这里我有从标准输入将字符流输入到数组中的代码。然后将该数组转换为二维数组。然后,它将该数组从行列顺序更改为列行顺序。然后它打印出创建凯撒移位加密的新数组。我遇到的问题是我的数组开始使用第二个用户输入的
我有点被这个问题困住了。当我运行程序时,由于某种原因,循环经过 z 的所有字母都不会打印。问题来自这个链接:http://docs.cs50.net/2016/x/ap/problems/caesar
我是一名优秀的程序员,十分优秀!