Python 为什么我的';而p1!=';循环永不停止

Python 为什么我的';而p1!=';循环永不停止,python,python-3.x,while-loop,user-input,Python,Python 3.x,While Loop,User Input,这一部分永远不会停止: def outcome(p1, p2): x = '' if p1 == p2: x = 0 return x elif p1 == "rock" and p2 == "scissors" or p1 == "scissors" and p2 == "paper" or p1 == "paper" and p2 == "rock": x = 1 return x elif p2

这一部分永远不会停止:

def outcome(p1, p2):
    x = ''
    if p1 == p2:
        x = 0
        return x
    elif p1 == "rock" and p2 == "scissors" or p1 == "scissors" and p2 == "paper" or p1 == "paper" and p2 == "rock":
        x = 1
        return x
    elif p2 == "rock" and p1 == "scissors" or p2 == "scissors" and p1 == "paper" or p2 == "paper" and p1 == "rock":
        x = 2
        return x

a = 0
while a == 1:
    p1 = str(input("P1 choose: "))
    while p1 != "rock" or  p1 != "paper" or p1 != "scissors":
        p1 = str(input("Please select rock/paper/scissors: "))
    p2 = str(input("P2 choose: "))
    while p2 != "rock" or  p2 != "paper" or p2 != "scissors":
        p2 = str(input("Please select rock/paper/scissors: "))
    b = outcome(p1, p2)
    if b == 1:
        print("P1 wins\n")
    elif b == 2:
        print("P2 wins\n")
    elif b == 0:
        print("Tied\n")
    pit = str(input("Another one? yes/no - "))
    if pit == "no":
        a = 0
        raise SystemExit(0)
这是一个石头剪刀布游戏,当我输入正确或错误时,它不起作用,并不断重复。我希望它重复,直到你写下石头、布或剪刀,当你写下其中一个时,退出while循环

while p1 != "rock" or  p1 != "paper" or p1 != "scissors":
        p1 = str(input("Please select rock/paper/scissors: "))
它说:
p
可以是任何东西,而不是
石头
剪刀
。如果
p
等于这些单词中的任何一个,则整个谓词变为
True
,循环继续。应用时,您将
误认为
。无法退出循环,因为没有
p
可以同时等于
rock
paper
剪刀

你似乎想要的是

while p1 != "rock" or  p1 != "paper" or p1 != "scissors":
    p1 = str(input("Please select rock/paper/scissors: "))
它说:
p
可以是任何东西,而不是
石头
剪刀
。如果
p
等于这些单词中的任何一个,则整个谓词变为
True
,循环继续。应用时,您将
误认为
。无法退出循环,因为没有
p
可以同时等于
rock
paper
剪刀

你似乎想要的是

while p1 != "rock" or  p1 != "paper" or p1 != "scissors":
    p1 = str(input("Please select rock/paper/scissors: "))

您应该重写您的条件:

while True:
  word = input("Please select rock/paper/scissors: ")  # it's already a string.
  if word in ("rock", "paper", "scissors"):
    break

如果一个条件正确,则退出白色循环。

您应该重写条件:

while True:
  word = input("Please select rock/paper/scissors: ")  # it's already a string.
  if word in ("rock", "paper", "scissors"):
    break

如果一个条件是正确的,则退出白循环。

其他答案是正确的,但更为通俗的方法是列出可接受的输入(或元组),然后检查响应是否在其中:

while not (p1 == "rock" or p1 == "paper" or p1 == "scissors"):
    p1 = str(input("Please select rock/paper/scissors: "))

当您编写更复杂的程序时,这会很好地扩展:您可能会对参数使用函数调用,而不是简单的列表,并且在输入验证函数中,您会对值执行任意数量的测试等

其他答案都是正确的,但一种更为通俗的方法是列出可接受的输入(或元组),然后检查响应是否在其中:

while not (p1 == "rock" or p1 == "paper" or p1 == "scissors"):
    p1 = str(input("Please select rock/paper/scissors: "))

当您编写更复杂的程序时,这会很好地扩展:您可能会对参数使用函数调用,而不是简单的列表,并且在输入验证函数中,您会对值执行任意数量的测试等

首先进入循环不应该是
a=1
?您必须连接p!=使用
,而不是
。话虽如此,如果你的输入在这个列表中,请列出一个列表并进行测试。再仔细考虑一下这个条件。。。如果
p1
等于
“rock”
,则
p1!=“rock”
将为
。但是然后
p1!=“paper”
自动变为
True
,这意味着整个条件是
True
。您可以在一张纸上手动通过此循环,并查看其逻辑是否有缺陷。首先进入循环不应该是
a=1
?您必须连接p!=使用
,而不是
。话虽如此,如果你的输入在这个列表中,请列出一个列表并进行测试。再仔细考虑一下这个条件。。。如果
p1
等于
“rock”
,则
p1!=“rock”
将为
。但是然后
p1!=“paper”
自动成为
True
,这意味着整个条件是
True
。您可以在一张纸上手动通过此循环,查看其逻辑是否有缺陷。答案的第二部分不正确:
如果a和b或c,d或e和f实际上与
如果(a和b)或(c和d)或(e和f)
。对。这不是我第一次在这个问题上出错。你回答的第二部分不是真的:
如果a和b或c和d或e和f
实际上与
如果(a和b)或(c和d)或(e和f)是一样的
。对。这不是我第一次出错。这似乎是非常冗余的编码。这似乎是非常冗余的编码。