【问题标题】:Python 3.x - Input only returns first itemPython 3.x - 输入仅返回第一项
【发布时间】:2015-12-06 20:00:22
【问题描述】:

我在一个小项目中遇到了一段代码问题,我似乎无法修复它。

在下面的代码中,我定义了 inputrace() 以便执行一个过程,其中玩家输入大于 0 且小于 13 的数字(有 12 个选项,每个选项由一个数字指示);它还检查空行和字符串,并让程序状态出现错误,如果检测到它们,则再次要求用户输入。如果它通过了检查,则返回 RaceInp 并将其设置为 RaceChoice,这允许它下面的代码根据玩家的选择将 Race 分配给玩家。

#race check
def inputrace():
    print ("Input number")
    RaceInp = input()
    Check = RaceInp
    try:
        int(RaceInp)
    except ValueError:
        print("Numbers only!")
        inputrace()
    if not int(Check)>12 or int(Check)<1:
            return RaceInp
            print (RaceInp) #this is here so I can check the value returned
Race = "NA"
RaceChoice = inputrace()
print (RaceChoice)
#assign race
if RaceChoice == "1":
    Race = "Human"
#continues down to twelve

当输入有效字符串(任何数字 1-12)时,一切正常,但当我故意输入无效字符串时,一切都会中断。似乎 RaceInp 仅保留第一个用户输入并且不会更改,即使在从错误中调用该函数之后也是如此。这意味着如果我输入“a”,程序会告诉我这是错误的并再次询问。但是,当我输入“1”以尝试更正它时,它接受它但仍将 RaceInp 保持为“a”。 有什么解决办法吗?我不知道发生了什么。

感谢您的帮助,如果我的问题有任何问题,我深表歉意!

【问题讨论】:

  • return 声明后你不应该有任何东西......
  • 您应该在 except 块内 return inputrace() 以使递归按预期运行。

标签: python python-3.x input user-input


【解决方案1】:

似乎问题在于您将inputrace 放在递归而不是循环中。像这样的东西可能会更好:

def input_race():
    while True:
        print("Input a number between 1 and 12.")
        race_input = input()

        try:
            race_input = int(race_input)

            if race_input >= 1 and race_input <= 12:
                return race_input

        except ValueError:
            pass

        print ("'{input}' is not a number.".format(input=race_input))


race = "NA"
race_choice = input_race()

if race_choice == 1:
    race = "Human"

print(race)

【讨论】:

  • 正如 schwobaseggl 所说,递归的问题是在需要的地方省略了“返回”,而不是(尾)递归本身。但是由于该过程会丢弃所有无效条目直到有效条目,我同意这里循环更好。
  • 您对 return 声明是正确的。我应该抓住它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
相关资源
最近更新 更多