Modularity is an important property for anything but trivial software systems as it gives us the power to make self-contained, reusable pieces which can be combined in new ways to solve different problems. In Python, as with most programming languages, the most fine-grained modularization facility is the definition of reusable functions. But Python also gives us several other powerful modularization mechanisms.
Collections of related functions are themselves grouped together a form modularity called modules. Modules are source code files that can be referenced by other modules, allowing the functions defined in one module to be re-used in another. So long as you take care to avoid any circular dependencies, modules are a simple and flexible way to organize programs.
In previous chapters we've seen that we can import modules into the REPL. We'll also show you...