To use a function or type from a python library, rather than a built-in function or type, we have to import the library.
--------------------------------------------------------------------------- NameError Traceback (most recent call last) /tmp/ipykernel_9275/750117777.py in <module> ----> 1 math.sin(1.6) NameError: name 'math' is not defined
We call these libraries modules:
The tools supplied by a module are attributes of the module, and as such, are accessed with a dot.
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
They include properties as well as functions:
You can always find out where on your storage medium a library has been imported from:
import does not install libraries. It just makes them available to your current notebook session, assuming they are already installed. Installing libraries is harder, and we'll cover it later.
So what libraries are available? Until you install more, you might have just the modules that come with Python, the standard library.
If you installed via Anaconda, then you also have access to a bunch of modules that are commonly used in research.
Supplementary Materials: Review the list of modules that are packaged with Anaconda by default on different architectures (modules installed by default are shown with ticks).
We'll see later how to add more libraries to our setup.
Why bother with modules? Why not just have everything available all the time?
The answer is that there are only so many names available! Without a module system, every time I made a variable whose name matched a function in a library, I'd lose access to it. In the olden days, people ended up having to make really long variable names, thinking their names would be unique, and they still ended up with "name clashes". The module mechanism avoids this.
Still, it can be annoying to have to write
math.sin(math.pi) instead of
Things can be imported from modules to become part of the current module:
import math math.sin(math.pi)
from math import sin sin(math.pi)
Importing one-by-one like this is a nice compromise between typing and risk of name clashes.
It is possible to import everything from a module, but you risk name clashes.
from math import * sin(pi)
You can rename things as you import them to avoid clashes or for typing convenience
import math as m m.cos(0)
pi = 3 from math import pi as realpi print(sin(pi), sin(realpi))