在这个程序中还有其他方法可以做其他事吗?

时间:2018-02-05 10:03:42

标签: python

我正在为课堂制作一个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)

1 个答案:

答案 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