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
- Variables y tipos
- Operadores
- Control de flujo
- Bucles
- Estructuras de datos
- Cadenas
- Funciones
- Decoradores
- Clases (POO)
- Métodos especiales
- Archivos
- Manejo de errores
- Módulos e imports
- Entorno virtual
- Fechas
- Generadores
- Gestores de contexto
- Anotaciones de tipo
- Pruebas
- Estructura de proyecto
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.12Variables 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 cambiarCadenas
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] # invertirFunciones
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 # setterClases (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 algoEntorno 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 listFechas
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 nombreGeneradores
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 memoriaGestores 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 nombreEstructura 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 .