【问题标题】:variable set to function call returns None设置为函数调用的变量返回无
【发布时间】:2015-09-27 23:16:47
【问题描述】:

我正在用 python 做一个简单的停止者密码程序,这个概念让我困惑了很长时间。

我所做的是向用户询问 raw_input 以确定密码的消息和密钥,如下所示:

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()

这会收集消息和密钥,并传递给 translate_message 以进行实际加密。

这是我的 get_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

我想验证输入以确保用户输入正确的值。如果根据validate_message判断值不正确,则再次调用get_message,否则get_message返回原值。

这里是 validate_message:

def validate_message(message):
    if not re.match(r'^[A-Za-z]+$', message):
        return False
    return True

只是一个简单的检查(我喜欢我的函数做一件事)

通常,这运行良好,并且键和消息值会像正常一样返回。当我故意输入不正确的值来测试我的验证时,就会出现问题。

这是 translate_message 返回的没有错误值的内容(它只返回两个值):

'test_message', 22

当我输入不正确的值时,就会出现混乱。假设我输入 3333(由于值不正确,会调用 get_message()),直到用户输入正确的输入。如果用户在成功输入值之前输入了任何类型的错误值,则 translate_message 将返回 None

None, 22

在 get_message() 函数中,我在返回值之前添加了一个打印语句,它按预期打印出正确的值。那为什么是

key = get_key()

等于无?我查看了 get_message() 中的逻辑,当它应该返回用户正确的猜测时,我看不到返回值等于 None 的位置。

感谢任何帮助,如果有更好的方法来实现这种类型的逻辑,我想知道!我对 python 编程相当陌生。

谢谢!

【问题讨论】:

    标签: python


    【解决方案1】:

    由于您的return 被隐藏在if 语句的else 子句中,因此执行从函数的底部掉了下来,当这种情况发生时,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 循环,并将其返回给调用者。

    【讨论】:

    • 我知道这与递归调用有关。我的程序运行正常,谢谢!
    猜你喜欢
    • 2016-11-25
    • 2022-01-22
    • 2021-01-10
    • 2018-10-10
    • 2017-01-25
    • 1970-01-01
    • 2012-10-18
    • 2022-01-14
    • 2023-04-09
    相关资源
    最近更新 更多