你有麻烦了。如果您的字符在字母表的后半部分,它将是空的,因为i+13将偏离末尾。有几种方法可以修复它。在
最简单的方法是简单地将字母表字符串加倍(字面意思是:alph = alph * 2)。这意味着您最多可以访问52个值,而不仅仅是26个值。不过,这是一个相当粗糙的解决方案,最好是修复索引。在
一个更好的选择是从索引中减去13,而不是加上13。Rot13是对称的,因此两者都有相同的效果,并且它可以工作,因为负索引在Python中是合法的(它们指从末尾向后计数的位置)。在
不管是哪种情况,实际上根本没有必要做切片。您只需获取一个值(与C不同,Python中没有char类型,因此单个字符也是字符串)。如果只做这个更改,那么它可能会清楚地说明当前代码失败的原因,因为尝试从字符串末尾访问单个值会引发异常。在
编辑:实际上,在考虑了什么是真正最好的解决方案之后,我倾向于建议完全避免基于索引的数学解决方案。一个更好的方法是使用Python的奇妙字典来完成从原始字符到加密字符的映射。您可以创建并使用这样的Rot13字典:alph="abcdefghijklmnopqrstuvwxyz"
rot13_table = dict(zip(alph, alph[13:]+alph[:13])) # lowercase character mappings
rot13_table.update((c.upper(),rot13_table[c].upper()) for c in alph) # upppercase
def rot13(s):
return "".join(rot13_table.get(c, c) for c in s) # non-letters are ignored