我正在为课堂制作一个Caesar密码程序,我知道这不是最好的方法,但它确实有效,我的问题是,对于中间的if / else位,是有比在其他部分使用newcode = newcode更好的方法吗?似乎v clunky但我是一个完整的newb,它是我想到的第一种方式
plaintext = input("Input your message here: ")
shift = input("Input cyclic shift here: ")
message = ""
try:
shiftn = int(shift)
except ValueError:
print("Cyclic shift must be a number")
else:
for i in plaintext:
code = ord(i)
if (32<=code<=47) or (58<=code<=64):
newl = chr(code)
message = message + newl
elif (65<=code<=90):
newcode = code + shiftn
if newcode > 90:
newcode = 64 + (newcode - 90)
else:
newcode=newcode
newl = chr(newcode)
message = message + newl
elif (97<=code<=122):
newcode = code + shiftn
if newcode > 122:
newcode = 96 + (newcode - 122)
else:
newcode = newcode
newl = chr(newcode)
message = message + newl
elif (48<=code<=57):
newcode = code + shiftn
if newcode > 57:
newcode = 47 + (newcode - 57)
else:
newcode = newcode
newl = chr(newcode)
message = message + newl
print("your encrypted message is: ", message)
答案 0 :(得分:3)
由于代码对于所有不同的范围是相同的,您可以将它们放在列表中并循环遍历列表,在第一次匹配后中断。此外,else
也是多余的,chr(ord(i))
也是如此。
for i in plaintext:
code = ord(i)
if (32 <= code <= 47) or (58 <= code <= 64):
message += i
else:
for low, high in [(64, 90), (96, 122), (47, 57)]:
if low < code <= high:
newcode = code + shiftn
if newcode > high:
newcode = low + (newcode - high)
message += chr(newcode)
break
此外,您可以在这里重新发明模%
,也可以像这样计算newcode
(不确定这是否更简单):
newcode = (code + shiftn - low) % (high - low) + low