在Python中,每当我尝试将字符串输入与字符串变量进行比较时,它都不会起作用

2024-06-08 17:29:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,目前正在尝试制作石头、布、剪刀来更好地学习Python语言。一、 但是,我在询问用户选择时遇到问题。这是正在起作用的函数

def askUser():
    global userAnswerINTEGER
    global userAnswer
    global rock
    global paper
    global scissors
    userAnswer = input("Rock, Paper, or Scissors? ")
    print(userAnswer)
    userAnswer = 0
    if userAnswer == (rock):
         userAnswerINTEGER = 1
         results()
    if userAnswer == (paper):
        userAnswerINTEGER = 2
        results()
    if userAnswer == (scissors):
        userAnswerINTEGER = 3
        results()
    if userAnswer != rock or paper or scissors:
        print('Please, pick a valid answer choice.')
        askUser()

我在文件中有其他变量

rock = "Rock"
paper = "Paper"
scissors = "Scissors"
userAnswer = 0

但是,无论我在提示符中输入什么,它都会打印“请,选择一个有效的答案选项”。我如何解决这个问题


Tags: orifglobalresultspaperprintscissorsrock
3条回答

您可以使用Enum

import enum

class Game(enum.Enum):
    Rock=1
    Paper=2
    Scissors=3
    
    @staticmethod
    def play():
        userAnswer = input("Rock, Paper, or Scissors?")
        if userAnswer not in [e.name for e in Game]:
            print("Please, pick a valid answer choice.")
        else:
            for e in Game:
                if e.name == userAnswer:
                    print(e.value)
            
        Game.play()

Game.play()

代码中有两个问题共同导致此问题

第一个问题是,当您找到匹配项时,您并没有结束当前函数调用,而是调用其他函数。当该函数(最终)返回时,调用它的函数将继续运行。由于所有的if条件都是相互独立的,因此在调用的函数返回后,您将测试所有其他条件

这就是另一个问题。错误值的条件写入错误。您有if userAnswer != rock or paper or scissors:,我认为您的意思是“如果userAnswer不是石头、布或剪刀”,但Python对此的解释不同。您的条件等价于if (userAnswer != rock) or (paper) or (scissors)。也就是说,后两个变量没有与userAnswer进行比较,而是直接测试“真实性”。Python只在字符串为空时才将其视为“false”,因此"Paper""Scissors"都为true,因此该条件始终满足

有多种方法可以解决此问题。我建议通过使用ifelifelse使您的所有条件成为一个更大的复合语句的一部分,来解决上述问题。这使您可以消除不可识别输入的条件,因为您已经排除了语句前面的所有有效输入:

if userAnswer == rock:
    ...
elif userAnswer == paper:
    ...
elif userAnswer == scissors:
    ...
else:
    print('Please, pick a valid answer choice.')

我还建议您使用循环,而不是递归函数调用来进行流控制。将上面的整个块(以及它上面的输入提示)放入while True循环中,然后从整个函数中return或者从循环中break生成成功的匹配案例(即ifelif块)(如果您仍然有所有这些都通用的东西要做的话)。只有坏值会继续循环,而且它们可以无限期地循环

你认为userAnswer = 0对你刚才键入的号码有什么影响

更好的办法是:

answers = { 'Rock': 1, 'Paper': 2, 'Scissors': 3 }
...
while 1:
  userAnswer = input("Rock, Paper, or Scissors? ")
  if userAnswer in answers:
    break
  print( "Try again." )

userAnswerInteger = answers[userAnswer]

相关问题 更多 >