另一个python中的凯撒密码

时间:2014-02-21 23:00:14

标签: python

我正在编写一个函数来将文本移动13个空格。转换后的字符需要保留大小写,如果字符不是字母,那么它们应该通过未移位的字符。我写了以下函数:

def rot13(str):
    result = ""
    for c in str:
        if 65 <= ord(c) <= 96:
            result += chr((ord(c) - ord('A') + 13)%26 + ord('A'))
        if 97 <= ord(c) <= 122:
            result += chr((ord(c) - ord('a') + 13)%26 + ord('a'))
        else:
            result += c
    print result

我发现小写字母和非字母字符工作正常。但是,当该函数应用于大写字符时,该函数返回由原始字符替换的已移位字符。我知道在SO上有很多解决这个问题的方法,但是这个特定的错误让我想知道我的逻辑或对python中的字符和循环的理解有什么问题。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

你错过了&#34;否则&#34;声明,所以如果第一个如果&#34;火灾&#34; (c是一个大写字母)然后是&#34; else&#34;从第二个也是&#34;火灾&#34; (并且连接大写字母,因为ord(c)不在97122之间

def rot13(str):
    result = ""
    for c in str:
        if 65 <= ord(c) <= 96:
            result += chr((ord(c) - ord('A') + 13)%26 + ord('A'))
        elif 97 <= ord(c) <= 122:
            result += chr((ord(c) - ord('a') + 13)%26 + ord('a'))
        else:
            result += c
    print result

此外,带有ord('Z')==90的大写字符结束9196之间的ASCII字符是不是字母。函数还应返回值,而不是打印它(除非它被称为print_rot13)。您的函数也不一致 - 您在计算中使用ord('A'),但if(65)中的实际硬编码值应决定一个

def rot13(str):
    a = ord('a')
    z = ord('z')
    A = ord('A')
    Z = ord('Z')
    result = ""
    for c in str:
        symbol = ord(c) 
        if A <= symbol <= Z:
            result += chr((symbol - A + 13)%26 + A)
        elif a <= symbol <= z:
            result += chr((symbol - a + 13)%26 + a)
        else:
            result += symbol
    return result

这种方式只假设大小写字母以一致的块排列,但没有关于它们的实际ord值。