【问题标题】:My Python function 'loops' for no reason我的 Python 函数无缘无故地“循环”
【发布时间】:2016-12-04 21:57:32
【问题描述】:

我正在编写一个 Python 函数来收集用户输入,然后将其作为字典返回。 输入应该符合某些标准,所以我会检查它,如果它没有检查出来,我会要求用户再次提供他的输入。 这是我的代码:

def getIDs(stageid=0):
    if stageid == 0:
        stageid = input("Please supply stageID: ")
        if (len(stageid) < 4 or len(stageid) > 5) or not stageid.isdigit():
            print("Wrong stageID, try again.")
            getIDs()
    raceid = input("Please supply the raceID: ")
    if (len(raceid) < 1 or len(raceid) > 3) or not raceid.isdigit():
        print("Wrong raceID, try again.")
        getIDs(stageid)
    else:
        # print(stageid)
        return {"stageid": stageid, "raceid": raceid}

我所做的是让函数在 stageid 不正确时调用自身,但我不希望用户在 raceid 不正确时必须再次重新输入 stageid,所以如果 raceid 不正确,我以stageid为参数调用函数。 但是,我的问题是,如果我多次弄错 stageid,然后将其正确并继续进行 raceid,它会要求我输入 stageid 的次数。我不知道为什么。注释打印函数以相反的顺序打印所有提供的 stageid,最后,返回值包含最初提供的(错误的)stageid 和 raceid。

有人知道为什么 Python 会循环遍历所有值吗?

瓦西里

【问题讨论】:

  • 你的缩进被破坏了,请修复它。
  • 答案是该函数不会“重新启动”,它只是将自身称为递归函数。完成后,它将继续从 getIDs() 调用执行。这可以修复,但这种方法对于 python 来说是非常不合适的。
  • 在这种情况下使用递归几乎会让您头疼,但您应该知道,如果您不使用return getIDs(),您最外层的getID 调用将返回None
  • @ettanany 我建议不要在问题中编辑 python 空格。我知道在这种情况下这可能是正确的,因为 OP 没有抱怨缩进错误,但仍然值得谨慎。
  • @AndrasDeak 我同意你的观点,当 OP 抱怨缩进时,我们不应该编辑代码,但在这种情况下,我认为很清楚。

标签: python function python-3.x loops


【解决方案1】:

只需在调用递归函数时添加一个 return 语句,这样终止将从该实例中退出。

def getIDs(stageid=0):
    if stageid == 0:
        stageid = input("Please supply stageID: ")
        if (len(stageid) < 4 or len(stageid) > 5) or not stageid.isdigit():
            print("Wrong stageID, try again.")
            return getIDs()
    raceid = input("Please supply the raceID: ")
    if (len(raceid) < 1 or len(raceid) > 3) or not raceid.isdigit():
        print("Wrong raceID, try again.")
        return getIDs(stageid)
    else:
        # print(stageid)
        return {"stageid": stageid, "raceid": raceid}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多