Luis MartinezLuis Martinez·

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ísticaQué significa
InterpretadoEl código se ejecuta línea a línea, sin compilar primero
Dinámicamente tipadoEl tipo de una variable se determina en tiempo de ejecución
Fuertemente tipadoNo mezcla tipos incompatibles de forma silenciosa
Basado en indentaciónLa estructura del código define los bloques lógicos
Con filosofía propiaPEP 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. print y Print son completamente diferentes. La precisión en los detalles importa desde el primer momento.


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:

TipoConvenciónEjemplo
Variablessnake_caseedad_usuario
ConstantesMAYÚSCULASPRECIO_MAXIMO
ClasesPascalCaseUsuarioActivo
Funcionessnake_casecalcular_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:

ConceptoQué aprendiste
Intérprete y bytecodeCómo Python ejecuta tu código internamente
Tipado dinámicoEl tipo se resuelve en ejecución
Tipado fuertePython no mezcla tipos incompatibles
MutabilidadObjetos que pueden cambiar vs. los que no
AsignaciónDiferencia entre apuntar a un objeto y copiarlo
IndentaciónSintaxis real, no estética
PEP 8El estándar de estilo oficial de Python
DocstringsDocumentación incorporada en el código
Estructura de appFunciones, 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:

HerramientaPara qué sirve
blackFormateador automático de código
flake8Linter que detecta violaciones de PEP 8
ruffLinter ultrarrápido, reemplaza flake8 + isort
mypyVerificació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)

#CursoPor qué tomarlo ahora
1Python Intermedio: entornos virtuales y PEP 8Consolida el estilo profesional que viste en este curso
2Python Orientado a ObjetosEl siguiente salto: modelar el mundo con clases y objetos
3Python Avanzado: Arquitectura de Proyectos y PyPIOrganiza proyectos reales y publica tus propias librerías
4Unit Testing en PythonEscribe 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:

CursoCuándo tomarlo
Curso de FastAPIPara construir APIs modernas y de alto rendimiento (el camino recomendado para empezar)
Curso de DjangoPara aplicaciones web completas con admin, ORM y auth incluidos
Curso de Django Rest FrameworkPara convertir Django en una API REST profesional
Curso de FlaskPara microservicios y APIs ligeras con control total

☁️ Despliegue

CursoQué aprenderás
Despliegue de Aplicaciones Python en la NubeLleva 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.