Módulo 1 · Lección 40 de 59
Importar módulos
Cómo traer a tu programa código que ya está escrito, las cuatro formas de importar y dónde colocar las importaciones.
Python trae de serie unas doscientas bibliotecas listas para usar: matemáticas, fechas, azar, ficheros, red, bases de datos, compresión. Se llama la biblioteca estándar, está instalada en tu ordenador desde el primer día y es la razón de que se hable de Python como un lenguaje "con las pilas incluidas".
Pero no está todo disponible de golpe. Si lo estuviera, cada programa arrancaría cargando cientos de miles de líneas que no va a usar y tendrías miles de nombres ocupados. Por eso hay que pedir explícitamente lo que necesitas, y eso es importar.
Qué es un módulo#
Un módulo es, literalmente, un fichero de Python. math es un fichero que alguien escribió con funciones matemáticas dentro; random, otro con funciones de azar. Cuando lo importas, Python lo ejecuta una vez y te da acceso a todo lo que ha quedado definido en él: funciones, constantes y lo que haya.
Un paquete es una carpeta con varios módulos dentro, como datetime o, más adelante, django. A efectos de uso se comportan igual.
import modulo#
La forma básica. Trae el módulo entero y se accede a su contenido con un punto:
import math
print(math.pi)
print(math.sqrt(144))
print(math.ceil(4.2))
print(math.floor(4.8))3.141592653589793
12.0
5
4El punto se lee como "de": math.sqrt es "la raíz cuadrada de math". No es un detalle cosmético, es lo que deja claro de dónde viene cada cosa. Cuando en un fichero de trescientas líneas lees math.floor(x), sabes exactamente dónde buscarlo.
Si olvidas el prefijo, Python no encuentra el nombre:
import math
print(sqrt(144))Traceback (most recent call last):
File "/Users/erwin/curso-python/calculos.py", line 3, in <module>
print(sqrt(144))
^^^^
NameError: name 'sqrt' is not definedfrom modulo import cosa#
Trae solo lo que le pides, y lo deja disponible directamente, sin prefijo:
from math import sqrt, pi
print(sqrt(144))
print(pi)12.0
3.141592653589793Es cómodo cuando usas dos o tres cosas de un módulo muchas veces. A cambio pierdes la pista de su origen: quien lea sqrt(144) a mitad del fichero tiene que subir hasta las importaciones para saber de dónde viene. Con módulos muy conocidos no pasa nada; con módulos oscuros, mejor el prefijo.
import modulo as alias#
Le pone un nombre más corto, o distinto si el original choca con algo tuyo:
import datetime as dt
hoy = dt.date(2026, 3, 15)
print(hoy)
print(hoy.year, hoy.month, hoy.day)2026-03-15
2026 3 15Hay alias que son prácticamente estándar y conviene respetar porque todo el mundo los reconoce: import numpy as np, import pandas as pd, import matplotlib.pyplot as plt. Inventarse alias propios para módulos con nombre corto, en cambio, solo confunde.
También funciona con from: from datetime import datetime as FechaHora.
from modulo import *#
Trae todo el contenido del módulo sin prefijo. Está permitido y es mala idea:
print(pow(2, 10))
from math import *
print(pow(2, 10))1024
1024.0La misma llamada da dos resultados distintos según en qué línea esté. El asterisco ha traído math.pow, que devuelve un decimal, y ha tapado la función pow que Python trae de serie, que devuelve un entero. Aquí la diferencia es leve; con otros nombres te cambia el comportamiento del programa sin un solo aviso.
Dónde van las importaciones#
PEP 8 es concreto: todas juntas, al principio del fichero, justo después del docstring y antes de cualquier otra cosa. Una por línea, y en tres grupos separados por una línea en blanco:
"""Informe mensual de ventas."""
import math
import random
from datetime import date
import requests
from utilidades import calcular_iva, formatear_euros
IVA_GENERAL = 0.21| Grupo | Qué contiene |
|---|---|
| 1 | Módulos de la biblioteca estándar: math, random, datetime, os... |
| 2 | Paquetes de terceros, los que instalas con pip |
| 3 | Módulos tuyos, de tu propio proyecto |
Dentro de cada grupo se ordenan alfabéticamente, y por costumbre los import modulo van antes que los from modulo import cosa.
Técnicamente puedes importar en cualquier punto del fichero, incluso dentro de una función, pero salvo casos muy concretos no hay motivo: al tenerlas todas arriba, cualquiera ve de un vistazo de qué depende tu programa.
Tres módulos para ver el mecanismo#
math#
Operaciones matemáticas que no están en los operadores básicos:
import math
print(math.sqrt(144))
print(math.trunc(4.8))
print(math.hypot(3, 4))
print(math.isclose(0.1 + 0.2, 0.3))
print(0.1 + 0.2 == 0.3)12.0
4
5.0
True
FalseLas dos últimas líneas resuelven un problema que viste en la lección de números: los decimales no se pueden comparar con == porque arrastran una imprecisión mínima. math.isclose compara admitiendo esa tolerancia, y es lo que hay que usar siempre con float.
random#
Azar. Muy útil para juegos, pruebas y datos de ejemplo:
import random
random.seed(7)
print(random.randint(1, 6))
print(random.choice(["Madrid", "Sevilla", "Bilbao"]))
baraja = ["as", "dos", "tres", "cuatro", "cinco"]
random.shuffle(baraja)
print(baraja)
print(random.sample(baraja, 2))3
Madrid
['dos', 'tres', 'cinco', 'as', 'cuatro']
['cinco', 'dos']randint(1, 6) da un entero entre 1 y 6, incluidos los dos extremos, a diferencia de range. choice saca un elemento al azar, shuffle desordena la lista en su sitio y no devuelve nada, y sample extrae varios sin repetir.
datetime#
Fechas y horas. Aquí se importan clases, no funciones, pero se usan igual:
from datetime import date, timedelta
hoy = date(2026, 3, 15)
plazo = timedelta(days=30)
vencimiento = hoy + plazo
print(vencimiento)
print(f"{vencimiento:%d/%m/%Y}")
print((vencimiento - hoy).days)2026-04-14
14/04/2026
30date.today() te da la fecha de hoy, pero aquí he puesto una fija para que la salida sea siempre la misma. Sumar un timedelta a una fecha da otra fecha, y restar dos fechas da un timedelta del que se puede sacar .days. Todo el lío de los meses de distinta duración y los años bisiestos está resuelto dentro.
El formato dentro de la f-string usa los códigos habituales: %d día, %m mes, %Y año de cuatro cifras, %H:%M hora y minutos.
Cuando el módulo no existe#
import pandasTraceback (most recent call last):
File "/Users/erwin/curso-python/informe.py", line 1, in <module>
import pandas
ModuleNotFoundError: No module named 'pandas'