我想将输入限制为一定范围的数字(比如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
。
编辑忘记了
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")
如果您想让代码更短,这里的代码片段可能会有所帮助:
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')
...
我假设您想要一个从 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
您可以使用更通用的方法来实现它:
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 = 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) :
这是你所期望的吗?
也许你可以这样做:
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)
以下代码将
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