Name three or more ways that functions can communicate results to a caller
Functions can send back results with return statements, by changing passed-in
mutable arguments, and by setting global variables. Globals are generally frowned
upon (except for very special cases, like multithreaded programs) because they can
make code more difficult to understand and use. return statements are usually
best, but changing mutables is fine, if expected. Functions may also communicate
with system devices such as files and sockets, but these are beyond our scope here.