This example works as a birthday reminder. <br>It demonstrates the use of dictionaries and several other things (like functions) already covered in the existing examples, but now put in a larger program.<br><br>PS. I now notice I&#39;ve pushed this code with &quot;switch&quot; in comments instead of &quot;if-else&quot;, I&#39;ll change that.<br>

<br>Dinko Galetic<br><br>diff --git a/data/GSOC examples/birthday reminder b/data/GSOC examples/birthday <br>new file mode 100644<br>index 0000000..eca9458<br>--- /dev/null<br>+++ b/data/GSOC examples/birthday reminder      <br>

@@ -0,0 +1,201 @@<br>+# The purpose of this example is to demonstrate what is a dictionary in Python.<br>+# This will also cover:<br>+    # functions,<br>+    # switch, and<br>+    # writing to text files.<br>+<br>+<br>+# This function adds a birthday to the list of birthdays.<br>

+# Simple, isn&#39;t it? <br>+# There&#39;s one flaw, though: In case we&#39;ve already stored the data for that<br>+# person, it will overwrite that data.<br>+def add_birthday(person, day, birthdays):<br>+    birthdays[person] = day<br>

+<br>+# This does the same as the previous function, but checks if we already have<br>+# the birthday of that person remembered and warns us in that case.<br>+# Practice: This function is not used in this example, only defined. <br>

+# Could you change the code so that it is used instead of <br>+# the default &quot;add_birthday&quot; function?<br>+def add_birthday_safer(person, day, birthdays):<br>+    if birthdays.has_key(person):<br>+        print &quot;You&#39;ve already entered &quot; + person + &quot;&#39;s birthday as:&quot;, <br>

+        print birthdays[person]<br>+        print &quot;Would you like to overwrite that with &quot; + day + &quot; (y/n)?&quot;<br>+        response = raw_input(&quot;Response: &quot;)<br>+        # Practice: Add some more possible answers (like with capital letters)<br>

+        if response == &quot;n&quot; or response == &quot;no&quot;:<br>+            # &quot;return&quot; marks the end of the function<br>+            return<br>+        else:<br>+            birthdays[person] = day       <br>

+<br>+# To change an existing record: just overwrite whatever was there before! <br>+# It will simply add a new record if there wasn&#39;t a person with the given name,<br>+# and that is fine. Because of that, we don&#39;t have to check if the record exist<br>

+def change_birthday(person, day, birthdays):<br>+    birthdays[person] = day<br>+<br>+# This function deletes a birthday.<br>+def forget_birthday(person, birthdays):<br>+    if birthdays.has_key(person):<br>+        del birthdays[person]<br>

+    else:<br>+        print &quot;No such person.&quot;<br>+<br>+# This function check if it&#39;s anyone&#39;s birthday today.<br>+def check_birthdays(birthdays):<br>+    # this will get us the today&#39;s date in the form ddmm, the same<br>

+    # as we enter it. We don&#39;t need the year, most people have birthdays<br>+    # each year. :) <br>+    # Practice: Who doesn&#39;t?<br>+    today = time.strftime(&quot;%d%m&quot;)<br>+<br>+    none_today = True<br>

+<br>+    for person in birthdays:<br>+        bday = birthdays[person]<br>+        # How do we know which birthday is it? <br>+        # Easy: current year - birth year.<br>+        # time.strftime(&quot;%Y&quot;) gets us the current year, and the birth year<br>

+        # is written in &quot;bday&quot; variable, from 4th index to the last.<br>+        # Since both are written as strings, we have to turn them to numbers<br>+        # before we can subtract them, and we do that by passing them to the in<br>

+        # function. When they are subtracted, turn the result back into a strin<br>+        # by passing it to the str() function. <br>+        which = str( int(time.strftime(&quot;%Y&quot;)) - int(bday[4:]) ) <br>+<br>
+        if bday[0:4] == today:<br>
+            print &quot;It&#39;s &quot; + person + &quot;&#39;s &quot; + which + &quot;. birthday, yay!&quot;<br>+            none_today = False<br>+<br>+    if none_today:<br>+        print &quot;No birthdays today.&quot;<br>

+<br>+# Practice: Could we make the output of this function nicer? <br>+# For example, change it to the form of dd.mm.yyyy instead of ddmmyyy ?<br>+def print_birthdays(birthdays):<br>+    for person, day in birthdays.items():<br>

+        print person + &quot; was born on &quot; + day + &quot;.&quot;<br>+    if len(birthdays.items()) == 0:<br>+        print &quot;There are no birthdays memorised.&quot;<br>+<br>+# This function takes a name and finds that person&#39;s birthday.<br>

+def find_birthday(name, birthdays):<br>+    if birthdays.has_key(name):<br>+        print name + &quot;&#39;s birthday is on: &quot; + birthdays[name]<br>+    else:<br>+        print &quot;You never entered &quot; + name + &quot;&#39;s birthday!&quot;<br>

+<br>+<br>+def save_to_file(filename, bdays):<br>+    # Warning: If there already exists a file with this name, opening it in &quot;w&quot;<br>+    # mode will delete the existing file and create a blank one!<br>+    # Opening in &quot;a&quot;ppend mode adds everything to the end of an existing file, <br>

