如何限制输入框中的数字数量?

3
我是一名学习计算机科学的学生,为了评估的一部分,我们需要编写一个程序,从用户那里获取10个数字并用它们来计算第11个数字以生成ISBN。用户输入的数字必须限制为一个数字,如果输入多个数字,则应显示错误消息。这是我正在使用的代码:
print('Please enter your 10 digit number')
a = int(input("FIRST NUMBER: "))
aa = (a*11)
if len(a) > 1:
    print ("Error. Only 1 digit allowed!")
b = int(input("SECOND NUMBER: "))
bb = (b*10)
if len(a) > 1:
    print ("Error. Only 1 digit allowed!")

我必须将输入保持为整数,以便程序的其余部分中的某些计算工作,但是当我运行程序时,会出现错误,显示“int类型的对象没有len()”。我猜想它指的是它是一个整数并且没有长度。有没有办法让'a'保持为整数,但限制长度为1位数字?
(另外,我知道可能有一种更有效的编写程序的方法,但是我对Python的了解相当有限)

aa = (a*11)bb = (b*10)是完全错误的,它们强制用户输入一个单个数字,然后将该数字乘以10或11;而不是在调用input()时迭代10或11次。 - smci
5个回答

1
你需要将整数转换为字符串,因为整数没有长度属性。此外,你检查数字是否超过1两次,所以我将第二个数字检查切换到b。
print('Please enter your 10 digit number')
a = raw_input("FIRST NUMBER: ")
if len(a) > 1:
    print ("Error. Only 1 digit allowed!")
a = int(a)
aa = (a*10)

b = raw_input("SECOND NUMBER: ")
if len(b) > 1:
    print ("Error. Only 1 digit allowed!")
b = int(b)
bb = (b*10)

或者更简单地说:

您可以要求输入数字,并持续要求直到长度为10且输入为数字为止。

num = raw_input('Please enter your 10 digit number:')
while len(num) != 10 or (not num.isdigit()):
    print 'Not a 10 digit number'
    num = raw_input('Please enter your 10 digit number:')
num = int(num)
print 'The final number is: ', num

1
在将输入转换为“int”之前最好先检查一下 - 所有这些“str(int(str))”的东西有点傻。 - a p
1
aa = (a*11)bb = (b*10)是虚假的,它们强制用户输入一个数字然后乘以10或11; 而不是在调用input()时迭代10次或11次。 - smci
@smci 我在想他为什么把那个放进去。我也添加了一个更简单的解决方案。 - heinst

0

首先,我假设您正在使用3.x版本。其次,如果您正在使用2.x版本,则无法对数字使用len

这是我的建议:

print('Please enter your 10 digit number')

number = ''

for x in range(1,11):
    digit = input('Please enter digit ' + str(x) + ': ')
    while len(digit) != 1:
        # digit is either empty or not a single digit so keep asking
        digit = input('That was not 1 digit. Please enter digit ' + str(x) + ': ')        
    number += digit # digit is a single digit so add to number

# do the rest

将所有数字保存在str中更有意义,因为您可以随后根据需要将它们拆分出来,例如number[0]将是第一个数字,number[1]将是第二个数字。

如果您可以使程序不必显式使用a、b、c、d等,而是使用切片,则构建起来会非常简单。

显然,如果您可以使用整个10位数字,则最好的方法是:

number = input('Please enter your 10 digit number: ')

while len(number) != 10:
    number = input('That was not a 10 digit number. Please enter your 10 digit number ')

作为最后的手段,如果您绝对必须针对每个数字使用单独的变量名称,您可以使用 execeval

var_names = [('a', 1), ('b', 2), ('c', 3), ('d', 4)] # add more as needed

for var, num in var_names:
    exec(var + ' = input("Please enter digit " + str(num) + ": ")')
    while eval('len(' + var + ')') != 1:
        exec(var + ' = input("That was not a single digit. Please enter digit " + str(num) + ": ")')

这将为您提供变量a、b、c和d,它们等于给定的数字。


1
我看到你看了我的想法 :p - heinst
@Heinst 哈哈,有点是有点不是。我本来想写的,但看到他想要单独的数字,就觉得不用了,然后又想给一个完整的答案(并且意识到你也提到了它)。如果你想的话,我可以删除并给你信用?我只是喜欢把所有东西都放在一个地方。 - NDevox
1
不用了,没关系,我只是闲着无聊而已,我不在意 :p - heinst

0
你没有说明你使用的是Windows还是Linux,下面列出的代码是针对Windows的(因为我现在正在使用Windows机器,无法在Linux上测试相应的代码)。
# For windows
import msvcrt
print('Please enter your 10 digit number')
print('First number: ')
a = int(msvcrt.getch())
print(a)

.getch() 调用与 msvcrt 一起从终端输入中获取单个字符。您还应该将对 int() 的调用包装在 try/except 块中,以防止在获取非整数输入时使应用程序崩溃。


1
这假设用户不会犯错,这是不好的实践。 - NDevox
因此,在代码片段下面加上try/except块来包装int调用的注释。 - Christian Witts
如果输入的不是整数,那该怎么办?如果用户输入了错误的整数,又该怎么办? - NDevox
我的意思是用户可以输入错误的数字,然后意识到错误并在按回车键之前删除。但使用你提供的答案,他们不能这样做。 - NDevox
1
问题的标题是“如何限制输入中的数字数量?”OP想一次只读取1个字符,我不明白为什么需要编写完整的应用程序。 - Christian Witts
显示剩余2条评论

0
我建议创建一个函数来处理所有提示,然后在您的代码中调用它。这是一个简化的示例:
def single_num(prompt):
    num = ""
    while True:
        num = raw_input(prompt)

        if len(num) == 1:
            try:
                return int(num)
            except ValueError:
                print "Error, you must enter a number"
        else:
            print "Try again, now with a single number"

这将接受一个提示,并一遍又一遍地询问,直到收到一个长度为1的字符串。为了使其更加用户友好,您可以添加保护措施,使用try...except来处理非数字输入等情况。


0

这可能是使用验证包装器最简洁的方法。

def validator(testfunc):
    def wrap(func):
        def wrapped(*args, **kwargs):
            result = func(*args, **kwargs)
            pass, *failfunc = testfunc(result)
            it pass:
                return result
            elif failfunc:
                failfunc[0]()
        return wrapped
    return wrap

def ten_digits(num):
    pass = False
    if len(num) != 10:
        msg = "{} is not of length 10".format(num)
    elif not num.isdigit():
        msg = "{} is not a number".format(num)
    else:
        pass = True
    def failfunc():
        raise ValueError(msg)
    response = (pass, None if pass else failfunc)
    return response

valid_input = validator(ten_digits)(input) # or raw_input in Python2
response = valid_input("Enter your 10 digit number: ")

这可能有点过度设计,但它非常可重用(需要验证不同的测试集?编写一个新的 ten_digits 比喻!)并且非常可配置(想要从您的失败函数中获得不同的行为?自己编写!)这意味着您可以做出像以下这样的事情:

ISBN = validator(ten_digits)(input)("ISBN# = ")
title = validator(max_50_chars)(input)("Title = ")
author = validator(no_digits)(input)("Author = ")
price = decimal.Decimal(validator(float_between_1_and_50)(input)(
        "Price = ")).quantize(decimal.Decimal('1.00'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接