我在python中制作一个简单的ceaser cipher程序,这个概念让我困惑了很长一段时间。
我所做的是要求用户使用raw_input来确定密码的消息和密钥,如下所示:
<div class="img-header"></div>
收集消息和密钥,并传入translate_message进行实际加密。
这是我的get_message函数:
def user_input():
ask_user = raw_input("Do you want to encrypt or decrypt a message?")
if ask_user in "encrypt e".split():
message = get_message()
key = get_key()
translate_message(message, key)
else:
print 'Type encrypt or e for encryption, or decrypt or d doe decryption'
user_input()
我想验证输入以确保用户输入正确的值。如果根据validate_message值不正确,则会再次调用get_message,否则get_message将返回原始值。
这里有validate_message:
def get_message():
get_user_message = raw_input('enter in your message\n')
vm = validate_message(get_user_message)
if not vm:
print 'Please enter a valid message'
get_message()
else:
print get_user_message
return get_user_message
只是一个简单的检查(我喜欢我的功能做一件事)
通常情况下,运行正常,关键&amp;消息值像正常一样返回。当我故意输入不正确的值来测试我的验证时,会出现问题。
这里是translate_message在没有错误值的情况下返回的内容(它只返回两个值):
def validate_message(message):
if not re.match(r'^[A-Za-z]+$', message):
return False
return True
当我输入错误的值时会出现混淆。假设我输入3333(由于值不正确将调用get_message()),直到用户输入正确的输入。如果用户在成功输入值
之前输入任何类型的错误值,translate_message将返回None'test_message', 22
在get_message()函数中,我在返回值之前添加一个print语句,它会按预期打印出正确的值。那么为什么
key = get_key()
等于无?我在get_message()中查看了逻辑,当它返回用户正确的猜测时,我无法看到返回值等于None的位置。
感谢任何帮助,如果有更好的方法来实现这种逻辑,我想知道!我对python编程很新。
谢谢!
答案 0 :(得分:2)
由于您的return
被隐藏在else
语句的if
子句中,执行从函数的底部掉了下来,而Python默认返回None
发生的情况。
对get_message()
的递归调用不会返回原始调用者(本例中为user_input
函数),除非您实际使用语句return get_message()
从递归调用返回值。
但是,您可能需要考虑循环而不是递归;当使用递归进行输入验证时,敲打键盘的猴子最终会导致堆栈溢出。以下是此迭代版本的示例:
def get_message():
while 1:
get_user_message = raw_input('enter in your message\n')
vm = validate_message(get_user_message)
if not vm:
print 'Please enter a valid message'
else:
print get_user_message
return get_user_message
只要您拥有有效数据,return
就会突破while
循环,并将其返回给调用者。