循环模块返回(Python 2.7.10)

时间:2016-01-30 09:32:23

标签: python loops return

我偶然发现了解决问题的方法,但我不太明白为什么会这样。供参考,"用户"是指字典{'用户名' :1234}其中" 1234"是用户名。

首次尝试:


users = users_found()


def target_user():
    for key in users.keys():
        print key

    target = raw_input("Which user do you want to target? ").lower()

    try:
        print users[target], target

        return users[target], target

    except KeyError:
        print "No such user was listed"

        target_user()


target, username = target_user()

以上不起作用,反对我更好的理解并返回

  

TypeError:' NoneType'对象不可迭代

引用变量赋值的最后一行。

然而,要检查是否'目标'是一个' NoneType'我插入了print语句,这显示了我期望的值,即使进行的返回似乎在使用相同的变量在其他地方查找。

所以自然(真的不知道为什么)我尝试了一个while循环。

第二次尝试:


users = users_found()

def target_user():
    for key in users.keys():
        print key

    target = raw_input("Which user do you want to target? ").lower()

    while target not in users.keys():
        print "No such user was listed"

        for key in users.keys():
            print key

        target = raw_input("Which user do you want to target? ").lower()

    return users[target], target


target, username = target_user()

这样可以并返回两个值。

我假设它与while循环不再调用该方法的事实有关,但这并不能解释为什么" print"声明按预期工作。

如果有人能在这里阐明我的不合逻辑,我会非常感激。

谢谢。

2 个答案:

答案 0 :(得分:2)

虽然其他的回答是正确的,递归并不是解决问题的正确方法,但是你得到的实际错误是因为你没有从递归调用中返回值。因此,如果用户输入了一个不存在的名称,并且except子句调用了递归,则唯一返回到顶级的是None,因为错误说不可迭代。要解决此问题,请确保始终返回值:

except KeyError:
    print "No such user was listed"

    return target_user()

但是,再次,递归不是解决这个问题的方法。除了其他任何东西,一个真正有悖常理的用户可以很容易地输入无意义的时间来达到最大递归深度,从而导致错误。

答案 1 :(得分:1)

您在第一个版本中的错误是您尝试在函数内再次调用该函数,这是递归并且不适用于您的问题。尝试修改它以处理函数外的异常:

users = users_found()

def target_user():
    for key in users.keys():
        print key

    target = raw_input("Which user do you want to target? ").lower()

    try:
        print users[target], target
        return users[target], target
    except KeyError:
        print "No such user was listed"
        return None, None


target, username = None, None
while target is None:
    target, username = target_user()