Referencia rápida de Python (Cheat Sheet)

Apéndice de referencia

Esta página funciona como apéndice del curso. Resume los conceptos principales en formato compacto para que puedas volver aquí cuando necesites recordar sintaxis, patrones o comandos.

Contenido


Inicio rápido

 1# Tu primer programa
 2print("Hola mundo")
 3
 4# Comentarios
 5# Esto es un comentario de una línea
 6
 7"""
 8Esto es un comentario
 9de múltiples líneas
10"""
11
12# Variables (no necesitan declaración de tipo)
13nombre = "Python"
14version = 3.12

Variables y tipos

 1# Tipos básicos
 2entero = 42           # int
 3flotante = 3.14       # float
 4texto = "Hola"        # str
 5booleano = True       # bool
 6nulo = None           # NoneType
 7
 8# Verificar tipo
 9type(entero)          # <class 'int'>
10isinstance(42, int)   # True
11
12# Conversiones
13int("42")             # str → int: 42
14str(42)               # int → str: "42"
15float("3.14")         # str → float: 3.14
16bool(1)               # int → bool: True
17list("abc")           # str → list: ['a', 'b', 'c']

Operadores

Tipo Operadores Ejemplo
Aritméticos + - * / 5 + 3 = 8
División entera // 7 // 2 = 3
Módulo % 7 % 2 = 1
Potencia ** 2 ** 3 = 8
Comparación == != < > <= >= 5 > 3 → True
Lógicos and or not True and False → False
Membresía in not in “a” in “abc” → True
Identidad is is not x is None
Asignación = += -= *= /= x += 1

Control de flujo

 1# if / elif / else
 2if x > 0:
 3    print("positivo")
 4elif x < 0:
 5    print("negativo")
 6else:
 7    print("cero")
 8
 9# Operador ternario
10resultado = "par" if x % 2 == 0 else "impar"
11
12# match (Python 3.10+)
13match comando:
14    case "salir":
15        exit()
16    case "ayuda":
17        mostrar_ayuda()
18    case _:
19        print("Comando desconocido")

Bucles

 1# for con range
 2for i in range(5):          # 0, 1, 2, 3, 4
 3    print(i)
 4
 5for i in range(2, 10, 2):   # 2, 4, 6, 8
 6    print(i)
 7
 8# for con iterables
 9for char in "Python":
10    print(char)
11
12for item in [1, 2, 3]:
13    print(item)
14
15for key, value in dicc.items():
16    print(f"{key}: {value}")
17
18# while
19while condicion:
20    hacer_algo()
21    if salir:
22        break
23    if saltar:
24        continue
25
26# enumerate y zip
27for i, valor in enumerate(lista):
28    print(f"{i}: {valor}")
29
30for a, b in zip(lista1, lista2):
31    print(a, b)
32
33# Comprehensions
34cuadrados = [x**2 for x in range(10)]
35pares = [x for x in nums if x % 2 == 0]
36dicc = {x: x**2 for x in range(5)}
37conjunto = {x for x in nums if x > 0}

Estructuras de datos

 1# Lista: mutable, ordenada, permite duplicados
 2lista = [1, 2, 3, 4, 5]
 3lista = list()            # lista vacía
 4
 5# Acceso
 6lista[0]                  # primer elemento
 7lista[-1]                 # último elemento
 8lista[1:3]                # sublista [2, 3]
 9
10# Modificar
11lista.append(6)           # añadir al final
12lista.insert(0, 0)        # insertar en posición
13lista.extend([7, 8])      # añadir múltiples
14lista.remove(3)           # eliminar por valor
15lista.pop()               # eliminar último
16lista.pop(0)              # eliminar por índice
17lista[0] = 99             # reemplazar
18
19# Operaciones
20len(lista)                # longitud
21sorted(lista)             # ordenar (nueva lista)
22lista.sort()              # ordenar in-place
23lista.reverse()           # invertir in-place
24lista.index(valor)        # encontrar índice
25lista.count(valor)        # contar ocurrencias
 1# Diccionario: mutable, pares clave-valor
 2dicc = {"nombre": "Ana", "edad": 25}
 3dicc = dict()             # vacío
 4
 5# Acceso
 6dicc["nombre"]            # "Ana" (error si no existe)
 7dicc.get("nombre")        # "Ana" (None si no existe)
 8dicc.get("x", "default")  # valor por defecto
 9
