Python 如何限制输入中的位数?

Python 如何限制输入中的位数?,python,input,limit,digit,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

我是一名修计算机科学课程的学生,在评估过程中,我们必须编写一个程序,从用户那里提取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!")
ect

我必须将输入保持为整数,以便程序其余部分中的某些计算能够正常工作,但当我运行程序时,会出现一个错误,显示“类型为'int'的对象没有len()”。我假设它指的是一个整数,没有长度。有没有什么方法可以将“a”保持为整数,但将长度限制为1位


(我也知道可能有一种更有效的方法来编写程序,但我对python的了解相当有限)

您必须将int转换为字符串,因为int没有length属性。另外,你两次检查数字是否大于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

首先,我假设您使用的是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 ')
作为最后一种手段,如果您绝对需要每个数字有单独的变量名,您可以使用
exec
eval

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。

您从未声明您是在Windows还是Linux上,下面列出的代码是针对Windows的(因为我现在在Windows机器上,无法在Linux上测试等效代码)


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

我建议创建一个函数来处理提示,然后在代码中调用它。下面是一个简化的示例:

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…添加保护,除了
用于非数字输入和诸如此类的内容之外

使用验证包装器可能是最干净的

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: ")
这可能有点过度设计,但它具有难以置信的可重用性(有一组需要验证的不同测试?编写一个新的
10位数字
类比!)和非常可配置性(希望失败函数有不同的行为?将其写入!),这意味着您可以执行以下操作:

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'))

在将输入转换为
int
之前最好检查一下——所有这些
str(int(str))
的东西都有点傻。
aa=(a*11)
bb=(b*10)
都是假的,它们强迫用户输入一个数字,然后将其乘以10或11;对
input()
@smci的调用没有重复10到11次,我想知道他为什么把它放在那里。我还添加了一个更简单的解决方案
aa=(a*11)
bb=(b*10)
完全是假的,它们强迫用户输入一个位数,然后将该位数乘以10或11;与对
input()
的调用进行10或11次迭代不同,这假设用户不会犯错误,这是一种不好的做法,因此需要注意将int调用包装在代码段下面的try/except块中。如果不是整数。如果用户输入了错误的整数怎么办?他们不应该一次输入一个字符,而是允许输入ISBN的10位数字,只有这样你才能处理。如果您假设用户将一直输入不正确的值,那么您应该有一个多步骤的过程,要求他们输入字符,然后按y/n(如果确实是正确的)。如果你这么说是因为我的代码片段只有一个对
getch()
的调用,而不是10个,那是因为这是一个最好留给OP的练习。问题的标题是“如何限制输入中的位数?”OP希望一次只读取1个字符,我不明白如何编写一份完整的申请书。我知道你看了我的想法:p@Heinst哈,有点是,也有点不是。我本来打算写的,后来看到他想要单个数字,就想不需要了,然后想我应该给出一个完整的答案(并且意识到你也提到了)。如果你想的话,我可以删除并给你信用?我只是喜欢把所有的东西都放在一个地方。不,没关系,我只是在胡闹,我不在乎
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'))