TGrey
TGrey

Reputation: 33

Beginner Python Program Evaluating a Password

I am supposed to write a script with the following criteria: Write a function called validatePassword that takes a password string as a parameter and returns true or false. The function should only return true if:

I have this so far:

def validatePassword(pswd):

    if len(pswd)> 8:
            return True
    else:
            return False
    for char in pswd:
        if char in '01234567890':
            return True
    else:
            return False

    for char in pswd:
        if char in '!@#$%^&*()_+=':
            return True
    else:
            return False
    for char in pswd:
        if char.isupper and char .islower:
            return True
    else:
            return False
    return True

while False:
    print("There was an error with your password")
    print (validatePassword(Herseuclds))

I know that print (validatePassword(Herseuclds)) has a syntax error because I am missing the variable but I just don't get how to do this.

Upvotes: 3

Views: 1619

Answers (5)

jfs
jfs

Reputation: 414835

def valid_password(password):
    return (
        # The password is at least 8 characters
        len(password) >= 8 and 
        # The password contains at least one number
        any(c in "0123456789" for c in password) and 
        # The password contains at least one upper case letter
        any(c.isupper() for c in password) and 
        # The password contains a symbol one of the symbols !@#$%^&*()+=
        any(c in "!@#$%^&*()+=" for c in password))

Example:

from getpass import getpass

while not valid_password(getpass('Enter password: ')):
    print('invalid password. Try again')

Upvotes: 0

Leb
Leb

Reputation: 15953

Since you can use is.upper() you can also utilize is.digit() to check for numbers instead of having to write down actual digits.

Another thing to speed it up, since they all have to be done at the same time, you can check if the password validates those requirements in one line with any()

def validatePassword(pswd):

    l = []

    if len(pswd)> 8:
        for char in pswd:
            l.append(char)

    if any(l for x in l if x.isdigit()) and any(l for x in l if x.isupper()) and any(l for x in l if x in '!@#$%^&*()_+='):
        print('Success')

    else:
        print('Try again')

while True:
    a = input('What is your password?')
    validatePassword(a)

At the beginning there's an minimum check to see if the lengeth is greater than 8. If it is, the word gets broken up into a list. This allows any() to be used and checked against the remainding requirements.

Upvotes: 0

Hayley Guillou
Hayley Guillou

Reputation: 3973

First issue is that you are passing an undeclared variable to your function. See silentphoenix's answer for details.

Secondly, your program only check to see if AT LEAST ONE condition is met, not all.

If a password is 8 characters long, it will return true even if the password doesn't satisfy the other requirements.

I am not going to write your code for you, but I can pseudocode the issue:

def validatePassword(pswd):

    if len(pswd) < 8:
        return False

    # if there isn't a number:
        return False

    # if there isn't a symbol:
        return False

    # if there isn't an upper and lowercase:
        return False

    return True

while True:
    print("There was an error with your password")
    print (validatePassword("Herseuclds"))

sidenote: watch your indentation :)

Upvotes: 0

Jason
Jason

Reputation: 2733

def validatePassword(pswd):

    if len(pswd) < 8:
        return False

    number_in_password = False
    for char in pswd:
        if char in '012356789':
            number_in_password = True
    if not number_in_password:
        return False

    symbol_in_password = False
    for char in pswd:
        if char in '!@#$%^&*()_+=':
            symbol_in_password = True
    if not symbol_in_password:
        return False

    uppercase_in_password = False
    for char in pswd:
        if char.isupper():
            uppercase_in_password = True
    if not uppercase_in_password:
        return False

    #this only happens if nothing above has disqualified the password
    return True

print (validatePassword("herseuc"))
print (validatePassword("herseuclds"))
print (validatePassword("herseuclds!"))
print (validatePassword("herseuclds!123"))
print (validatePassword("herseuclds!123A"))

Upvotes: 3

Joseph Farah
Joseph Farah

Reputation: 2534

The main issue with your code is in the last line.

print (validatePassword(Herseuclds))

Right now, the interpreter thinks Herseuclds is a variable, and not a string. If Herseuclds is the password, and not a variable describing the password, then you need quotes around it to make it a string literal.

print (validatePassword("Herseuclds"))

You obviously haven't defined a variable called Herseuclds anywhere in your program, but the program thinks Herseuclds is a variable and not a string, so it throws the error.

Best of luck, and happy coding!

Upvotes: 1

Related Questions