import y from: organizar el código en módulos
Un módulo es simplemente un archivo .py. import lo carga. La diferencia entre `import math` y `from math import sqrt` va más allá de la sintaxis — afecta el namespace y la legibilidad.
import básico
import modulo carga el módulo y lo añade al namespace actual como un objeto. Para acceder a sus funciones y clases, usas modulo.nombre. Todo queda bajo el espacio de nombres del módulo — no hay colisiones.
import math
import random
import datetime
# Acceso con el prefijo del módulo — claro y sin ambigüedad
print(math.pi) # 3.141592653589793
print(math.sqrt(16)) # 4.0
print(math.floor(3.7)) # 3
# random
numero = random.randint(1, 10)
print(f"Número aleatorio: {numero}")
# datetime — el módulo contiene clases y funciones
hoy = datetime.date.today()
print(hoy) # 2026-05-03
# Inspeccionar qué hay en un módulo
print(dir(math)) # [..., 'ceil', 'cos', 'floor', 'pi', 'sqrt', ...]3.141592653589793
4.0
3
Número aleatorio: 7
2026-05-03Aunque escribas import math en diez archivos distintos, Python lo carga en memoria una sola vez y lo guarda en sys.modules. Los imports posteriores solo recuperan la referencia ya cargada — no releen el archivo.
from ... import ...
from modulo import nombre importa un nombre específico directamente al namespace actual. No necesitas el prefijo al usarlo, pero puede ocultar de dónde viene si el nombre es genérico.
from math import sqrt, pi, ceil
# Sin prefijo — más conciso cuando usas pocas cosas de un módulo
print(sqrt(25)) # 5.0
print(pi) # 3.141592653589793
print(ceil(3.2)) # 4
# Importar múltiples nombres
from datetime import date, timedelta, datetime
hoy = date.today()
manana = hoy + timedelta(days=1)
print(f"Hoy: {hoy}, Mañana: {manana}")
# from ... import * — importa todo (evitar en producción)
# from math import * # contamina el namespace — difícil saber de dónde viene cada nombre
# Importar una clase
from collections import defaultdict, Counter
palabras = ["python", "es", "python", "genial", "python"]
frecuencia = Counter(palabras)
print(frecuencia) # Counter({'python': 3, 'es': 1, 'genial': 1})5.0
3.141592653589793
4
Hoy: 2026-05-03, Mañana: 2026-05-04
Counter({'python': 3, 'es': 1, 'genial': 1})| import modulo | from modulo import nombre |
|---|---|
| import math math.sqrt(4) | from math import sqrt sqrt(4) |
| Claro de dónde viene. Recomendado cuando usas muchas cosas del módulo | Más conciso. Recomendado cuando usas 1-3 cosas específicas |
| Más verbose con módulos de nombre largo | Puede ocultar el origen si el nombre es genérico (ej: open, type) |
Alias con as
import modulo as alias o from modulo import nombre as alias crea un nombre alternativo. Útil para módulos con nombres largos o para evitar colisiones de nombres.
# Alias de módulo — convención estándar en la comunidad
import numpy as np # convención universal
import pandas as pd # convención universal
import matplotlib.pyplot as plt # convención universal
# Para módulos propios con nombres largos
import datetime as dt
ahora = dt.datetime.now()
print(ahora.strftime("%Y-%m-%d %H:%M"))
# Alias de nombre — cuando el nombre colisiona con algo local
from os.path import join as path_join
from urllib.parse import urljoin as url_join
ruta = path_join("/home", "usuario", "proyecto")
url = url_join("https://ejemplo.com/api/", "usuarios")
print(ruta) # /home/usuario/proyecto
print(url) # https://ejemplo.com/api/usuarios2026-05-03 14:30
/home/usuario/proyecto
https://ejemplo.com/api/usuariosImports relativos vs absolutos
En un paquete, puedes importar con rutas absolutas desde la raíz del proyecto o con rutas relativas (. para el mismo paquete, .. para el padre). Los absolutos son más claros; los relativos son útiles para evitar hard-codear el nombre del paquete.
# Estructura hipotética del proyecto:
# myapp/
# __init__.py
# utils.py
# models/
# __init__.py
# user.py
# product.py
# Desde myapp/models/user.py:
# Import absoluto — claro, funciona desde cualquier lugar
from myapp.utils import format_date, validate_email
# Import relativo — . significa "mismo directorio"
from . import product # importa myapp/models/product.py
from .product import Product # importa la clase Product
# Import relativo al padre — .. sube un nivel
from .. import utils # importa myapp/utils.py
from ..utils import format_date
# Cuándo usar cada uno:
# - Absolutos: preferidos en proyectos; más explícitos
# - Relativos: útiles dentro de un paquete para independizarlo de su nombrePEP 8 recomienda ordenar los imports en tres bloques separados por una línea en blanco: 1) módulos de la biblioteca estándar, 2) paquetes de terceros (pip), 3) módulos propios del proyecto. Herramientas como isort automatizan este orden.