All course materials and instructions are available in Canvas this year.
In a previous project, we wrote a password generator. Our generator created random passwords that met the PPS standard, which is: passwords should be at least 8 characters long, and they should include at least 3 of these 4 categories: number, uppercase letter, lowercase letter, symbol. One extra rule that we’re adding in this project is that passwords should NOT contain your PPS username or student ID number.
In this project, we’ll be writing a program that lets the user type in a password to see whether it’s good or not. If the password is good, the program will print out GOOD; otherwise, the program will print out BAD.
Your program will look something like this:
Enter your username (e.g. jrheard): jrheard Enter your student ID (e.g. 123456): 123456 Enter the password you'd like to have checked: CarlsjRHeard! BAD Enter your username (e.g. jrheard): jrheard Enter your student ID (e.g. 123456): 123456 Enter the password you'd like to have checked: jioafe#@ox.P GOODThe last line of your output MUST be GOOD or BAD.
Download this project’s starter code and open it in IDLE.
The starter code has two functions:
is_password_good(password, username, student_id) main()Good passwords should be at least 8 characters long, include at least 3 of these 4 categories: number, uppercase letter, lowercase letter, symbol, and NOT contain the username or ID. If a password doesn't meet any of those requirements, it is a bad password.
For this project, a “symbol” is one of these: !@#$%^&*()-_=+,.
All your code should be contained in the 2 given functions. Each function has its own requirements.
Your password-checking code will go in the is_password_good(password, username, student_id) function.
This function should:
'my_bad-password', a username like 'jrheard', and a student ID number like '123456'True if the password meets ALL the PPS password requirements listed aboveFalse if it does not meet all the requirementsRemember that False isn’t the same thing as 'False'. The Boolean values True and False don’t have quote marks around them.
The rest of your code, like user input and print statements, will go in main().
This function is called for you at the bottom of the starter code, so it will run every time you run your code.
In this function, you should:
is_password_good function with appropriate inputsGOOD if the password passed all the tests, and print BAD if notGOOD or BAD These code snippets are hints. They solve problems that are really similar to, but not quite the same as the problems you’ll be solving in this assignment. You will need to think about these snippets and make changes to them or rewrite them entirely from scratch. Don’t just copy-paste them into your program and expect them to work.
You will definitely be looping over each letter of the password and doing something based on the letters you see.
Here’s how to loop over each letter of a string and do something with each letter:
word = "Pizza"for letter in word: # Loop over each letter of the string.... print(letter) # ...and *do something* with that letter. (You probably won't be printing it.)Output: P i z z aYou can check to see if one string is in another string using Python’s in operator, like this:
# `in` works for single letters...print('z' in 'Pizza') # Output: Trueprint('f' in 'Pizza') # Output: False# ...and also for longer strings.print('llo' in 'Hello') # Output: Trueprint('potatoes' in 'Hello') # Output: FalseNotice that you get a result of True or False, so you could use this code as a condition in an if statement if you wanted to.
How might you use this technique to see if, for example, a letter is an uppercase letter or a symbol?
In order to check that a password meets the PPS criteria, you’ll want to loop over each character of the password and write some code that keeps track of whether the password has any lowercase letters, uppercase letters, symbols, or numbers.
Here’s a bit of code that checks to see how many 'z's there are in a particular string:
word = "Pizza"count = 0for letter in word: if letter == 'z': # You could check whether the letter is a symbol, number, etc here count += 1print(count)Output: 2Remember, though, that we don’t care about how many uppercase letters are in a password; we just care about whether or not there are any. Here's another way to think about this.
word = "Pizza"contains_zs = Falsefor letter in word: if letter == 'z': # You could check whether the letter is a symbol, number, etc here contains_zs == Trueif contains_zs: # Remember, this is just an example... print("This word has at least one z." # ...your if statement would do something differentelse: print("This word has NO z's."Output: This word has at least one z.We added a rule that the username and ID number are not allowed in the password, so if my username is jrheard and my student ID is 123456, then these are BAD passwords:
CarlsjRHeard!Password123456Here’s one slightly tricky thing about this part of the project: my username is "jrheard", and the password "CarlsjRHeard!" is invalid, but Python thinks and are two different things because strings are case sensitive:
print("jrheard" == "jRHeard") # Output: FalseYour password checker should be able to tell if a password contains your username, even if the password’s capitalization is different. One way to handle this problem is to call a string’s .lower() or .upper() method, like this:
print("jRHeard".lower()) # Output: jrheardprint("jRHeard".upper()) # Output: JRHEARD You will definitely be using this technique in your program.
How might you use .lower() or .upper() to deal with the fact that string comparison in Python is case sensitive?
As you’re working on your program, you might find it useful to add some extra print() calls that print out what programmers call “debug information” to help you understand what your program’s actually doing.
For instance:
Enter your username (e.g. jrheard): jrheard Enter your student ID (e.g. 123456): 123456 Enter the password you'd like to have checked: CarlsjRHeard! password length is 13 3 categories of character in password student info contained in password: True BAD Enter your username (e.g. jrheard): jrheard Enter your student ID (e.g. 123456): 123456 Enter the password you'd like to have checked: jiaoweijfoaw.329xA password length is 18 4 categories of character in password student info contained in password: False GOODIt’s OK to leave extra print() calls in your code as long as the last line of your checker’s output says the word GOOD or the word BAD, with NOTHING ELSE on or after that line, like you see in the example above.
Before submitting your project, review the rubric and make sure to test your program a bunch of times to make sure it works!
Try coming up with some passwords that you know should be marked GOOD ('r4J9uqpm') and some passwords that you know should be marked BAD ('a!A', 'a!AuSerNaMe') and put them into your program to make sure that it marks them correctly.
Your CODE should follow the style guidelines. The part about descriptive variable names is important! For instance:
n is a bad variable name, username is a good one.ns is a bad variable name, number_of_symbols is a good one.On the first line of that file, write a comment with your name on it, like this:
# Tamara O'MalleyOn Google Classroom, submit your program in a file called checker_your name.py. For instance, I might submit a file called checker_Tamara.py.
The projects in this class were created by JR Heard, a TEALS volunteer at Madison, 2017-2019. His version of this project lives at https://blog.jrheard.com/python/password-checker .
A note from JR: If you’d like to learn more about how I wrote these tests, here’s a talk I gave about this topic at the Portland Python meetup. It’s the best talk I’ve ever given, I’m really proud of it, consider watching it sometime!