关于python:验证用户输入以查看是否在数字范围内,如果没有循环返回以再次请求用户输入

Validating user input to see if in range of numbers, if not loop back to ask for user input again

如果玩家输入任何超出范围或无效值,我希望它循环回来让他再次下注。

当我用int()包装raw_input时,我可以得到这个中途工作。

但是,如果说玩家不小心输入一个字母或者只是输入而没有输入任何东西,那么就会抛出错误,从而停止游戏/剧本。

因此,如果玩家确实犯了这样的错误,我需要它再循环回"放下你的赌注",而不是抛出错误并使脚本崩溃。

1
2
3
4
5
6
7
8
9
10
def betAmount():
    if number_of_hands == 1:
        if chip_count_player1 > 0:
            global chips_bet
            chips_bet = raw_input("Place your bet!")
            if chips_bet in range(0, chip_count_player1 + 1):
                print"Your bet is within range"
            else:
                print"NOT IN RANGE"
                betAmount()


  • 您需要将chips_bet转换为这样的数字

    1
    2
    3
    4
    try:
        chips_bet = int(raw_input("Place your bet!"))
    except ValueError:
        betAmount()
  • 您正在构建一个新的数字列表,然后检查chips_bet是否存在。 这是低效的。 你可以这样检查

    1
    if 0 <= chips_bet <= chip_count_player1:
  • 基本思想可以像这样实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    bet = getBet()
    ...
    def getBet(maximum):
        bet = -1
        while (bet < 0) or (bet > maximum):
            try:
                bet = int(raw_input("Place your bet!"))
            except ValueError: pass
        return bet

  • 你可以将你的提示/输入/验证循环分成一个小函数,然后调用它(将重试循环与程序逻辑分开更容易)

    例如,这不会抛出,只会返回一个经过验证的数字:

    1
    2
    3
    4
    5
    6
    7
    8
    def safe_int_input(prompt, validate):
        while True:
            try:
                val = int(raw_input(prompt))
                if validate(val):
                    return val
            except: pass
            print"invalid input"

    你会这样称呼它:

    1
    2
    chips_bet = safe_int_input("Place your bet!",
                              lambda v:(v >= 0 and v <= chip_count_player1))