Python desde cero: el lenguaje que da vida a tu app
Mini curso completo · Fundamentos reales + buenas prácticas profesionales Cursos de seguimiento: Luis Martínez en Platzi
0. Modelo mental correcto
El objetivo de este curso no es solo que tu código funcione, sino que esté bien escrito.
Python tiene una filosofía clara desde su diseño: el código debe ser legible, explícito y consistente. Eso no es opcional si quieres trabajar en equipo o crecer como desarrollador.
Python es un lenguaje:
| Característica | Qué significa |
|---|---|
| Interpretado | El código se ejecuta línea a línea, sin compilar primero |
| Dinámicamente tipado | El tipo de una variable se determina en tiempo de ejecución |
| Fuertemente tipado | No mezcla tipos incompatibles de forma silenciosa |
| Basado en indentación | La estructura del código define los bloques lógicos |
| Con filosofía propia | PEP 8 y el Zen de Python guían cómo escribirlo |
💡 Aprenderás a escribir código que cualquier desarrollador profesional pueda leer y mantener.
1. ¿Dónde y cómo corre Python?
Python puede ejecutarse de varias formas:
- REPL: consola interactiva, ideal para explorar y probar ideas rápido.
- Archivo
.py: el modo estándar para proyectos reales. - Bytecode
.pyc: lo que Python genera internamente para optimizar la ejecución. - Jupyter Notebook: muy usado en ciencia de datos e investigación.
Sin importar dónde corra tu código, el estándar de escritura es siempre el mismo. Ahí es donde entra PEP 8.
🎓 ¿Quieres profundizar en los fundamentos desde el inicio? → Curso de Fundamentos de Python en Platzi
2. Primera línea de código
print("Bienvenido a mi app")
Sencillo y directo. Ahora veamos el primer error clásico:
# ❌ Esto falla
Print("Hola")
NameError: name 'Print' is not defined
⚠️ Python es case-sensitive.
3. Indentación: parte del lenguaje
En la mayoría de los lenguajes, la indentación es cosmética. En Python, es sintaxis. Define los bloques de código y no puede omitirse.
✅ Correcto
edad = 20
if edad >= 18:
print("Acceso permitido")
❌ Incorrecto
if edad >= 18:
print("Acceso permitido")
IndentationError: expected an indented block
Python no permite bloques ambiguos. Esta restricción, lejos de ser una limitación, produce código visualmente consistente en cualquier proyecto.
¿Cuántos espacios?
El estándar oficial (PEP 8) establece:
- 4 espacios por nivel de indentación
- No mezclar tabulaciones con espacios
- Configura tu editor para que las tabs se conviertan automáticamente en 4 espacios
4. PEP 8: escribir Python profesional
PEP 8 es el documento que define el estilo oficial de Python. No es obligatorio para que el código corra, pero sí es esperado en cualquier entorno profesional.
🎓 Para profundizar en PEP 8 y manejo profesional del entorno: Python Intermedio: entornos virtuales y PEP 8 · Luis Martínez en Platzi
"El código se lee muchas más veces de las que se escribe." · Guido van Rossum
4.1 Nombres de variables
Las convenciones de nomenclatura son consistentes y predecibles:
| Tipo | Convención | Ejemplo |
|---|---|---|
| Variables | snake_case | edad_usuario |
| Constantes | MAYÚSCULAS | PRECIO_MAXIMO |
| Clases | PascalCase | UsuarioActivo |
| Funciones | snake_case | calcular_total() |
# ✅ Correcto
edad_usuario = 20
precio_final = 100
TASA_IVA = 0.19
# ❌ Incorrecto
EdadUsuario = 20
PRECIOFINAL = 100
tasaiva = 0.19
4.2 Espacios alrededor de operadores
# ✅ Correcto
resultado = a + b
precio_con_iva = precio * (1 + TASA_IVA)
# ❌ Incorrecto
resultado=a+b
precio_con_iva=precio*(1+TASA_IVA)
4.3 Longitud de línea
PEP 8 recomienda un máximo de 79–88 caracteres por línea. Si una línea es demasiado larga, divídela:
# ✅ Correcto: línea larga dividida con paréntesis
mensaje = (
f"Hola, {nombre_usuario}. "
f"Tu saldo actual es: ${saldo_disponible}"
)
Código legible siempre es mejor que código compacto.
4.4 Separación entre funciones
Dos líneas en blanco entre funciones de nivel superior. Una línea en blanco entre métodos dentro de una clase.
def funcion_uno():
pass
def funcion_dos():
pass
5. Comentarios bien hechos
Un buen comentario explica por qué, no lo que el código ya dice por sí solo.
# ❌ Comentario obvio (no aporta nada)
x = x + 1 # suma 1 a x
# ✅ Comentario útil: explica la intención o regla de negocio
edad_minima = 18 # Regla de negocio: solo mayores de edad pueden acceder
Docstrings
Para funciones y clases, usa docstrings en lugar de comentarios inline:
def puede_acceder(usuario):
"""
Determina si un usuario puede acceder al sistema.
Reglas:
- Debe ser mayor o igual a 18 años
- Debe tener la cuenta activa
Args:
usuario (dict): Diccionario con 'edad' y 'activo'
Returns:
bool: True si el usuario puede acceder, False en caso contrario
"""
return usuario["edad"] >= 18 and usuario["activo"]
💡 Los docstrings son los que generan la documentación automática. Invertir tiempo en ellos paga dividendos enormes.
6. Tipado dinámico y fuerte
Dinámico: el tipo cambia en tiempo de ejecución
x = 10
print(type(x)) # <class 'int'>
x = "Hola"
print(type(x)) # <class 'str'>
La variable x no tiene un tipo fijo. Python lo resuelve en cada línea.
Fuerte: no mezcla tipos de forma silenciosa
# ❌ Esto falla (y debe fallar)
"5" + 1
TypeError: can only concatenate str (not "int") to str
Python no adivina qué quisiste hacer. Si quieres sumar, convierte explícitamente:
# ✅ Correcto
int("5") + 1 # → 6
Tipado fuerte significa que Python te protege de errores sutiles. Aprovéchalo.
7. Modelo de asignación y mutabilidad
Este es uno de los conceptos que más confunde a quienes vienen de otros lenguajes. Observa:
a = [1, 2, 3]
b = a # b apunta al mismo objeto, no a una copia
b.append(4)
print(a) # [1, 2, 3, 4] (¡también cambió!)
print(b) # [1, 2, 3, 4]
a y b son dos nombres que apuntan al mismo objeto en memoria. Si quieres una copia independiente:
# ✅ Copia independiente
b = a.copy()
b.append(4)
print(a) # [1, 2, 3] (sin cambios)
print(b) # [1, 2, 3, 4]
⚠️ Entender la diferencia entre asignación y copia es clave para evitar bugs difíciles de detectar.
8. Control de flujo
La claridad visual es parte del diseño del lenguaje:
if edad >= 18:
print("Mayor de edad: acceso permitido")
elif edad >= 13:
print("Adolescente: acceso limitado")
else:
print("Menor de edad: acceso denegado")
Cada bloque está claramente delimitado por la indentación. No hay llaves ni end. El código habla por sí solo.
9. Bucles con estilo
Nombres descriptivos en los bucles
# ✅ Descriptivo y claro
for usuario in usuarios:
print(usuario["nombre"])
# ❌ Solo aceptable si el contexto lo justifica claramente
for u in usuarios:
print(u)
Usa nombres cortos como u, i, o x solo cuando el contexto es inequívoco y el bloque es muy corto. En general, la claridad gana.
enumerate cuando necesitas el índice
for indice, usuario in enumerate(usuarios):
print(f"{indice + 1}. {usuario['nombre']}")
10. Proyecto integrador
Todo lo que aprendiste, junto. Una mini app de gestión de tareas escrita con estilo profesional:
# Simulación de base de datos en memoria
tareas = []
def agregar_tarea(descripcion):
"""
Crea una nueva tarea pendiente y la agrega a la lista.
Args:
descripcion (str): Texto que describe la tarea
"""
tarea = {
"descripcion": descripcion,
"completada": False,
}
tareas.append(tarea)
def listar_tareas():
"""
Muestra todas las tareas registradas con su estado actual.
"""
if not tareas:
print("No hay tareas registradas.")
return
for indice, tarea in enumerate(tareas):
estado = "✔" if tarea["completada"] else "✘"
print(f" {indice + 1}. [{estado}] {tarea['descripcion']}")
def completar_tarea(indice):
"""
Marca una tarea como completada dado su índice.
Args:
indice (int): Posición de la tarea en la lista (0-based)
"""
if 0 <= indice < len(tareas):
tareas[indice]["completada"] = True
else:
print("Índice fuera de rango.")
# Ciclo principal de la aplicación
while True:
print("\n--- Gestor de Tareas ---")
print("1. Agregar tarea")
print("2. Listar tareas")
print("3. Salir")
opcion = input("\nElige una opción: ")
if opcion == "1":
descripcion = input("Descripción de la tarea: ")
agregar_tarea(descripcion)
print("✔ Tarea agregada.")
elif opcion == "2":
listar_tareas()
elif opcion == "3":
print("¡Hasta luego!")
break
else:
print("Opción no válida. Intenta de nuevo.")
Lo que este código demuestra
- Variables con nombres descriptivos en
snake_case - Funciones con docstrings completos
- Separación correcta entre funciones (2 líneas en blanco)
- Validación de entradas del usuario
- Comentarios que explican intención, no lo obvio
- Estructura clara y navegable
📁 ¿Listo para subir este proyecto a GitHub? Aprende a hacerlo con el Curso de Git y GitHub en Platzi.
🏗️ ¿Quieres estructurar proyectos más grandes con módulos y paquetes propios? → Python Avanzado: Arquitectura de Proyectos y PyPI · Luis Martínez en Platzi
🧪 ¿Tu app funciona? Ahora asegúrate de que siempre funcione → Unit Testing en Python · Luis Martínez en Platzi
Cierre
Llegaste al final del mini curso. Esto es lo que tienes ahora en tu caja de herramientas:
| Concepto | Qué aprendiste |
|---|---|
| Intérprete y bytecode | Cómo Python ejecuta tu código internamente |
| Tipado dinámico | El tipo se resuelve en ejecución |
| Tipado fuerte | Python no mezcla tipos incompatibles |
| Mutabilidad | Objetos que pueden cambiar vs. los que no |
| Asignación | Diferencia entre apuntar a un objeto y copiarlo |
| Indentación | Sintaxis real, no estética |
| PEP 8 | El estándar de estilo oficial de Python |
| Docstrings | Documentación incorporada en el código |
| Estructura de app | Funciones, bucles y control de flujo combinados |
¿Listo para el siguiente nivel? Continúa con el Python Orientado a Objetos · Luis Martínez en Platzi
Escribir código que funciona es el primer nivel. Escribir código claro, legible y mantenible es el siguiente.
Python no solo es poderoso: está diseñado para ser legible. Esa es una ventaja enorme en el mundo real.
¿Qué sigue?
Si quieres llevar tu código al estándar industrial, explora estas herramientas:
| Herramienta | Para qué sirve |
|---|---|
black | Formateador automático de código |
flake8 | Linter que detecta violaciones de PEP 8 |
ruff | Linter ultrarrápido, reemplaza flake8 + isort |
mypy | Verificación estática de tipos |
Con estas herramientas, tu entorno de desarrollo te avisa en tiempo real cuando algo no sigue el estándar. Es como tener un code reviewer integrado en tu editor.
Cursos de Luis Martínez en Platzi
Todos los cursos de esta sección son impartidos por Luis Martínez, Platform Engineer, ex Backend Engineer en Platzi y especialista en Python. Son la continuación natural de este mini curso.
🐍 Ruta Python (en orden)
| # | Curso | Por qué tomarlo ahora |
|---|---|---|
| 1 | Python Intermedio: entornos virtuales y PEP 8 | Consolida el estilo profesional que viste en este curso |
| 2 | Python Orientado a Objetos | El siguiente salto: modelar el mundo con clases y objetos |
| 3 | Python Avanzado: Arquitectura de Proyectos y PyPI | Organiza proyectos reales y publica tus propias librerías |
| 4 | Unit Testing en Python | Escribe pruebas que garanticen que tu código siempre funciona |
🌐 Frameworks web (elige tu camino)
Una vez que dominas Python puro, estos cursos te llevan al desarrollo web backend real:
| Curso | Cuándo tomarlo |
|---|---|
| Curso de FastAPI | Para construir APIs modernas y de alto rendimiento (el camino recomendado para empezar) |
| Curso de Django | Para aplicaciones web completas con admin, ORM y auth incluidos |
| Curso de Django Rest Framework | Para convertir Django en una API REST profesional |
| Curso de Flask | Para microservicios y APIs ligeras con control total |
☁️ Despliegue
| Curso | Qué aprenderás |
|---|---|
| Despliegue de Aplicaciones Python en la Nube | Lleva tu app de tu máquina local a un servidor real en producción |
💡 Ruta completa recomendada: Python Intermedio → OOP → Python Avanzado → Unit Testing → FastAPI → Django → DRF → Deploy
Cada curso construye sobre el anterior. Al terminar, tienes un perfil backend en Python completamente funcional.
Curso diseñado para construir bases correctas desde el principio, porque los fundamentos siempre importan.