如何使python同时接受大写和小写字母

2024-10-06 11:55:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我和我的朋友已经有一段时间像这样的“加密”对话了。程序的目标是获取加密消息并使其成为任何人都可以阅读的消息,反之亦然。 然而,如果我使用大写字母,它不会改变它们。 我怎么修理它

VOWELS = ["a", "e", "i", "o", "u"]
CONSONANTS = ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z"]

def encrypt(message: str):
    encryptedMessage = ""
    for letter in message:
        
        if letter in VOWELS:
            newIndex = VOWELS.index(letter) + 1
            if newIndex >= len(VOWELS):
                newIndex = 0
            encryptedMessage += VOWELS[newIndex]

        elif letter in CONSONANTS:
            newIndex = CONSONANTS.index(letter) + 1
            if newIndex >= len(CONSONANTS):
                newIndex = 0
            encryptedMessage += CONSONANTS[newIndex]

        else:
            encryptedMessage += letter

    return encryptedMessage

def decrypt(message: str):
    decryptedMessage = ""
    for letter in message:
        if letter in VOWELS:
            newIndex = VOWELS.index(letter) - 1
            if newIndex >= len(VOWELS):
                newIndex = 0
            decryptedMessage += VOWELS[newIndex]

        elif letter in CONSONANTS:
            newIndex = CONSONANTS.index(letter) - 1
            if newIndex >= len(CONSONANTS):
                newIndex = 0
            decryptedMessage += CONSONANTS[newIndex]

        else:
            decryptedMessage += letter

    return decryptedMessage
    
def better_encryption(message: str, is_encrypt: bool):

    newMessage = ""
    ed = 1 if is_encrypt else -1
    
    for letter in message:
        if letter in VOWELS:
            newIndex = VOWELS.index(letter) + ed 
            if newIndex >= len(VOWELS):
                newIndex = 0
            newMessage += VOWELS[newIndex]

        elif letter in CONSONANTS:
            newIndex = CONSONANTS.index(letter) + ed
            if newIndex >= len(CONSONANTS):
                newIndex = 0
            newMessage += CONSONANTS[newIndex]

        else:
            newMessage += letter

    return newMessage    

def main():

    while True:
        command = str(input("[E]ncrypt or [D]ecrypt? "))

        if "E" in command.upper() :
            print(better_encryption(input("Message: "), True))

        elif "D" in command.upper() :
            print(better_encryption(input("Message: "), False))

        else:
            print("Invalid")

Tags: inmessageindexlenifdefelseletter
2条回答

我还对您的代码进行了一些改进
您可以类似地更改encryptdecrypt

VOWELS = [ord(c.upper()) for c in ["a", "e", "i", "o", "u"]]
CONSONANTS = [ord(c.upper()) for c in ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z"]]
# save letters' UPPER_CASE corresponding ascii number

LOWER_CONST = 0x20
UPPER_MASK  = 0xff ^ LOWER_CONST
# we assume all strings are ascii
# in ascii, UPPER_CASE English letters are ORed with 0x20 (32)
# to produce lower_case letters

def better_encryption(message: str, is_encrypt: bool):
    newMessage = ""
    ed = 1 if is_encrypt else -1
    
    for letter in message:
        res = None

        letter = ord(letter) # convert letter to corresponding ascii number
        case = letter & LOWER_CONST # we save letter's sixth bit
        letter &= UPPER_MASK # we set letter's sixth bit to zero, while keeping the other seven bits unchanged

        if letter in VOWELS:
            newIndex = (VOWELS.index(letter) + ed) % len(VOWELS) # mod operation handles cyclic shift
            res = VOWELS[newIndex]

        elif letter in CONSONANTS:
            newIndex = (CONSONANTS.index(letter) + ed) % len(CONSONANTS) # mod operation handles cyclic shift
            res = CONSONANTS[newIndex]

        else:
            res = letter # keep the letter unchanged
        
        res |= case # restore letter's sixth bit
        newMessage += chr(res) # convert res from number to corresponding ascii letter

    return newMessage    

def main():
    while True:
        command = input("[E]ncrypt or [D]ecrypt? ")

        if len(command) == 0: # if user inputs empty string, we may not access the first character
            continue
        
        if command[0].upper() == 'E':
            print(better_encryption(input("Message: "), True)) #encrypt the message

        elif command[0].upper() == 'D':
            print(better_encryption(input("Message: "), False)) #decrypt the message

        else:
            print("Invalid Command")

if __name__ == "__main__":
    main()

在适当的地方使用一个简单的letter = letter.lower()应该可以实现您想要的功能:

VOWELS = ["a", "e", "i", "o", "u"]
CONSONANTS = ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z"]

def encrypt(message: str):
    encryptedMessage = ""
    for letter in message:
        letter = letter.lower()
        if letter in VOWELS:
            newIndex = VOWELS.index(letter) + 1
            if newIndex >= len(VOWELS):
                newIndex = 0
            encryptedMessage += VOWELS[newIndex]

        elif letter in CONSONANTS:
            newIndex = CONSONANTS.index(letter) + 1
            if newIndex >= len(CONSONANTS):
                newIndex = 0
            encryptedMessage += CONSONANTS[newIndex]

        else:
            encryptedMessage += letter

    return encryptedMessage

def decrypt(message: str):
    decryptedMessage = ""
    for letter in message:
        letter = letter.lower()
        if letter in VOWELS:
            newIndex = VOWELS.index(letter) - 1
            if newIndex >= len(VOWELS):
                newIndex = 0
            decryptedMessage += VOWELS[newIndex]

        elif letter in CONSONANTS:
            newIndex = CONSONANTS.index(letter) - 1
            if newIndex >= len(CONSONANTS):
                newIndex = 0
            decryptedMessage += CONSONANTS[newIndex]

        else:
            decryptedMessage += letter

    return decryptedMessage
    
def better_encryption(message: str, is_encrypt: bool):

    newMessage = ""
    ed = 1 if is_encrypt else -1
    
    for letter in message:
        letter = letter.lower()
        if letter in VOWELS:
            newIndex = VOWELS.index(letter) + ed 
            if newIndex >= len(VOWELS):
                newIndex = 0
            newMessage += VOWELS[newIndex]

        elif letter in CONSONANTS:
            newIndex = CONSONANTS.index(letter) + ed
            if newIndex >= len(CONSONANTS):
                newIndex = 0
            newMessage += CONSONANTS[newIndex]

        else:
            newMessage += letter

    return newMessage    

def main():

    while True:
        command = str(input("[E]ncrypt or [D]ecrypt? "))

        if "E" in command.upper() :
            print(better_encryption(input("Message: "), True))

        elif "D" in command.upper() :
            print(better_encryption(input("Message: "), False))

        else:
            print("Invalid")

相关问题 更多 >