1. Given the list definition

my_list = [4, 8, 16, 2, 7, 9]

what would each of the following display (or not that an error would occur):

print(my_list[1])
print(my_list[4])
print(my_list[6])
print(my_list[len(my_list)-1]
print(my_list[-1]
print(my_list[1:5])
print(my_list[-3:-1])

a. 8
b. 7
c. Error
d. 9
e. 9
f. [8, 16, 2, 7]
g. [2, 7]


2. Write docstrings for the following methods describing what each of them do:
a.
def mystery1(num1, num2):
    l = []

    for i in range(num1):
        l.append(num2)

    return l

b.
def mystery2(num1, num2):
    return [num2]*num1

3. Given the following function:

def mystery(sequence):
  result = ""

  for val in sequence:
    result = result + val + val

  return result


For each of the following calls, state what would be returned (or an error):

a. mystery(5)
b. mystery([1, 2, 3])
c. mystery("abcd")
d. mystery(("apples", "bananas"))
e. mystery(["apples", "bananas"])
f. mystery("123")

4. Modify the name_analysis function so that it captures all capitalization variants
of "Dave" or "David" (or you can change it to your favorite name instead :).  Hint:
rather than try and enumerate all possible variants (like "DaviD"), an easier
approach is to lowercase the input (using the lower() method) and then do 
the comparison on the lowercased string.

5. Write a function called my_max that takes a list of numbers (positive or negative)
and returns the largest value.  You may assume that the list is non-empty, i.e. has
at least one value in it.  Take a look at the version we wrote in class for
calculating the max of a list of positive numbers.

Hint: we know that the max has to be one of the elements in the list.