好吧,我已经用python编写了一个Caesar密码程序,我看不出为什么这个不起作用,但是它没有。。。它将新词输出为“a”“a”“a”(不管单词中有多少个字母)。我猜它是某种循环,会导致每个字母都变成“a”,但我就是搞不懂。有人能帮我吗?谢谢。
我的代码:
word = input("please enter the word you wish to encrypt: ")
seperated = list(word)
length = len(word)
alphabet1 = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
alphabet2 = ["b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","a"]
length2 = len(alphabet1)
length3 = len(alphabet2)
for eachposition in range(length):
for letter in range(length2):
if seperated[eachposition] == alphabet1[letter]:
seperated.pop(eachposition)
seperated.insert(eachposition, alphabet2[letter])
print(seperated)
另一种方法是将每个字符转换成它的ASCII号,即a=97,b=98等asciitable.com这可以用ord()完成
然后您可以添加密钥以获取新的ascii代码并将其转换回字符。你已经使用了模来允许从字母表的末尾循环到开始。在
^{pr2}$您需要添加代码来处理大写字母(ascii 65-90)和非字母字符。}将在这里完成这项工作。在
isupper()
和{这种方法允许改变键。在
我在你的代码中添加了一些
print
调用,结果发现很多误报,seperated[eachposition] == alphabet1[letter]
的计算结果是True
,而我很快意识到了这个问题。在您从未从循环中使用
break
,因此发生了以下情况:因为您的密码只是将每个字母向前推进一个,所以这个循环将一直运行,直到到达列表中的最后一个字母“a”。在
简单的修复方法是使用^{} 。它将提前结束
for
循环。意思是说,当你替换了一个字母时,你想打破这个内部循环,进入下一个字符。在@SuperBiasedMan为您提供了保留代码的有效解决方案,但我建议您为您的任务提供一个更简单的循环(不需要弹出和插入,因为您在整个单词中有序地迭代)。在
也可以考虑使用字典。它们在解决这样的问题上很有用。在
相关问题 更多 >
编程相关推荐