<p>我还对您的代码进行了一些改进<br/>
您可以类似地更改<code>encrypt</code>和<code>decrypt</code><br/></p>
<pre class="lang-py prettyprint-override"><code>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()
</code></pre>