Caesar Cipher python 程序循环问题
Caesar Cipher python program looping issue
好的,所以我在 python 中使用凯撒密码程序已经走到了这一步,但看不出有任何原因这不起作用,但它没有......它输出新词作为'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)
我在您的代码中添加了一些 print
调用,但在 seperated[eachposition] == alphabet1[letter]
不应该评估为 True
的情况下出现了很多误报。从那以后我很快就意识到了这个问题。
您从不在循环中使用 break
,所以这是正在发生的事情:
- 我输入"word"
- 循环运行s直到发现第一个字母与字母表中的字母'w'相同
- separated 的第一个字母设置为 'x',因为你的密码是如何工作的
- 循环保持运行ning,现在测试第一个字母是否为'x'
因为你的密码只是将每个字母推进一个,这个循环将总是 运行 直到它到达你列表中的最后一个字母,'a'。
简单的解决方法是使用 break
。它会提前结束一个 for
循环。这意味着当您替换了一个字母后,您想跳出那个内循环并移动到下一个字符。
for eachposition in range(length):
for letter in range(length2):
if seperated[eachposition] == alphabet1[letter]:
seperated.pop(eachposition)
seperated.insert(eachposition, alphabet2[letter])
break
@SuperBiasedMan 为您提供了保留代码的有效解决方案,但我会为您的任务提出一个更简单的循环(不需要弹出和插入,因为您在整个单词中有序迭代)。
new = []
for c in word:
for i in range(length2):
if c == alphabet1[i]:
new.append(alphabet2[i])
break
new = ''.join(new)
print new
也可以考虑使用字典。它们在解决此类问题时会派上用场。
另一种方法是将每个字符转换为其 ASCII 码,即 a = 97,b = 98 等 asciitable.com 这可以通过 ord()
num = ord(character) - 97
然后你可以添加密钥来获取新的ascii码并转换回字符。您已经使用模数来允许从字母表的末尾循环到开头。
encr_char = chr((num + key)% 26 + 97)
您需要添加代码来处理大写字母 (ascii 65 - 90) 和非字母字符。 isupper()
和 isalpha()
将在此处完成工作。
这种方法允许改变密钥。
好的,所以我在 python 中使用凯撒密码程序已经走到了这一步,但看不出有任何原因这不起作用,但它没有......它输出新词作为'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)
我在您的代码中添加了一些 print
调用,但在 seperated[eachposition] == alphabet1[letter]
不应该评估为 True
的情况下出现了很多误报。从那以后我很快就意识到了这个问题。
您从不在循环中使用 break
,所以这是正在发生的事情:
- 我输入"word"
- 循环运行s直到发现第一个字母与字母表中的字母'w'相同
- separated 的第一个字母设置为 'x',因为你的密码是如何工作的
- 循环保持运行ning,现在测试第一个字母是否为'x'
因为你的密码只是将每个字母推进一个,这个循环将总是 运行 直到它到达你列表中的最后一个字母,'a'。
简单的解决方法是使用 break
。它会提前结束一个 for
循环。这意味着当您替换了一个字母后,您想跳出那个内循环并移动到下一个字符。
for eachposition in range(length):
for letter in range(length2):
if seperated[eachposition] == alphabet1[letter]:
seperated.pop(eachposition)
seperated.insert(eachposition, alphabet2[letter])
break
@SuperBiasedMan 为您提供了保留代码的有效解决方案,但我会为您的任务提出一个更简单的循环(不需要弹出和插入,因为您在整个单词中有序迭代)。
new = []
for c in word:
for i in range(length2):
if c == alphabet1[i]:
new.append(alphabet2[i])
break
new = ''.join(new)
print new
也可以考虑使用字典。它们在解决此类问题时会派上用场。
另一种方法是将每个字符转换为其 ASCII 码,即 a = 97,b = 98 等 asciitable.com 这可以通过 ord()
num = ord(character) - 97
然后你可以添加密钥来获取新的ascii码并转换回字符。您已经使用模数来允许从字母表的末尾循环到开头。
encr_char = chr((num + key)% 26 + 97)
您需要添加代码来处理大写字母 (ascii 65 - 90) 和非字母字符。 isupper()
和 isalpha()
将在此处完成工作。
这种方法允许改变密钥。