Python输入限制与重新提升

1 投票
4 回答
1801 浏览
提问于 2025-04-17 23:18

我想限制用户输入的数字范围在1到223之间,但不包括“3, 7, 10, 12”这几个数字。如果用户输入了这些被排除的数字,我想打印一个错误信息,并要求用户重新输入。我现在在列出被排除的数字和重新提示用户输入的代码上遇到了问题。

这是我目前的进展

for i in range(numRan):
    ranNums.append(int(raw_input( "Range %d Number ? (1-223)\n" % (i+1) )))
    if i in []:
        print "Rang is not allowed!"

4 个回答

0

你可以把请求函数的部分和生成数字列表的部分分开,这样可能会更简单一些,像这样:

restrict = [3,7,10,12]

# This function returns an input number with the right 
# characteristics. 
def strictInput():
    v = int(raw_input('Number?'))
    if v >0 and v<224 and v not in restrict: return v
    print 'Illegal number ..., try again'
    return strictInput()

# Now call this function however many times you need ...
inputNumbers = [strictInput() for i in range(numRan)]   
0

我通常会写一个函数,用来处理需要重新提示用户输入的情况。

def limited_input(prompt="",include_only=None,not_allowed=None,not_allowed_err="",cast=None,wrongcasterr=""):
    if not_allowed is None:
        not_allowed = set()
    in_ = None
    while in_ is None:
        in_ = raw_input(prompt)
        if cast:
            try: in_ = cast(in_)
            except ValueError:
                print wrongcasterr
                in_ = None
                continue
        if (include_only and in_ not in include_only) or in_ in not_allowed:
            print not_allowed_err
            in_ = None
    return in_

然后你就可以像平常一样使用它:

for i in range(numRan):
    ranNums.append(limited_input(prompt="Range %d Number ? (1-223)\n" % (i+1),
                                 include_only = range(1,224),
                                 not_allowed = {3,7,10,12},
                                 not_allowed_err = "You cannot use 3,7,10,12"
                                 cast = int
                                 wrongcasterr = "You must enter an integer"))

这个解决方案非常灵活,我通常会把它放在我Python库的某个模块里。在这个系统上,它在 utils.inpututils 里,但你可能会有不同的做法。

0

试试这个:

not_allowed = {3,7,10,12}
for i in range(numRan):
    while True: # to repeat raw_input if the input is not_allowed
        val = int(raw_input( "Range %d Number ? (1-223)\n" % (i+1) )))
        if val in not_allowed or val < 1 or val > 223:
            print "Rang is not allowed!"
        else:
            ranNums.append(val)
            break
2

这个代码是有效的——如果输入不正确,它会重新要求输入:

allowed_nums = set(range(1,224)) - {3,7,10,12}
for i in range(numRan):
    while True:
        inpt = int(raw_input("Range %d Number? (1-223)\n" % (i+1)))
        if inpt in allowed_nums:
            ranNums.append(inpt)
            break
        print "Range is not allowed!"

简单来说,这段代码的工作原理是:每次输入时,它会创建一个无限循环,只有在输入有效的时候,这个循环才会停止,然后才会继续进行下一次输入。

撰写回答