2013-12-01 2 views
0

Я работаю над программой python для проверки серии паролей в документе, чтобы узнать, являются ли они действительными. Они должны иметь длину 7 символов, содержать по крайней мере 1 букву с верхним регистром, 1 строчную букву, букву, 1 номер и другие символы. По какой-то причине цикл for заканчивается после проверки только первого символа, и я не могу понять, в чем проблема. Может кто-нибудь взглянуть на мой код и помочь мне понять это?Программа проверки пароля, для проблем с контуром

def detectLength(word): 
    if len(word) >= 7: 
     return True 
    else: 
     return False 

def detectSpecial(word):   
    if word.isalnum: 
     return True 
    else: 
     return False 

def detectCapital(word): 
    for i in range(0, len(word)+1): 
     if (ord(word[i]) >= 65 and ord(word[i]) <= 90): 
      return True 
     else: 
      return False 

def detectLower(word): 
    for i in range(0, len(word)): 
     if (ord(word[i]) >= 97 and ord(word[i]) <= 122): 
      return True 
     else: 
      return False 

def detectDigit(word): 
    for i in word: 
     if ord(i) >= 40 and ord(i) <= 57: 
      return True 
     else: 
      return False 

def main(): 
    print(format("Password Attempt", '20s'), format("Validity Result", '17s'), format("Reason", '15s')) 
    print("======================================================") 
    word = input() 
    while word != "ZZZZ": 
     if detectLength(word) == False: 
      Validity, Reason = "Invalid", "Length" 
     elif detectSpecial(word) == False: 
      Validity, Reason = "Invalid", "Special Char"   
     elif detectCapital(word) == False: 
      Validity, Reason = "Invalid", "No Uppercase" 
     elif detectLower(word) == False: 
      Validity, Reason = "Invalid", "No Lowercase" 
     elif detectDigit(word) == False: 
      Validity, Reason = "Invalid", "No Digits" 
     else: 
      Validity, Reason = "Valid", "" 
     print(format(word, '20s'), format(Validity, '20s'), format(Reason, '14s')) 
     word = input() 
    print("======================================================") 

main() 
+1

Pro tip: сравнительные тесты уже возвращают 'True' или' False'; просто верните результат сравнения. Вам также необходимо * вызвать * 'word.isalnum()'. И вместо 'if something == False:', используйте 'if not something:'. –

+0

Да, word.isalnum() нужно было назвать, но теперь он говорит, что попытки пароля с заглавными буквами за пределами первой буквы не являются буквенно-цифровыми. –

ответ

0

Это из-за того, как вы структурируете свои петли. В detectCapital вы возвращаете False, если первый символ не является прописным. Вы должны вернуть True, если он в верхнем регистре, и если цикл закончен и не возвращается True, то ясно, что все буквы строчные и должны быть возвращены False. Как так:

def detectCapital(word): 
    for i in range(0, len(word)+1): 
     if (ord(word[i]) >= 65 and ord(word[i]) <= 90): 
      return True 
    return False 

У вас также есть та же проблема в detectLower и detectDigit.

+0

Спасибо! Он отлично работал, и я вижу свою ошибку! –

Смежные вопросы