+    # but we won&#39;t use it here.<br>+    # Practice: Try writing a program which appends to text files to see how it<br>+    f = open(filename, &quot;w&quot;)<br>+    # Practice: What does str(bdays) give us? Try it on a dictionary variable!<br>

+    text = str(bdays)<br>+    f.write(text)<br>+    f.close()<br>+        <br>+def load_from_file(filename):<br>+    my_file = open(filename, &quot;r&quot;)<br>+    text_from_file = my_file.read()<br>+<br>+    # eval() takes text and then runs it as if it were Python code.<br>

+    # For us, it will turn a textual representation of a dictionary to a functi<br>+    # Python dictionary.<br>+    bday_dictionary = eval(text_from_file)<br>+<br>+    # Return that to whoever called load_from_file() in the first place.<br>

+    return bday_dictionary<br>+<br>+# This function displays the menu which you see when you run the program.<br>+def menu():<br>+    # Here we will store all the birthday data. Notice the {} - that&#39;s how we<br>+    # define that a variable is a dictionary. <br>

+    # This will get us an empty dictionary, and we&#39;ll see how to fill it<br>+    # with data in a moment.<br>+    birthdays = {}<br>+    <br>+    # We&#39;ll display the menu in an infinite loop.<br>+    # The condition in while() will always be true, since it&#39;s, well.. True.<br>

+    # The entire function, though, will end when the user enters &quot;7&quot;.<br>+    while (True):    <br>+        # Print thirty # and move to a new line.<br>+        print &quot;#&quot; * 60 + &quot;\n&quot;<br>+        print &quot;Please choose from the following: &quot;<br>

+        print &quot;\t1. Print all birthdays we have remembered.&quot;<br>+        print &quot;\t2. Check if someone&#39;s birthday is today.&quot;<br>+        print &quot;\t3. Find someone&#39;s birthday.&quot;<br>+        print &quot;\t4. Add a new birthday.&quot;<br>

+        print &quot;\t5. Change the data for an existing birthday.&quot;<br>+        print &quot;\t6. Delete an existing birthday.&quot;<br>+        print &quot;\t7. Write all birthdays to a file.&quot;<br>+        print &quot;\t8. Load birthdays from a file.&quot;<br>

+        print &quot;\t9. Exit.&quot;<br>+        choice = raw_input(&quot;Your choice: &quot;)<br>+        if choice == &quot;1&quot;:<br>+            print_birthdays(birthdays)    <br>+<br>+        elif choice == &quot;2&quot;:<br>

+            check_birthdays(birthdays)<br>+<br>+        elif choice == &quot;3&quot;:<br>+            print &quot;Enter your friend&#39;s name: &quot;<br>+            name = raw_input()        <br>+            find_birthday(name, birthdays)<br>

+<br>+        elif choice ==  &quot;4&quot;:<br>+            print &quot;Enter your friend&#39;s name: &quot;<br>+            name = raw_input()<br>+            print &quot;Enter &quot; + name + &quot;&#39;s birthday (ddmmyyyy): &quot;<br>

+            birthday = raw_input()<br>+            add_birthday(name, birthday, birthdays)<br>+<br>+        elif choice == &quot;5&quot;:<br>+            print &quot;Enter your friend&#39;s name: &quot;<br>+            name = raw_input()<br>

+            print &quot;Enter &quot; + name + &quot;&#39;s birthday (ddmmyyyy): &quot;<br>+            birthday = raw_input()<br>+            change_birthday(name, birthday, birthdays)<br>+<br>+        elif choice == &quot;6&quot;:<br>

+            print &quot;Enter your friend&#39;s name: &quot;<br>+            name = raw_input()<br>+            forget_birthday(name, birthdays)<br>+<br>+        elif choice == &quot;7&quot;: <br>+            print &quot;Enter the name of the file in which to store: &quot;<br>

+            filename = raw_input()<br>+            print &quot;Location of that file (can be blank): &quot;<br>+            filename = raw_input() + filename<br>+            save_to_file(filename, birthdays)<br>+    <br>

+        elif choice == &quot;8&quot;:<br>+            print &quot;Name of the file with stored birthdays: &quot;<br>+            filename = raw_input()<br>+            print &quot;Location of that file (can be blank): &quot;<br>

+            filename = raw_input() + filename<br>+            # Warning! Doing this will overwrite anything we&#39;re put in our dict<br>+            # so far with that is saved in that file.<br>+            birthdays = load_from_file(filename)<br>

+<br>+        # Practice: Currently, there&#39;s no way for a user to load data from two<br>+        # different files at once. It would be possible to ask for two filename<br>+        # a write a function which would take those two filenames, read from bo<br>

+        # files and combine their content into one dictionary.<br>+        # A hint: dictionaries have a method called &quot;update&quot;, <br>+        # look it up to see what it does!<br>+<br>+        elif choice == &quot;9&quot;:<br>

+            return<br>+<br>+# This is where our program starts executing. It enters the menu() function and<br>+# runs it until you choose to leave.<br>+print &quot;Welcome to the birthday reminder.&quot;<br>+import time<br>

+menu()<br>+print &quot;Exiting the birthday reminder... Bye!&quot;<br><br>