如何将输入限制为一定范围的数字?

问题描述 投票:0回答:7

我想将输入限制为一定范围的数字(比如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 循环

and
or

python python-3.x while-loop try-except
7个回答
2
投票

编辑忘记了

ValueError
。最佳实践是显式捕获
ValueError
而不是
Exception
,因为
Exception
也可能捕获其他内容。

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

作为奖励,我使用了 f 字符串,它更容易阅读。

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")

1
投票

如果您想让代码更短,这里的代码片段可能会有所帮助:

x = ''
n = 10

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

为了分解它,语句

x.isdigit()
将确保
x
是否包含 只有整数(字符串中的
.
会使其成为
False
)。如果是那种情况 通过它会将字符串安全地解析为整数,然后检查它是否在 范围。
not
将确保如果这些情况失败,循环必须 继续。

旧答案

您可以在

try..except
循环内使用
while
块,如下所示。如果该值不是整数,那么当 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')

...

1
投票

我假设您想要一个从 0 到

n
的数字,因为您使用了从 0 到
range(n+1)
n
。如果您想要 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

1
投票

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

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
将在返回之前验证输入,这样,您也可以对其他输入使用相同的方法。


0
投票
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) :

这是你所期望的吗?


0
投票

也许你可以这样做:

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

len()
将返回
input()
返回的字符串的长度。

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

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

0
投票

以下代码将

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
© www.soinside.com 2019 - 2024. All rights reserved.