【问题标题】:Looped Module Return (Python 2.7.10)循环模块返回 (Python 2.7.10)
【发布时间】:2016-05-08 02:37:10
【问题描述】:

我偶然发现了一个解决我的问题的方法,但我不太明白它为什么会起作用。作为参考,“用户”是指字典 { 'username' : 1234 },其中“1234”是用户 ID。

第一次尝试:


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' 对象不可迭代

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

但是,为了检查“target”是否为“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 循环不再调用该方法的事实有关,但这并不能解释为什么“打印”语句按预期工作。

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

谢谢。

【问题讨论】:

  • 你的第一次尝试对我有用,你能提到你在哪一行出错
  • 对于另一个问题,您从raw_input 获得的数据类型是字符串,这意味着users[target] 可能永远不会得到您想要的结果,因为{ 1234 : 'username' } 其中1234 是int 或一些。
  • 您的描述没有明确users dict中的键是字符串还是整数;如果它们是整数,那么您需要将target 字符串转换为整数。此外,您在except 块中的递归调用应该是return target_user();但是,正如其他人所提到的,您不需要为此进行递归(并且通常避免递归是一个好主意,除非您确实需要它)。
  • @AlokThakur 感谢您测试我的代码。这是最后一行,实际调用该函数的地方我得到了错误。
  • @Rick 感谢您的回复,我没有遇到过使用字符串和整数数据类型作为单次返回的问题,但我会继续注意它。

标签: python loops return


【解决方案1】:

虽然其他回答者认为递归并不是真正解决您的问题的正确方法,但您得到的实际错误是因为您没有从递归调用中返回值。因此,如果用户曾经键入一个不存在的名称,并且 except 子句调用递归,则返回到顶层的唯一内容是 None,正如错误所说,它是不可迭代的。要解决此问题,只需确保始终返回一个值:

except KeyError:
    print "No such user was listed"

    return target_user()

但是,递归并不是解决这个问题的方法。除此之外,一个非常反常的用户很容易输入废话足够多次以达到最大递归深度,从而导致错误。

【讨论】:

  • 感谢您解释它失败的原因,以及为什么应该避免这种做法。但是,我将继续使用递归,因为此特定代码将仅由大约五个左右的人使用,这种递归方法仅在我们喝咖啡多于睡眠时提供帮助......例如现在。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的回答并提供示例。当我开发一般用途的东西时,我可能会考虑使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 2019-11-12
  • 2018-02-21
  • 1970-01-01
  • 2016-07-12
  • 2019-07-31
  • 2013-10-13
相关资源
最近更新 更多