变量设置为函数调用返回无

时间:2015-09-27 23:16:48

标签: python

我在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编程很新。

谢谢!

1 个答案:

答案 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循环,并将其返回给调用者。