10# Modificar
11dicc["ciudad"] = "Madrid" # añadir/actualizar
12dicc.update({"a": 1})     # actualizar múltiples
13del dicc["edad"]          # eliminar
14dicc.pop("nombre")        # eliminar y retornar
15
16# Iterar
17dicc.keys()               # claves
18dicc.values()             # valores
19dicc.items()              # pares (clave, valor)
20
21for k, v in dicc.items():
22    print(f"{k}: {v}")
 1# Conjunto: mutable, sin orden, sin duplicados
 2conjunto = {1, 2, 3}
 3conjunto = set()          # vacío
 4
 5# Modificar
 6conjunto.add(4)           # añadir
 7conjunto.remove(1)        # eliminar (error si no existe)
 8conjunto.discard(1)       # eliminar (sin error)
 9
10# Operaciones de conjuntos
11a | b                     # unión
12a & b                     # intersección
13a - b                     # diferencia
14a ^ b                     # diferencia simétrica
15a.issubset(b)             # ¿a está en b?
16a.issuperset(b)           # ¿b está en a?
 1# Tupla: inmutable, ordenada
 2tupla = (1, 2, 3)
 3tupla = tuple()           # vacía
 4tupla = (1,)              # un elemento (¡la coma!)
 5
 6# Acceso (igual que listas)
 7tupla[0]                  # primer elemento
 8tupla[-1]                 # último
 9tupla[1:3]                # subtupla
10
11# Desempaquetado
12a, b, c = (1, 2, 3)
13primero, *resto = (1, 2, 3, 4)  # primero=1, resto=[2,3,4]
14
15# Usos comunes
16# - Claves de diccionario
17# - Retorno múltiple de funciones
18# - Datos que no deben cambiar

Cadenas

 1# Creación
 2texto = "Hola Mundo"
 3texto = 'Hola Mundo'
 4texto = """Múltiples
 5líneas"""
 6
 7# Métodos comunes
 8texto.upper()             # "HOLA MUNDO"
 9texto.lower()             # "hola mundo"
10texto.capitalize()        # "Hola mundo"
11texto.title()             # "Hola Mundo"
12texto.strip()             # quitar espacios
13texto.split()             # ["Hola", "Mundo"]
14texto.split(",")          # dividir por coma
15",".join(["a", "b"])      # "a,b"
16texto.replace("a", "o")   # reemplazar
17texto.startswith("Hola")  # True
18texto.endswith("do")      # True
19texto.find("Mun")         # 5 (índice)
20texto.count("o")          # 2
21
22# f-strings (Python 3.6+)
23nombre = "Ana"
24edad = 25
25f"Me llamo {nombre}"
26f"Tengo {edad} años"
27f"El año que viene: {edad + 1}"
28f"Pi = {3.14159:.2f}"     # "Pi = 3.14"
29f"{nombre:>10}"           # alineado derecha
30f"{nombre:<10}"           # alineado izquierda
31f"{nombre:^10}"           # centrado
32
33# Índices y slices
34texto[0]                  # 'H'
35texto[-1]                 # 'o'
36texto[0:4]                # 'Hola'
37texto[::2]                # 'Hl ud'
38texto[::-1]               # invertir

Funciones

 1# Definición básica
 2def saludar(nombre):
 3    """Docstring: documentación de la función."""
 4    return f"Hola {nombre}"
 5
 6# Parámetros por defecto
 7def potencia(base, exp=2):
 8    return base ** exp
 9
