如何限制输入中的位数?

时间:2015-04-15 16:50:55

标签: python input limit digit

我是一名学生正在从事计算机科学课程,为了进行部分评估,我们必须编写一个程序,该程序将从用户那里获取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的知识相当有限)

5 个答案:

答案 0 :(得分:1)

您必须将int转换为字符串,因为int没有length属性。你也在检查这个数字是否长于1,所以我把SECOND NUMBER支票改为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 :(得分: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等于给定的数字。

答案 2 :(得分: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的通话只会从终端输入中获取一个字符。您还应该在try / except块中将调用包装到int(),以阻止应用程序在获取非整数输入时崩溃。

答案 3 :(得分: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"

这将提示,并一遍又一遍地问它,直到它收到一个长度的字符串。为了使用户更友好,您可以使用try...except添加保护以进行非数字输入,以及

答案 4 :(得分: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'))