python中的凯撒密码大写字母

时间:2018-09-11 22:05:34

标签: python caesar-cipher

我正在尝试对Caesar Cypher进行编码,但仅适用于小写字母,并且正在尝试将其打印回原始大写字母。

def encrypt(message, key):
    alphabet_lower = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
    if type(message) == str and type(key) == int:
        Letters = message.lower()
        LowerLetters = list(Letters)
        BacktoStr = []
        for i in LowerLetters:
            if i.strip() and i in alphabet_lower:
                BacktoStr.append(alphabet_lower[(alphabet_lower.index(i) + key) % 26])
            else:
                BacktoStr.append(i)
        FinalEncrypt = "".join(BacktoStr)
        return(FinalEncrypt)

    else:
        return("Invalid Input")

例如,当我运行代码时:encrypt("Hello world",12)

我得到正确的输出,但是它是小写的。 'tqxxa iadxp'

返回输出时,如何使大写字母保持大写?使用python 3.7.0

1 个答案:

答案 0 :(得分:0)

您不想立即将整个消息小写,否则您会在循环中丢失大写信息。 (可以解决它,但是它需要另一个循环或更改迭代方式。)

有两种基本策略:

  1. 请勿让alphabet_lower处理大写字母。制作一个alphabet_upper,然后将它们与i对照。
  2. 更改字母后,检查原始字母是否为大写。如果是这样,请将新字母大写。

alphabet_lower的改进:

  1. 每次调用该函数时,您都会创建alphabet_lower。您可以改为将其设为全局变量,以便仅创建一次。
  2. 由于仅使用alphabet_lower来检查其中是否包含字符,因此可以使用字符串代替列表:'abcdefghijklmnopqrstuvwxyz'。它可能会或可能不会更快,但是它当然更容易阅读,并且现在更重要。 (您稍后将学习,如果您想检查某事物是否在一大堆事物中,那么setdict 会更有效。)< / li>
  3. 您可以import string并使用string.ascii_lowercase来代替构建自己的小写字母列表。
  4. 要获取字母的索引,可以执行chr(letter) - chr('a')chr(letter) - chr('A'),具体取决于字母是大写还是小写。
  5. 您可以检查i.lower() != i.upper()而不是列出字母。非字母不会大写或小写,因此请i.lower() == i.upper()
  6. 最后,这是一种简单易读的字母检查方法:if 'a' <= i <= 'z':

请注意:这些方法采用ASCII。如果您的输入内容可能包含通用Unicode(例如“á”),则必须了解这些方法是否按照您的预期做。

测试每种方法的小片段,以确保您了解每个部分的作用。

其他改进:

  1. Python字符串是可迭代的,因此您无需将它们转换为列表。 for i in Letters同样适用。
  2. 您不需要测试if i.strip(),因为i将始终是单个字符(同样,假定是ASCII)。
  3. return不是函数。写return x,而不是return(x)
  4. 在Python中,大写Letters之类的名称通常用于类,而不是常规对象。 Here's Python's semi-official style guide.