I suspect everyone has had the experience of signing up for account at a website and being told that your preferred username is taken. Assume we have a list of existing usernames, let’s write some code to prompt the user to pick a username, and to keep prompting them until they pick a username that hasn’t already been taken.
Our first step is to think about what data structure would be best. Since we
need to test for membership, a set is an efficient choice (recall from previous classes
that membership operations are very fast on sets). Our second step is to think
about what kind of loop we will need to prompt and, if necessary, re-prompt the
user. Since we we don’t know how many tries it will take, we will need a while
loop.
Try it out before looking at the code…
existing_usernames = { "mlinderman", "rlichenstein" }
username = input("Enter your desired username: ")
while username in existing_usernames:
# Keep prompting for a new username as long as response
# is in set of existing username
print(username + " is already taken, pick a different name")
username = input("Enter your desired username: ")
# At this point we know that the username is new (that is not
# in the set of existing usernames). Add it to the set so that
# it is now "taken"
existing_usernames.add(username)
print("You have successfully registered: " + username)
Notice the use of the while
loop to re-prompt the user if the name they
entered is taken. What do we know about username
“after” the loop? That it
must be novel (that is not previously taken). At that point we can now proceed
with any operations that depend on our new username. I think you will want to
use a similar pattern in your lab to obtain a valid guess from the user.
Let’s think about the example for insert_letter
>>> insert_letter("a", "__n_n_", "banana")
'_anana'
Here the current “underscored” word is a kind of state. What properties of the game are embedded in this state? For example, can we tell if the user has won? How?
Let’s develop a function has_won
that takes the example hidden string as an
argument and returns a boolean indicating if the user has won.
def has_won(working_word, guess_word):
return working == guess_word
Why does this work? Recall that the working word maintains the “state” of the letters that haven’t been guessed (as underscores) and that winning is then the same as having replaced all of the underscores.