Python:凯撒密码,if语句和else语句同时为真?
我基本上已经解决了这个问题,但不知为什么,第一个“如果”语句和“否则”语句对于任何大写字母的输入都显示为真。也就是说,如果输入的字母的ASCII值在65到90之间,第一个“如果”语句就会返回真,并打印出这个值,但接着“否则”语句也会返回真,并打印出一条信息。如果我在第一个“如果”语句的底部加上“继续”,这个程序就能完美运行。然而,我不知道为什么会这样。你能帮我找出我逻辑上的错误吗?我不明白为什么会这样。以下是我的代码和输出:
k = int(raw_input("Please enter a value for k: ")) #Shifter number
original = raw_input("plaintext: ") #Message user wants ciphered
original_as_array = list(original) ##I am turning the input into an array
for i in range(0,len(original)): ##Now seperating each character to add k
char = original_as_array[i]
charint = ord(char)
if charint >= 65 and charint <=90:
cipher_int = ((charint-65 + k) % 26)+65
code_char = chr(cipher_int)
print code_char,
if charint >= 97 and charint <=122:
cipher_int = ((charint-97 + k) % 26)+97
code_char = chr(cipher_int)
print code_char,
else:
print char,
只有大写字母的示例输出:
Please enter a value for k: 13
plaintext: PLEASE HELP
C P Y L R E N A F S R E U H R E Y L C P
5 个回答
你的问题是需要使用elif(可以参考这个链接:http://docs.python.org/tutorial/controlflow.html)。
else: 这个部分会在字母不是小写的时候执行。
顺便说一下,你不需要把“original”变成一个列表。在Python中,字符串的行为和列表几乎是一样的。
k = int(raw_input("请输入一个k的值: ")) # 移位数字
original = raw_input("明文: ") # 用户想要加密的信息
original_as_array = list(original) ##我把输入的内容变成一个数组
for i in range(0,len(original)): ##现在把每个字符分开以便加上k
char = original_as_array[i]
charint = ord(char)
if charint >= 65 and charint <=90:
cipher_int = ((charint-65 + k) % 26)+65
code_char = chr(cipher_int)
print code_char,
elif charint >= 97 and charint <=122:
cipher_int = ((charint-97 + k) % 26)+97
code_char = chr(cipher_int)
print code_char,
else:
print char,
你还应该学会如何让你的代码更符合Python的风格。
首先要明确:Python中的列表不是数组,它们是列表。这两者是不同的。
你不需要从字符串创建一个列表。Python中的字符串是字符的序列,已经支持直接访问字符:
>>> 'hello'[4]
'o'
不过,你并不需要列表或者直接访问来获取字符串中的字符。你可以,也应该这样遍历:
for char in original:
...
另外,Python中的比较运算符可以并且应该连着用:
if 65 <= charint <= 90:
...
这里有重复的代码。不要重复自己:
def cipher(ch_int, offset, lowest):
return chr((ch_int - lowest + offset) % 26 + lowest)
for char in original:
charint = ord(char)
if 65 <= charint <= 90:
print cipher(charint, k, 65),
elif 97 <= charint <= 122:
print cipher(charint, k, 97),
else:
print char,
你的第一个if语句和else语句没有关系。你想要的是
if charint >= 65 and charint <=90:
cipher_int = ((charint-65 + k) % 26)+65
code_char = chr(cipher_int)
print code_char,
elif charint >= 97 and charint <=122:
cipher_int = ((charint-97 + k) % 26)+97
code_char = chr(cipher_int)
print code_char,
else:
print char,
否则(对于大写字母),第一个条件为真,第二个条件为假,因为这个条件结果是假的,所以就会执行else语句。