凯撒密码两种Python实现代码输出顺序异常问题求教
凯撒密码实现的顺序问题分析
我是一名Python入门程序员。在了解.index()方法之前,我使用了一种替代方案实现凯撒密码。虽然代码能运行,但出现了奇怪的问题:输出字符串的顺序被打乱了,我不知道原因。
我的代码
初始定义
alphabet = ['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'] text = input("Type your message:\n").lower() shift = int(input("Type the shift number:\n")) # 测试输入:text = "code",shift = 5
第一次尝试(顺序错误的写法)
# First attempt for index, price in enumerate(alphabet): new_index = shift + index for loop in text: if loop == price: print(alphabet[new_index])
第二次尝试(使用.index()的正确顺序写法)
# Second attempt using .index for letter in text: position = alphabet.index(letter) new_index = position + shift print(alphabet[new_index])
输出结果
第一种代码输出 = hijt
第二种代码输出 = htij
问题原因
第一种写法的循环逻辑完全搞反了:
- 你先遍历整个字母表的每一个字母,再嵌套遍历输入文本的每个字符。
- 只有当字母表中的字母和文本字符匹配时,才会输出移位后的字母。
- 输入文本是"code",字母表的顺序是a→b→c→d→e→...→o→...,所以匹配顺序是先c,再o,再d,最后e,对应输出h、t、i、j,最终拼成
hijt——这个顺序是字母表的匹配顺序,而不是输入文本的字符顺序。
第二种写法是严格按照输入文本的字符顺序遍历:先处理第一个字符c→h,再处理第二个o→t,接着第三个d→i,最后第四个e→j,所以输出htij,完全符合输入的顺序。
额外提醒:两种写法都没处理移位超过26的情况(比如shift=30时会触发索引越界错误),后续可以用new_index = (position + shift) % 26来解决这个问题。
内容的提问来源于stack exchange,提问作者Tayo
相关产品推荐
相关产品推荐

