-6

我的程序有问题,这真的很烦人我一直收到错误我什至不知道为什么你能帮助我?

我不断收到 builtins.TypeError:“int”类型的对象没有 len() 错误

当它进入密码验证阶段时,我无法弄清楚问题是什么..

#Program asking for a username, password and security pin 
#Written by Cole Johnston
#19/08/13 - 

#Declare/Initialize variables
sFirstName = "" #User's input of their first name (the minimum is 2 characters) (string) 
sLastName = "" #User's input of their last name (the minimum is 4 characters) (string)
sPassword = "" #User's input of their password (it must have a minimum length of 6 characters and a maximum length of 10 characters. It must contain at least 2 numbers in the password, it is case sensitive)
iPinNo = 0 #User's chosen input of security pin (It must be 4 characters long and contain only numbers which are single digit and range between 0-9)
iCount = 0 #The amount of times the user enters an invalid username (integer)
sMessage = "" #Message for user (string)
iFirstNameCheck=0 #Checks first name
iLastNameCheck=0 #Checks last name
iPasswordCheck=0 #Checks password
iPinNoCheck=0 #Checks pin
sUserName = "" #Creates a username for the user (uses first and last name)
sPasswordVerification = "" #Checks the password is correct and same as the first one

def APFirstERROR(): 
    print(("ERROR: Incorrect Attemps consisting of 3 \n\t Closing program")) 
    sys.ext


def APSecondERROR(): 
    print (("ERROR: Incorrect Attemps consisting of 3 \n\t Closing program")) 
    sys.ext

def APThirdERROR(): 
    print (("ERROR: Incorrect Attemps consisting of 3 \n\t Closing program")) 
    sys.ext

def APFourthERROR(): 
    print (("ERROR: Incorrect Attemps consisting of 3 \n\t Closing program")) 
    sys.ext


#Ask for the users First name 

while len(sFirstName) <2:  
    sFirstName=input("Could you please enter your first name: ")  
    if len(sFirstName) <2:  
        print("\tERROR: I'm sorry, you must enter a minumum of two characters") 
        FirstName = "" 
        iFirstNameCheck = iFirstNameCheck +1
        print (iFirstNameCheck, "Incorrect attempt") 
        if iFirstNameCheck == 3: 
            APFirstERROR() 

#Ask for the users Last name        
while len(sLastName)  <4: 
    sLastName = input("Could you please enter your last name: ") 
    if len(sLastName) <4 : 
        print ("\tERROR: I'm sorry, you must enter a minumum of four characters") 
        LastName = "" 
        iLastNameCheck = iLastNameCheck +1
        print (iLastNameCheck, "Incorrect attempt") 
        if iLastNameCheck==3: 
            APSecondERROR()    

sUsername = "Congratulations, your username will be " + sLastName[0:4] + sFirstName[0:1] 
print (sUsername)            


while sPassword is "": 
    sPassword=input("Could you please enter a password: ") 
    if len(sPassword) <6 or len(sPassword) >10 : 
        print("ERROR: I'm sorry, your password must be 6 characters or more but not exceeding 10 characters.\nPlease try again") 
        if sum(c.isdigit() for c in sPassword) <2: 
            print("Im sorry, your password does not contain enough numbers.\nThe requirements are a minimum of 2 numbers")         
            sPassword="" 
            iPasswordCheck=iPasswordCheck+1
            print(iPasswordCheck, "Incorrect Attempt") 
            if iPasswordCheck ==3: 
                sPassword="Incorrect"
                APErrorThird()             
                break 

#Verify the password 
while sPasswordVerification is "": 
    sPasswordVerification=input("Please enter your password a second time for verification: ") 
    if sPasswordVerification==sPassword:
        print("That password is Accepted") 
        if not sPasswordVerification==sPassword: 
            sPasswordVerification="" 
            print ("I'm sorry, that password is: Not accepted") 

                a
#ASk user for pin creation 
while len(iPinNo) <4: 
    iPinNo= input("Now could you please create a pin number. The requirements are that it must be only numbers (0-9). Must be 4 numbers long\n\tpin=?\t\n:") 
    if not re.match("^[1-9]*$", iPinNo): 
        print ("ERROR: I'm sorry but only numbers between 1-9 are allowed!") 
        if len (iPinNo) <4: 
            print ("I'm sorry, your pin number MUST be 4 characters.") 
            iPinNoCheck=iPinNoCheck+1
            print (iPinNoCheck, "Incorrect Attempt") 
            if iPinNoCheck==3: 
                iPinNo ="Incorrect"
                APErrorFourth()                 

#Display the Username, the Password and the Pin number

print ("Okay, " + (sFirstName) +" Your username is: ",sUsername) 
print("And, Your password is: ",sPassword)   
print ("Finally , Your Security pin is: ",iPinNo)     
4

4 回答 4

4

这里:while len(iPinNo) < 4:

iPinNo是一个整数,你不应该调用len()整数(因此错误):传递给的对象len()必须是一个序列或映射。

首先将其转换为字符串,使用str(),然后调用len(),以获取位数。

于 2013-09-24T23:32:49.637 回答
0

没有 len() 方法int, len() 用于序列

http://docs.python.org/2/library/functions.html#len

定义:返回对象的长度(项目数)。参数可以是序列(字符串、元组或列表)或映射(字典)。

于 2013-09-24T23:33:46.793 回答
0

好吧,粘贴实际的回溯很有用,这样我们就可以看到在堆栈中的哪个位置(以及代码中的哪一行)抛出了异常。

无论如何,在您的代码中多次询问整数的长度。例如

while len(iPinNo) < 4:

int类型没有长度。如果你想确保数字是 4 位数字,你可以这样做

while len(str(iPinNo)) < 4:

或者

while 999 < iPinNo < 10000:
于 2013-09-24T23:35:08.687 回答
0

要获取十进制数的位数,请使用(以 10 为底的)对数。

from math import log10, ceil
ceil(log10(iPinNo))

0 的对数是未定义的,因此您必须在测试长度之前对其进行检查。


无论如何,为什么不直接测试 10 的匹配功率呢?

while iPinNo < 10000:

或者

while iPinNo < 10**5
于 2013-09-24T23:37:58.127 回答