PAYATHON 2026

Python 中如何在 while 循环中返回用户输入值?

排障赵师傅

把 input() 放进函数的循环中,每次读取后检查输入。只有输入为 "rock"、"paper" 或 "scissors" 时,才执行 return user_input;输入无效时,提示错误并继续循环。

为什么原代码会返回无效输入?

下面的条件始终为 True:

user_input != "rock" or user_input != "paper" or user_input != "scissors"

例如,输入 "rock" 时,user_input != "paper" 为 True,整个 or 表达式也就为 True。一个字符串不可能同时等于这三个不同的值。

要判断输入是否无效,可以写成:

user_input not in ("rock", "paper", "scissors")

也可以将原条件中的 or 全部改为 and,含义相同。

break 的位置也有影响。它会立即退出当前循环,如果接着执行循环外的 return user_input,函数仍会返回无效输入。如果 return 在同一循环体内,紧跟在无条件执行的 break 后面,就不会执行到它。

原来的 input() 放在函数外,只读取一次。打印“请重试”不会重新读取输入,必须再次调用 input() 才能获得新值。

推荐写法:验证通过后直接返回

删除函数外原有的 user_input = input(...),将 make_user_choice() 替换为:

def make_user_choice():
    """Return a valid choice entered by the user."""
    while True:
        user_input = input("Choose one: rock, paper, scissors? ")

        if user_input in ("rock", "paper", "scissors"):
            return user_input

        print("That is not a valid input. Please try again.")

每轮循环都会读取一次输入。输入有效时,return 直接结束整个函数,并将值返回给调用方,所以不需要再写 break。输入无效时,程序打印提示,进入下一轮循环。

调用时,接收函数的返回值:

user_choice = make_user_choice()
print("Your choice:", user_choice)

交互过程例如:

Choose one: rock, paper, scissors? rtgyhuji
That is not a valid input. Please try again.
Choose one: rock, paper, scissors? rock
Your choice: rock

如果游戏有多轮,就在每轮需要用户选择时调用 make_user_choice(),用返回值参与本轮游戏。

也可以在循环结束后返回

也可以先读取一次输入,只在输入无效时进入循环,提示用户并重新读取:

def make_user_choice():
    """Return a valid choice entered by the user."""
    user_input = input("Choose one: rock, paper, scissors? ")

    while user_input not in ("rock", "paper", "scissors"):
        print("That is not a valid input. Please try again.")
        user_input = input("Choose one: rock, paper, scissors? ")

    return user_input

这里的 return 与 while 对齐。输入有效后,循环条件变为 False,程序才会执行返回。

使用时注意

上述代码只接受小写的 "rock"、"paper" 和 "scissors"。如果还希望接受 "Rock" 或前后带空格的输入,可以把读取语句改为:

user_input = input("Choose one: rock, paper, scissors? ").strip().lower()

这样返回的字符串会去除首尾空白,并转为小写。

示例使用 Python 3,复制时要保留缩进。修复输入检查后,原代码中的 wins_matchup() 还需要单独完善:它目前只判断 choice == "rock",没有根据 opponent_choice 判断胜负。

备注:内容仅供参考。