Write a file named averages.py with several functions in it for computing averages of three values:

• mean(a, b, c) should compute the mean of a, b, and c.
• median(a, b, c) should compute the median of a, b, and c.
• rms(a, b, c) should compute the root-mean-square of a, b, and c.
• middle_average(a, b, c) should compute the mean, median, and rms of a, b, c; and then return the median of those three averages.

• rms invokes mean once.
• middle_average invokes mean and rms once each and median twice.

# 2 Example Invocations

When you run averages.py, nothing should happen. It defines functions, it does not run them.

If in another file (which you do not submit) you write the following:

import averages

print(averages.mean(1, 5, 1))
print(averages.median(1, 5, 1))
print(averages.rms(1, 5, 1))
print(averages.middle_average(1, 5, 1))

you should get the following output:

2.3333333333333335
1
3.0
2.3333333333333335

Don’t worry if you are off in the last few decimal places.

# 3 Thought Question

How often is each of the three averages the middle average? Are any of them always larger or always smaller than the others?

Can you use default values to allow your functions to work if only two arguments are supplied? To get you started, consider writing def mean(a, b, c=None):. If you get those working, what about allowing four or five values?

(Note: there is a way to have arbitrarily-long argument lists, but we won’t discuss the tuple construct it uses for a few weeks yet.)

There are many other averages; if you want additional practice, see how many of them you can get working.

# 4 Troubleshooting

Your mean function can be a single line, as it only does math.

Your median function will probably need several if statements.

Did you test out your median when all three argument values are the same?

For rms, recall that and that the exponentiation operator in Python is **.

Find yourself tempted to copy the contents of one function into another one? Your should invoke the copied function instead of copying it.