10potencia(3)       # 9 (exp=2 por defecto)
11potencia(3, 3)    # 27
12
13# Argumentos con nombre
14def crear_usuario(nombre, edad, ciudad="Madrid"):
15    pass
16
17crear_usuario("Ana", 25)
18crear_usuario(edad=25, nombre="Ana")
19
20# *args: argumentos posicionales variables
21def suma(*numeros):
22    return sum(numeros)
23
24suma(1, 2, 3, 4)  # 10
25
26# **kwargs: argumentos con nombre variables
27def info(**datos):
28    for k, v in datos.items():
29        print(f"{k}: {v}")
30
31info(nombre="Ana", edad=25)
32
33# Lambda (funciones anónimas)
34doble = lambda x: x * 2
35suma = lambda a, b: a + b
36
37# Funciones como argumentos
38lista = [3, 1, 2]
39sorted(lista, key=lambda x: -x)  # [3, 2, 1]

Decoradores

 1# Decorador simple
 2def mi_decorador(func):
 3    def wrapper(*args, **kwargs):
 4        print("Antes de la función")
 5        resultado = func(*args, **kwargs)
 6        print("Después de la función")
 7        return resultado
 8    return wrapper
 9
10@mi_decorador
11def saludar(nombre):
12    print(f"Hola {nombre}")
13
14# Decorador con argumentos
15def repetir(veces):
16    def decorador(func):
17        def wrapper(*args, **kwargs):
18            for _ in range(veces):
19                func(*args, **kwargs)
20        return wrapper
21    return decorador
22
23@repetir(3)
24def decir_hola():
25    print("Hola")
26
27# Decoradores comunes
28@staticmethod      # método sin self
29@classmethod       # método con cls
30@property          # getter
31@nombre.setter     # setter

Clases (POO)

 1class Persona:
 2    # Atributo de clase (compartido)
 3    especie = "Humano"
 4
 5    def __init__(self, nombre, edad):
 6        # Atributos de instancia (únicos)
 7        self.nombre = nombre
 8        self.edad = edad
 9
10    def saludar(self):
11        return f"Hola, soy {self.nombre}"
12
13    @staticmethod
14    def info():
15        return "Soy una persona"
16
17    @classmethod
18    def desde_diccionario(cls, datos):
19        return cls(datos["nombre"], datos["edad"])
20
21    @property
22    def es_adulto(self):
23        return self.edad >= 18
24
25# Uso
26p = Persona("Ana", 25)
27p.saludar()           # "Hola, soy Ana"
28p.es_adulto           # True (property)
29Persona.especie       # "Humano"
30
31# Herencia
32class Estudiante(Persona):
33    def __init__(self, nombre, edad, carrera):
34        super().__init__(nombre, edad)
35        self.carrera = carrera
36
37    def saludar(self):  # Override
38        return f"Hola, estudio {self.carrera}"

Métodos especiales

 1class Vector:
 2    def __init__(self, x, y):
 3        self.x = x
 4        self.y = y
 5
 6    def __str__(self):
 7        """Para print() y str()"""
 8        return f"({self.x}, {self.y})"
 9
10    def __repr__(self):
11        """Para depuración"""
12        return f"Vector({self.x}, {self.y})"
13
14    def __add__(self, otro):
15        """Para el operador +"""
16        return Vector(self.x + otro.x, self.y + otro.y)
17
18    def __eq__(self, otro):
19        """Para el operador =="""
20        return self.x == otro.x and self.y == otro.y
21
22    def __len__(self):
23        """Para len()"""
24        return 2
25
26    def __getitem__(self, indice):
27        """Para acceso con []"""
28        return (self.x, self.y)[indice]
Método Operador/Función
add +
sub -
mul *
eq ==
lt <
len len()
str str(), print()
iter for … in

