本问题已经有最佳答案,请猛点这里访问。
以下是我的代码:
total = int(input("How many students are there"))
print("Please enter their scores, between 1 - 100")
myList = []
for i in range (total):
n = int(input("Enter a test score >>"))
myList.append(n)
基本上,我正在编写一个程序来计算测试分数,但是首先,用户必须输入介于0-100之间的分数。
如果用户输入的测试分数超出该范围,我希望程序告诉用户重写该数字。我不希望程序以错误结束。我该怎么做?
创建一个永远循环的助手函数,在每个循环上调用input()。当输入正确的值时,返回它,否则打印一个错误并让循环再次询问。
没有人想检查输入是否是数字?
@FP:这不是规范的一部分。当然,这很容易添加。
while True:
n = int(input("enter a number between 0 and 100:"))
if 0 <= n <= 100:
break
print('try again')
就像问题中的代码一样,这在python 2.x和3.x中都有效。
他不必说他用的是哪一种,他用的是int(input,这一事实很好地证明了这是py3。
@艾伯特:它暗示了这一点,但没有任何证据。我只写python 2.x,但通常在print()中使用括号。我也会在这里编写int(input(...)),只是为了让代码成为未来的证据。
恕我直言,显然是初学者的人不会被教导编写通常也适用于Python3的Python2代码;而是被教导编写Python3代码。
@艾伯特:我认为我们正在讨论一个无关紧要的问题。因此,我建议我们就到此为止。
首先,您必须知道如何检查值是否在范围内。这很容易:
if n in range(0, 101):
几乎是直接从英语翻译过来的。(对于Python3.0或更高版本,这只是一个很好的解决方案,但显然您使用的是Python3。)
接下来,如果您想让他们一直尝试直到输入有效的内容,只需在循环中进行:
for i in range(total):
while True:
n = int(input("Enter a test score >>"))
if n in range(0, 101):
break
myList.append(n)
同样,几乎是直接从英语翻译过来的。
但如果你把它分解成一个单独的函数,它可能会更清楚:
def getTestScore():
while True:
n = int(input("Enter a test score >>"))
if n in range(0, 101):
return n
for i in range(total):
n = getTestScore()
myList.append(n)
正如F P所指出的,如果程序输入的不是整数,比如"A+",那么它仍然"只会以错误结束"。处理起来有点棘手。如果给int函数指定的字符串不是整数的有效表示,它将引发ValueError。所以:
def getTestScore():
while True:
try:
n = int(input("Enter a test score >>"))
except ValueError:
pass
else:
if n in range(0, 101):
return n
如果范围是0到1000000呢?你能把n和那个范围内的每个数字作比较吗?
@NPE:你为什么要这样做?就这样。(在python 2中,您希望使用xrange而不是range)您不了解基本的python吗?
@AbarnetNPE正在讨论范围内的性能问题。使用0 <= n <= 1000000的速度要快得多。
@从python 3开始,range是一个类生成器的类型,它定义了一个自定义__contains__()。假设方法是正确实现的,这不是一种延伸。
@米莉莫斯:酷,我不知道。
@MarkusInterwaDitzer的要点是,python 3.x range()和(可能)python 2.x xrange()可能没有想象中的性能问题。(不确定后者,因为xrange()没有__contains__()方法。)
@markusinterwaditzer:鉴于print函数和input的使用(而不是raw_input)返回字符串,OP显然使用了python 3。
@millimouse:在python 2.7.3中,xrange()确实存在想象中的性能问题。n in xrange(...)迭代这些值。
正确的。python 2.x上的2**30 in xrange(2**31)需要一段时间,而在3.x下,2**30 in range(2**31)会立即返回。所以这只是Python3.x下的一个好方法
@米莉穆斯:我在答案中加入了python 3注释。但是OP显然使用的是python 3,而且是一个初学者,所以他对python 2的关心可能比他对ruby或haskell的关心更多。
您可以使用如下辅助功能:
def input_number(min, max):
while True:
n = input("Please enter a number between {} and {}:".format(min, max))
n = int(n)
if (min <= n <= max):
return n
else:
print("Bzzt! Wrong.")