In Python, a module is a file containing Python definitions and statements. Modules are used to group related code together, and they provide a way to organize code and make it more reusable.
Python comes with a large standard library that includes many useful modules, such as os for interacting with the operating system, sys for system-level operations, math for mathematical functions, and random for generating random numbers.
You can also create your own modules by defining functions, classes, and variables in a Python file, and then importing that file as a module in other Python code. Here's an example:
# mymodule.py
def say_hello(name):
print(f"Hello, {name}!")
PI = 3.14159
In this example, we define a module called mymodule that contains a function called say_hello() and a variable called PI. We can then use this module in other Python code by importing it with the import statement:
import mymodule
mymodule.say_hello("Alice") # Output: Hello, Alice!
print(mymodule.PI) # Output: 3.14159
In this example, we import the mymodule module and call the say_hello() function with the argument "Alice". We also print out the value of the PI variable in the mymodule module.
Python also provides a way to import specific functions or variables from a module using the from ... import statement. Here's an example:
from mymodule import say_hello
say_hello("Bob") # Output: Hello, Bob!
In this example, we import only the say_hello() function from the mymodule module using the from ... import statement, and then call the function with the argument "Bob". This is a useful way to import only the parts of a module that you need, and to avoid polluting your namespace with unnecessary names.
Namespacing in Python
In Python, a namespace is a mapping from names to objects, and it's used to avoid naming conflicts between different parts of a program. Every module has its own namespace, which is created when the module is imported. The global namespace is the namespace of the top-level code of a module or script.
Namespaces are hierarchical, which means that they can contain other namespaces. For example, a module's namespace can contain function and class namespaces, and a function's namespace can contain variable and function namespaces.
When you use a name in your code, Python looks for the name in the current namespace, and then in any parent namespaces. If the name is not found, Python raises a NameError.
Here's an example of how namespaces work in Python:
# mymodule.py
x = 10
def foo():
y = 20
print("x =", x) # Accesses x from the module namespace
print("y =", y) # Accesses y from the function namespace
foo()
print("x =", x) # Accesses x from the module namespace
print("y =", y) # Raises NameError: name 'y' is not defined
In this example, we define a module called mymodule that contains a variable called x and a function called foo(). The foo() function also defines a variable called y. When we call the foo() function, it accesses the x and y variables from its own namespace. When we try to print out the y variable outside of the foo() function, we get a NameError because y is not defined in the global namespace.
Namespaces are a powerful feature of Python that allow you to organize your code and avoid naming conflicts. By using namespaces effectively, you can write clear, modular, and reusable code.