Archivos

 1# Leer archivo completo
 2with open("archivo.txt", "r", encoding="utf-8") as f:
 3    contenido = f.read()
 4
 5# Leer línea por línea
 6with open("archivo.txt", "r") as f:
 7    for linea in f:
 8        print(linea.strip())
 9
10# Escribir archivo
11with open("archivo.txt", "w") as f:
12    f.write("Hola mundo\n")
13
14# Añadir al archivo
15with open("archivo.txt", "a") as f:
16    f.write("Nueva línea\n")
17
18# JSON
19import json
20
21# Leer JSON
22with open("datos.json", "r") as f:
23    datos = json.load(f)
24
25# Escribir JSON
26with open("datos.json", "w") as f:
27    json.dump(datos, f, indent=2)
28
29# String ↔ JSON
30json.loads('{"clave": "valor"}')
31json.dumps({"clave": "valor"})
32
33# CSV
34import csv
35
36with open("datos.csv", "r") as f:
37    reader = csv.DictReader(f)
38    for row in reader:
39        print(row["columna"])
40
41with open("datos.csv", "w", newline="") as f:
42    writer = csv.writer(f)
43    writer.writerow(["col1", "col2"])
44    writer.writerow([1, 2])

Manejo de errores

 1try:
 2    resultado = 10 / 0
 3except ZeroDivisionError:
 4    print("No se puede dividir por cero")
 5except (TypeError, ValueError) as e:
 6    print(f"Error de tipo o valor: {e}")
 7except Exception as e:
 8    print(f"Error inesperado: {e}")
 9else:
10    print("Todo salió bien")
11finally:
12    print("Siempre se ejecuta")
13
14# Lanzar excepciones
15def dividir(a, b):
16    if b == 0:
17        raise ValueError("El divisor no puede ser cero")
18    return a / b
19
20# Excepciones personalizadas
21class MiError(Exception):
22    pass
23
24raise MiError("Algo salió mal")

Módulos e imports

 1# Importar módulo completo
 2import math
 3math.sqrt(16)
 4
 5# Importar con alias
 6import numpy as np
 7np.array([1, 2, 3])
 8
 9# Importar elementos específicos
10from datetime import datetime, timedelta
11datetime.now()
12
13# Importar todo (no recomendado)
14from math import *
15
16# Import relativo (dentro de un paquete)
17from . import modulo          # mismo nivel
18from .. import modulo         # nivel superior
19from .subpaquete import algo

Entorno virtual

 1# Crear entorno virtual
 2python -m venv venv
 3
 4# Activar (Windows)
 5venv\Scripts\activate
 6
 7# Activar (Linux/Mac)
 8source venv/bin/activate
 9
10# Desactivar
11deactivate
12
13# Instalar paquetes
14pip install paquete
15pip install paquete==1.0.0
16
17# Guardar dependencias
18pip freeze > requirements.txt
19
20# Instalar desde archivo
21pip install -r requirements.txt
22
23# Ver paquetes instalados
24pip list

Fechas

 1from datetime import datetime, date, time, timedelta
 2
 3# Fecha y hora actual
 4ahora = datetime.now()
 5hoy = date.today()
 6
 7# Crear fecha específica
 8fecha = datetime(2024, 12, 25, 10, 30, 0)
 9fecha = date(2024, 12, 25)
10
11# Formatear a string
12fecha.strftime("%d/%m/%Y")        # "25/12/2024"
13fecha.strftime("%Y-%m-%d %H:%M")  # "2024-12-25 10:30"
14
15# Parsear string a fecha
16datetime.strptime("25/12/2024", "%d/%m/%Y")
17
18# Operaciones
19mañana = hoy + timedelta(days=1)
20hace_una_semana = hoy - timedelta(weeks=1)
21diferencia = fecha2 - fecha1      # timedelta
22
23# Códigos de formato
24# %Y: año (2024)    %m: mes (12)     %d: día (25)
25# %H: hora 24h      %M: minutos      %S: segundos
26# %A: día semana    %B: mes nombre

