我正在编写一个函数来将文本移动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中的字符和循环的理解有什么问题。任何帮助表示赞赏。
答案 0 :(得分:2)
你错过了&#34;否则&#34;声明,所以如果第一个如果&#34;火灾&#34; (c
是一个大写字母)然后是&#34; else&#34;从第二个也是&#34;火灾&#34; (并且连接大写字母,因为ord(c)
不在97
和122
之间
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
的大写字符结束,91
和96
之间的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
值。