我制作凯撒密码,一切都是我想要的,但是当我进入验证时,如果我进入' 123'它输出'您的翻译文本是:123' 当我希望它返回到getMessage()并告诉用户输入无效时。非常感谢帮助,因为我几天都在苦苦挣扎。
提前致谢。
def getMode():
while True:
mode = input('Do you wish to encrypt(e) or decrypt(d) a message: ').lower()
if mode in 'encrypt e decrypt d'.split():
return mode
else:
print('Enter either "encrypt" or "e" or "decrypt" or "d".')
def getMessage():
message = input('Enter your message: ')
return message
def getKey():
key = 0
while True:
key = 5
return key
def getTranslatedMessage(mode, message, key):
if mode[0] == 'd':
key = -key
translated = ''
for symbol in message:
if symbol.isalpha():
num = ord(symbol)
num += key
if symbol.isupper():
if num > ord('Z'):
num -= 26
elif num < ord('A'):
num += 26
elif symbol.islower():
if num > ord('z'):
num -= 26
elif num < ord('a'):
num += 26
translated += chr(num)
else:
translated += symbol
return translated
mode = getMode()
message = getMessage()
key = getKey()
print('Your translated text is: ', getTranslatedMessage(mode, message, key))
答案 0 :(得分:3)
如果您只想允许字母字符:
def getMessage():
while True:
message = input('Enter your message: ')
if message.isalpha():
return message
print("Invalid input, text must contain alphabetic characters only.")
允许空格和字母:
if all(ch.isalpha() or ch.isspace() for ch in message):
return message
dict和使用modulo将是一个更简洁的方法:
def get_mode():
while True:
mode = input('Do you wish to encrypt(e) or decrypt(d) a message: ').lower()
if mode.lower() in {"e","d"}:
return mode
print('Enter either "encrypt" or "e" or "decrypt" or "d".')
def get_message():
while True:
message = input('Enter your message: ')
if all(ch.isalpha() or ch.isspace() for ch in message):
return message
print("Invalid input, text must contain alphabetic characters only.")
def get_key():
return 5
from string import ascii_letters
d = {k: i for i, k in enumerate(ascii_letters)}
enc = ascii_letters
def get_translated_message(mode, message, key):
if mode == "e":
return "".join([enc[(d[ch] + key) % 52] if not ch.isspace() else ch for ch in message])
return "".join([enc[(d[ch] - key) % 52] if not ch.isspace() else ch for ch in message])
以同样的方式运行它:
mode = get_mode()
message = get_message()
key = get_key()
print('Your translated text is: ', get_translated_message(mode, message, key))
答案 1 :(得分:2)
您提到如果用户输入类似&#39; 123&#39;之类的内容,您希望返回错误。根据该要求,您的代码中的问题就在这里:
你正在做这个检查:
if symbol.isalpha():
将检查某些内容是否为alpha:A-Z
因此,在您的其他地方,您希望在alpha检查失败时返回错误:
所以当你这样做时:
else:
translated += symbol
你想要这个:
else:
return "input invalid"
然而,再一次,专注于您的代码,这带来了另一个问题。您需要更改处理方法返回的方式,因此输出更有意义。你可能想要考虑这样的事情:
mode = getMode()
message = getMessage()
key = getKey()
result = getTranslatedMessage(mode, message, key)
if not result:
print("invalid")
else:
print('Your translated text is: ', result)
根据最近的更新,您希望保留空白。因此,您应该考虑更改代码以处理空白,只需添加elif
条件即可检查空格并将' '
添加到translated
变量中。因此,for循环中的代码将如下所示:
for symbol in message:
if symbol.isalpha():
num = ord(symbol)
num += key
if symbol.isupper():
if num > ord('Z'):
num -= 26
elif num < ord('A'):
num += 26
elif symbol.islower():
if num > ord('z'):
num -= 26
elif num < ord('a'):
num += 26
translated += chr(num)
elif symbol.isspace():
translated += ' '
else:
return False
但是Padraic的方法非常好,绝对值得考虑重构。