Generadores

 1# Función generadora
 2def contador(n):
 3    i = 0
 4    while i < n:
 5        yield i
 6        i += 1
 7
 8for num in contador(5):
 9    print(num)  # 0, 1, 2, 3, 4
10
11# Expresión generadora (lazy)
12gen = (x**2 for x in range(10))
13next(gen)  # 0
14next(gen)  # 1
15
16# Convertir a lista
17list(gen)  # consume el resto
18
19# Usos comunes
20# - Procesar archivos grandes línea por línea
21# - Secuencias infinitas
22# - Ahorro de memoria

Gestores de contexto

 1# Uso con with
 2with open("archivo.txt") as f:
 3    contenido = f.read()
 4# El archivo se cierra automáticamente
 5
 6# Crear context manager con clase
 7class MiContexto:
 8    def __enter__(self):
 9        print("Entrando")
10        return self
11
12    def __exit__(self, exc_type, exc_val, exc_tb):
13        print("Saliendo")
14        return False  # No suprimir excepciones
15
16with MiContexto() as ctx:
17    print("Dentro del contexto")
18
19# Con decorador (más simple)
20from contextlib import contextmanager
21
22@contextmanager
23def mi_contexto():
24    print("Entrando")
25    yield
26    print("Saliendo")

Anotaciones de tipo

 1# Tipos básicos
 2def saludar(nombre: str) -> str:
 3    return f"Hola {nombre}"
 4
 5def sumar(a: int, b: int) -> int:
 6    return a + b
 7
 8# Tipos compuestos
 9from typing import List, Dict, Tuple, Optional, Union
10
11def procesar(items: List[str]) -> Dict[str, int]:
12    return {item: len(item) for item in items}
13
14def buscar(id: int) -> Optional[str]:
15    # Puede retornar str o None
16    pass
17
18def aceptar(valor: Union[int, str]) -> None:
19    # Acepta int o str
20    pass
21
22# Python 3.10+
23def nueva_sintaxis(items: list[str]) -> dict[str, int]:
24    pass
25
26# Clases como tipos
27class Usuario:
28    pass
29
30def crear_usuario(nombre: str) -> Usuario:
31    return Usuario()

Pruebas

 1import pytest
 2
 3# Test básico
 4def test_suma():
 5    assert 1 + 1 == 2
 6    assert suma(2, 3) == 5
 7
 8# Test con excepción esperada
 9def test_division_por_cero():
10    with pytest.raises(ZeroDivisionError):
11        1 / 0
12
13# Fixture (setup)
14@pytest.fixture
15def usuario():
16    return {"nombre": "Ana", "edad": 25}
17
18def test_con_fixture(usuario):
19    assert usuario["nombre"] == "Ana"
20
21# Parametrizar
22@pytest.mark.parametrize("entrada,esperado", [
23    (2, 4),
24    (3, 9),
25    (4, 16),
26])
27def test_cuadrado(entrada, esperado):
28    assert entrada ** 2 == esperado
29
30# Ejecutar tests
31# pytest                    # todos los tests
32# pytest test_archivo.py    # un archivo
33# pytest -v                 # verbose
34# pytest -k "nombre"        # filtrar por nombre

Estructura de proyecto

mi_proyecto/
├── src/
│   └── mi_paquete/
│       ├── __init__.py    # hace el directorio un paquete
│       ├── core.py        # módulo principal
│       └── utils.py       # utilidades
├── tests/
│   ├── __init__.py
│   └── test_core.py
├── docs/
├── pyproject.toml         # configuración del proyecto
├── README.md              # documentación
├── LICENSE
└── .gitignore

# pyproject.toml básico
[project]
name = "mi-paquete"
version = "1.0.0"
dependencies = ["requests>=2.28.0"]

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

# Instalar en modo desarrollo
pip install -e .

Anterior: Proyecto final Volver al curso