2016-10-12 5 views
1

Я посмотрел на другой пост, похожий на мой вопрос, Password check- Python 3, за исключением того, что мой вопрос включает проверку того, содержит ли пароль как прописные, так и строчные вопросы. Мой код следующий, но когда он выполняется, он не может распознать, что в нижнем и верхнем регистровом буквах указан пароль, он распознает только один тип. Как я получу его для распознавания обоих типов? Также существует более простой способ проверки кода, если все эти значения возникают без необходимости выполнять функции для каждого отдельного шага?В python, как вы проверяете, имеет ли строка как прописные, так и строчные буквы

def Get_Password(): 
    return input("Enter your desired password: ") 

def Count_Digits(password): 
    return sum(character.isdigit() for character in password) 

def Valid_password_length(password): 
    if len(password) >= 10: 
     return ('step1' == True) 
    else: 
     return ('step1' == False, print("Invalid password: too short")) 

def Valid_password_characters(password): 
    if password.isalnum(): 
     return ('step2' == True) 
    else: 
     return ('step2' == False, print("Invalid password: illegal character detected")) 

def Valid_password_numdigit(password): 
    if Count_Digits(password) >= 2: 
     return ('step3' == True) 
    else: 
     return ('step3' == False, print("Invalid password: Must have at least 2 digits")) 

def Valid_password_lowercase(password): 
    for i in (password): 
     if i.islower() == True: 
      return ('step4' == True) 
     else: 
      return ('step4' == False, print("Invalid password: No lowercase characters detected")) 

def Valid_password_uppercase(password): 
    for i in (password): 
     if i.isupper() == True: 
      return ('step5' == True) 
     else: 
      return ('step5' == False, print("Invalid password: No uppercase characters detected")) 

def password_checker(): 
    password = Get_Password() 
    Valid_password_length(password) 
    Valid_password_characters(password) 
    Valid_password_numdigit(password) 
    Valid_password_lowercase(password) 
    Valid_password_uppercase(password) 

    if 'step1' and 'step2' and 'step3' and 'step4' and 'step5' == True: 
     print("Congratulations! This password is valid") 

password_checker() 
+7

Почему вы должны 'Возвращение ('stepX' == True)'? Это то же самое, что и 'return False', поскольку строка не равна любому булевому. – mgilson

+0

Также вы возвращаете кортежи в ложных случаях. Чтобы добавить к этому, вы даже не проверяете возвращаемые значения функций. –

ответ

0
import sys 

def Valid_password_mixed_case(password): 
    letters = set(password) 
    mixed = any(letter.islower() for letter in letters) and any(letter.isupper() for letter in letters) 
    if not mixed: 
     print("Invalid password: Mixed case characters not detected", file=sys.stderr) 
    return mixed 

Комплексное решение:

import sys 

def Get_Password(): 
    return input("Enter your desired password: ") 

def Count_Digits(password): 
    return sum(1 for character in password if character.isdigit()) 

def Valid_password_length(password): 
    correct_length = len(password) >= 10 

    if not correct_length: 
     print("Invalid password: too short", file=sys.stderr) 

    return correct_length 

def Valid_password_characters(password): 
    correct_characters = password.isalnum() 

    if not correct_characters: 
     print("Invalid password: illegal character detected", file=sys.stderr) 

    return correct_characters 

def Valid_password_numdigit(password): 
    sufficient_digits = Count_Digits(password) >= 2 

    if not sufficient_digits: 
     print("Invalid password: Must have at least 2 digits", file=sys.stderr) 

    return sufficient_digits 

def Valid_password_mixed_case(password): 
    letters = set(password) 

    lower = any(letter.islower() for letter in letters) 
    upper = any(letter.isupper() for letter in letters) 

    if not upper: 
     print("Invalid password: No uppercase characters detected", file=sys.stderr) 

    if not lower: 
     print("Invalid password: No lowercase characters detected", file=sys.stderr) 

    return lower and upper 

def password_checker(): 
    password = Get_Password() 
    if Valid_password_length(password) and \ 
     Valid_password_characters(password) and \ 
     Valid_password_numdigit(password) and \ 
     Valid_password_mixed_case(password): 

     print("Congratulations! This password is valid") 

password_checker() 
0

Ваш вопрос просто ответить. Вы возвращаете вещи из формы return('steps' == True), которая всегда будет возвращать false. Поэтому просто замените их return True или return False.

Предполагая, что вы исправили вышеизложенное, ваш цикл также неисправен. Вы хотите вернуть false только после того, как вы пропустили всю строку. Рассмотрим пароль: ABCd. Он содержит строчный символ, но ваш чек-код нижнего регистра возвращает false, потому что первая буква имеет верхний регистр. Вы хотите просмотреть каждый символ в пароле, и если ни один из них не является строчным, верните значение false.

Если вы хотите более аккуратный способ сделать это, cdlane's answer - это хороший питонический путь.

-1

Вы можете использовать регулярное выражение:

т.е.:

def Valid_mixed_password(password): 
    lower = re.compile(r'.*[a-z]+') # Compile to match lowercase 
    upper = re.compile(r'.*[A-Z]+') # Compile to match uppercase 
    if lower.match(password) and upper.match(password): # if the password contains both (lowercase and uppercase letters) then return True 
     return True 
    else: # Else, the password does not contains uppercase and lowercase letters then return False 
     return False 

>>> print Valid_mixed_password("hello") 
False 
>>> print Valid_mixed_password("HELLO") 
False 
>>> print Valid_mixed_password("HellO") 
True 
>>> print Valid_mixed_password("heLLo") 
True 

Надеется, что это помогает.

0

Ответ на вопрос Break line not executing помечена как дублируется:

password = input('Enter your password') 
password_letters = list(password) 
upper = False 
lower = False 
name = 'Papa' 
surname = 'Johns' 

for letter in password_letters: 
    if letter.isupper(): 
     upper = True 
    elif letter.islower(): 
     lower = True 

    if upper and lower: 
     break 

if len(password) <= 5: 
    print('password is to short') 
elif name.lower() in password.lower() or surname.lower() in password.lower(): 
    print('You cannot have first or last name in password') 
elif not (upper and lower): 
    print('You must have both upper and lower case in password') 
else: 
    print('Password is valid') 
+0

что, если 'письмо' не письмо? ваш код помещает 'lower' в' True'. –

+0

Право Я отредактировал ответ. благодаря – epinal

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