如何将输入限制在一定范围内?

How can I restrict an input to a range of numbers?

我想将输入限制在一个数字范围内(比如 n)。 如果我使用 while x not in range(n): x = input(),它不起作用。 所以我放了while x not in range(n): x = int(input())。 除非我给任何字母,否则它工作正常。 经过一些研究,我想出了以下代码:

x = None
while True:
try:
    while x not in range(n+1):
        x = int(input("X (1 to "+ str(n)+ ") :"))
        if x not in range(n+1):
            print("please enter a valid input")
    break
except:
    print("please enter a valid input")

我想知道是否有任何方法可以缩短代码,例如合并 while 循环 andor

也许你可以这样做:

while True:
    if len(input()) > 20:
        print('please input valid input')

len() 将 return 字符串的长度 input() returns.

您还可以简化它并使用 lambda 使其更具动态性:

fun = lambda y, x: print('ok') if len(y) > x else print('please input a valid number')
while True: fun(input(), 5)

我假设你想要一个从 0 到 n 的数字,因为你使用了从 0 到 nrange(n+1)。如果您想要从 1 到 n 的数字,请使用 range(1, n+1)

x = 0
while True:
    try:
        x = int(input("Enter a number"))
    except:
        print("Please enter a valid input")

    if x not in range(n+1):
        print("Please enter a valid input")
    else:
        break

编辑 忘了 ValueError。最好的做法是显式捕获 ValueError 而不是 Exception 因为 Exception 也可能捕获其他东西。

您可以使用内置的比较函数快速测试代码。

作为奖励,我使用了 f-strings,它更易于阅读。

n = 1000  # Example number
x = None
while True:
    try:
        x = int(input(f"X (1 to {n}) :"))
    except ValueError:
        print(f"{x} is not a number, please enter a number")
    else:
        if 1 <= x <= n:  # Inclusive of 1 and n, edit the comparisons if needed
            break
        else:
            print(f"{x} is not within range, please enter a valid number")
x = 1
n = 3
while x in range(n+1):
    x = int(input("X (1 to "+ str(n)+ ") :"))
    if x not in range(n+1):
        print("please enter a valid input")
        x = 1

序列例如:

X (1 to 3) :3
X (1 to 3) :4
please enter a valid input
X (1 to 3) :3
X (1 to 3) :2
X (1 to 3) :1
X (1 to 3) :6
please enter a valid input
X (1 to 3) :

这是您所期望的吗?

以下代码将 for 循环次数减少到 1,并捕获所有无效输入。

n = 10
x = n + 1 

while x not in range(1, n + 1): # The loop keeps going until x is in range.
    x = input('Please enter a valid input in the range of (1, '+ str(n) +'): ')
    try:
        x = int(float(x)) # e.g 5.0 string literal gets converted to 5.
    except ValueError:
        x = n + 1 # Re-initialize x to keep iterating, until we get a valid input.
    if x in range(1, n + 1):
        print('Number in range ->', x)

带有无效输入和整数的输出:

Please enter a valid input in the range of (1, 10):  一二三
Please enter a valid input in the range of (1, 10): 1²
Please enter a valid input in the range of (1, 10): asd
Please enter a valid input in the range of (1, 10): word
Please enter a valid input in the range of (1, 10): a
Please enter a valid input in the range of (1, 10): 9
Number in range -> 9

带浮点数的输出:

Please enter a valid input in the range of (1, 10): 11.0
Please enter a valid input in the range of (1, 10): 0.0
Please enter a valid input in the range of (1, 10): 5.0
Number in range -> 5

您可以使用更通用的方法来实现它:

def get_valid_input(input_message, validator_fn=None):
    while True:
        try:
            i = input(input_message)
            if validator_fn is None or validator_fn(i):
                return i
        except:
            print("please enter a valid input")


x = get_valid_input('X (1 to ' + str(n) + ') :',
                    lambda i: x in range(n + 1))

get_valid_input 将在返回之前验证输入,这样,您也可以对其他输入使用相同的方法。

如果您想缩短代码,下面的代码片段可能会有所帮助:

x = ''
n = 10

while not (x.isdigit() and int(x) in range(1, n + 1)):
    x = input(f'X (1 to {n}): ')

To break it down, the statement x.isdigit() will ensure if x consists of only integers (a . in the string will make it False though). If that case passes it will parse the string to an integer safely and then check if it is in range. The not will make sure that if these cases fail, the loop has to continue.

旧答案

您可以在 while 循环中使用 try..except 块,如下所示。如果值不是整数,一旦 python 尝试解析它就会抛出错误,如果值不在范围内,则会在 if 语句中抛出错误将由 try..catch 块处理。如果没有抛出异常,break 语句将执行并跳出循环...

n = 10
x = None

while True:
    try:
        x = int(input(f"X (1 to {n}): "))

        if x not in range(n + 1):
            raise Exception("ERROR: Not in range")

        break  # If no errors are thrown, break from the loop

    except:
        print('Please enter a valid number')

...