【问题标题】:Python: Function always returning zero from loopPython:函数总是从循环中返回零
【发布时间】:2020-01-07 18:15:06
【问题描述】:

我正在编写一个函数来查看用户的输入是否在列表中,如果是,则用户输入被删除,并要求他们再次猜测,直到他们退出。

我想计算正确猜测的数量并在调用函数后打印它,出于某种原因,无论正确猜测的数量如何,它都会打印为零。我做错了什么? (代码和示例如下)

# [ ] Complete Foot Bones Quiz
foot_bones = ["calcaneus", "talus", "cuboid", "navicular", "lateral cuneiform","intermediate cuneiform", "medial cuneiform"]
guess =''
already_guessed = []

def foot_bone_quiz(guess, foot_bones):

    correct_guess = 0

    while True:

        guess = input("Guess a foot bone, enter q to quit. ")


        if guess.lower() in already_guessed:
            print("You already guessed that!")


        elif guess != 'q':

            for bone in foot_bones:

                if bone.lower() == guess.lower():
                    correct_guess = correct_guess + 1
                    print("Yes", guess, "is a bone in the foot!")
                    already_guessed.append(guess.lower())
                    foot_bones.remove(guess.lower())


                else:
                    pass


        elif guess == 'q':
            print('finished')
            break

        else:
            print("Invalid Entry")


    return already_guessed, correct_guess            

foot_bone_quiz(guess, foot_bones)
print("You had", correct_guess, "correct guesses. You guessed: ", already_guessed)

示例输出:

Guess a foot bone, enter q to quit. navicular

Yes navicular is a bone in the foot!

Guess a foot bone, enter q to quit. talus

Yes talus is a bone in the foot!

Guess a foot bone, enter q to quit. q
finished

You had 0 correct guesses. You guessed:  ['navicular', 'talus']

【问题讨论】:

    标签: python function while-loop


    【解决方案1】:

    您似乎没有保存从方法 foot_bone_quiz 返回的 correct_guess

    尝试以下方法:

    already_guessed, correct_guess = foot_bone_quiz(guess, foot_bones)
    print("You had", correct_guess, "correct guesses. You guessed: ", already_guessed)
    

    already_guessed 打印正确,因为它是在 foot_bone_quiz 方法之外初始化的。

    【讨论】:

      【解决方案2】:

      在实际运行您的代码时,我得到了这个输出

      Guess a foot bone, enter q to quit. navicular
      Yes navicular is a bone in the foot!
      Guess a foot bone, enter q to quit. talus
      Yes talus is a bone in the foot!
      Guess a foot bone, enter q to quit. q
      finished
      Traceback (most recent call last):
        File "F:\Documents\Python\stack.py", line 45, in <module>
          print("You had", correct_guess, "correct guesses. You guessed: ", already_guessed)
      NameError: name 'correct_guess' is not defined
      

      正如预期的那样,名称correct_guess 从未在foot_bone_quiz 函数范围之外定义。看来您可能不熟悉 variable scope in python 以及返回值的工作原理

      您的测验函数返回 2 个值,但在最后一行的第 2 行调用该函数时,您从不使用这些返回值。此外,already_guessed 变量无论如何都是在函数之外定义的,因此返回它有点多余。最后,您的测验函数采用的 guess 参数是完全多余的,因为您在读取最初传递的内容之前将其值重新分配给输入。

      以下是对您的程序的一些建议更改:

      • 从程序顶部删除 already_guessed =guess = 分配。
      • 从您的测验函数中删除 guess 参数
      • already_guessed = []赋值放在最开始的测验函数中
      • 在最后调用测验方法时,将结果值分配给变量,然后在打印中使用 (already_guessed, correct_guess = foot_bone_quiz(foot_bones))。请注意,guess 参数已如前所述被删除

      这是我在这些更改后得到的输出

      Guess a foot bone, enter q to quit. navicular
      Yes navicular is a bone in the foot!
      Guess a foot bone, enter q to quit. talus
      Yes talus is a bone in the foot!
      Guess a foot bone, enter q to quit. q
      finished
      You had 2 correct guesses. You guessed:  ['navicular', 'talus']
      

      【讨论】:

      • 谢谢,我通读了你的链接并回顾了我的课程笔记,你是对的,我误解了函数参数/参数的使用。我尝试了你所有的观点,但不明白为什么第 4 点有效,所以我使用第 1-3 点并将正确的猜想作为局部变量,但将 print 语句移动到函数内并获得所需的输出!继续阅读函数,看看我是否能在第 4 点上找到答案,
      • @dnaylor93 在 python 函数中返回一个值时,该值随后会被传递,以便可以在任何可以调用该函数的地方使用它。我对您的程序的更正是假设测验函数应该简单地返回测验结果,然后实际负责打印该信息的代码将是单独的(程序的最后一行)。您最终所做的有点不同,测验功能负责获取测验结果打印它们。在这个小程序中,两个选择的结果是一样的,但是是一个选择
      【解决方案3】:
      foot_bones = ["calcaneus", "talus", "cuboid", "navicular", "lateral cuneiform",
                "intermediate cuneiform", "medial cuneiform"]
      correct_guess = 0
      already_guessed = []
      
      
      def foot_bone_quiz(foot_bones1):
          global correct_guess
          global already_guessed
          already_guessed = []
          correct_guess = 0
          while True:
              guess1 = input("Guess a foot bone, enter q to quit. ")
              if guess1.lower() in already_guessed:
                  print("You already guessed that!")
              elif guess1 != 'q':
                  for bone in foot_bones1:
                      if bone.lower() == guess1.lower():
                          correct_guess += 1
                          print("Yes", guess1, "is a bone in the foot!")
                          already_guessed.append(guess1.lower())
                          foot_bones1.remove(guess1.lower())
      
                      else:
                          pass
              elif guess1 == 'q':
                  print('finished')
                  break
      
              else:
                  print("Invalid Entry")
          return already_guessed, correct_guess
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-25
        • 2021-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-20
        • 1970-01-01
        相关资源
        最近更新 更多