Visión General de la Biblioteca Estándar
## Objetivos de Aprendizaje
- Explorar la biblioteca estándar de Python
- Aprender sobre módulos útiles incorporados
- Dominar patrones comunes de la biblioteca
## Collections
### Counter
```python
from collections import Counter
palabras = ["manzana", "plátano", "manzana", "cereza", "plátano", "manzana"]
contador = Counter(palabras)
print(contador) # Counter({'manzana': 3, 'plátano': 2, 'cereza': 1})
print(contador.most_common(2)) # [('manzana', 3), ('plátano', 2)]
```
### defaultdict
```python
from collections import defaultdict
dd = defaultdict(list) # Fábrica por defecto
dd["frutas"].append("manzana")
dd["frutas"].append("plátano")
print(dd["frutas"]) # ['manzana', 'plátano']
print(dd["falta"]) # [] (lista vacía, no error)
```
### deque
```python
from collections import deque
dq = deque([1, 2, 3])
dq.append(4) # Añadir a la derecha
dq.appendleft(0) # Añadir a la izquierda
print(dq) # deque([0, 1, 2, 3, 4])
dq.pop() # Eliminar de la derecha: 4
dq.popleft() # Eliminar de la izquierda: 0
```
### namedtuple
```python
from collections import namedtuple
Punto = namedtuple("Punto", ["x", "y"])
p = Punto(10, 20)
print(p.x, p.y) # 10 20
print(p[0], p[1]) # 10 20
```
## Itertools
### count, cycle, repeat
```python
import itertools
# Iterador infinito - contar desde 1
for i, num in zip(range(5), itertools.count(1)):
print(num) # 1, 2, 3, 4, 5
# Ciclo a través de iterable
for i, item in zip(range(8), itertools.cycle(["a", "b", "c"])):
print(item) # a, b, c, a, b, c, a, b
# Repetir elemento
for item in itertools.repeat("x", 3):
print(item) # x, x, x
```
### chain
```python
import itertools
lista1 = [1, 2, 3]
lista2 = [4, 5, 6]
combinado = list(itertools.chain(lista1, lista2))
print(combinado) # [1, 2, 3, 4, 5, 6]
# chain.from_iterable
anidado = [[1, 2], [3, 4], [5, 6]]
plano = list(itertools.chain.from_iterable(anidado))
print(plano) # [1, 2, 3, 4, 5, 6]
```
### compress, filterfalse
```python
import itertools
# Compress - seleccionar elementos por filtro
datos = ["a", "b", "c", "d"]
selector = [True, False, True, False]
filtrado = list(itertools.compress(datos, selector))
print(filtrado) # ['a', 'c']
# filterfalse - opuesto de filter
numeros = [1, 2, 3, 4, 5, 6]
pares = list(itertools.filterfalse(lambda x: x % 2, numeros))
print(pares) # [2, 4, 6]
```
### islice, takewhile, dropwhile
```python
import itertools
# islice - slice de iterador
numeros = range(10)
rebanado = list(itertools.islice(numeros, 3, 8, 2))
print(rebanado) # [3, 5, 7]
# takewhile - tomar mientras condición sea True
numeros = [1, 2, 3, 4, 5]
tomados = list(itertools.takewhile(lambda x: x < 3, numeros))
print(tomados) # [1, 2]
# dropwhile - soltar mientras condición sea True, luego tomar el resto
soltados = list(itertools.dropwhile(lambda x: x < 3, numeros))
print(soltados) # [3, 4, 5]
```
## functools
### lru_cache
```python
import functools
@functools.lru_cache(maxsize=None)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(100)) # Rápido con cache
```
### partial
```python
import functools
def potencia(base, exponente):
return base ** exponente
al_cuadrado = functools.partial(potencia, exponente=2)
al_cubo = functools.partial(potencia, exponente=3)
print(al_cuadrado(5)) # 25
print(al_cubo(5)) # 125
```
### reduce
```python
import functools
numeros = [1, 2, 3, 4, 5]
total = functools.reduce(lambda x, y: x + y, numeros)
print(total) # 15
max_num = functools.reduce(lambda a, b: a if a > b else b, numeros)
print(max_num) # 5
```
## re - Expresiones Regulares
### Patrones Básicos
```python
import re
texto = "Mi teléfono es 555-123-4567"
# Buscar
coincidencia = re.search(r'\d{3}-\d{3}-\d{4}', texto)
if coincidencia:
print(coincidencia.group()) # 555-123-4567
# Encontrar todos
numeros = re.findall(r'\d+', texto)
print(numeros) # ['555', '123', '4567']
# Reemplazar
nuevo_texto = re.sub(r'\d{3}-\d{3}-\d{4}', 'XXX-XXX-XXXX', texto)
print(nuevo_texto) # Mi teléfono es XXX-XXX-XXXX
# Dividir
partes = re.split(r'[\s,-]+', "a,b c-d")
print(partes) # ['a', 'b', 'c', 'd']
```
### Banderas de Patrones
```python
import re
texto = "Hola MUNDO"
print(re.findall(r'hola', texto, re.IGNORECASE)) # ['Hola', 'MUNDO']
print(re.findall(r'hola', texto, re.I)) # Same
multi = "línea1\nlínea2\nlínea3"
print(re.findall(r'^línea', multi, re.MULTILINE)) # ['línea1', 'línea2', 'línea3']
```
## urllib
```python
from urllib.request import urlopen
# Solicitud GET
with urlopen("https://ejemplo.com") como respuesta:
contenido = respuesta.read().decode("utf-8")
print(contenido[:200])
```
## sqlite3
```python
import sqlite3
conn = sqlite3.connect("mi.db")
cursor = conn.cursor()
# Crear tabla
cursor.execute("""
CREATE TABLE IF NOT EXISTS usuarios (
id INTEGER PRIMARY KEY,
nombre TEXT,
email TEXT
)
""")
# Insertar
cursor.execute("INSERT INTO usuarios (nombre, email) VALUES (?, ?)", ("Ana", "ana@ejemplo.com"))
# Consultar
cursor.execute("SELECT * FROM usuarios")
for fila in cursor.fetchall():
print(fila)
conn.commit()
conn.close()
```
## csv
```python
import csv
# Lectura
with open("datos.csv", "r") como f:
lector = csv.DictReader(f)
for fila in lector:
print(fila["nombre"], fila["edad"])
# Escritura
with open("salida.csv", "w", newline="") como f:
escritor = csv.DictWriter(f, fieldnames=["nombre", "edad"])
escritor.writeheader()
escritor.writerow({"nombre": "Ana", "edad": 30})
```
## logging
```python
import logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)
logger.info("Esto es un mensaje de información")
logger.warning("Esto es una advertencia")
logger.error("Esto es un error")
```
## json
```python
import json
datos = {
"nombre": "Ana",
"edad": 30,
"habilidades": ["Python", "JavaScript"]
}
# Serializar
json_str = json.dumps(datos, indent=2, sort_keys=True)
# Deserializar
parseado = json.loads(json_str)
# Operaciones de archivo
with open("datos.json", "w") como f:
json.dump(datos, f, indent=2)
with open("datos.json", "r") como f:
cargado = json.load(f)
```
## Resumen
- **collections**: Counter, defaultdict, deque, namedtuple
- **itertools**: count, cycle, chain, islice, takewhile, dropwhile
- **functools**: lru_cache, partial, reduce
- **re**: Expresiones regulares para búsqueda de patrones
- **urllib**: Solicitudes HTTP
- **sqlite3**: Operaciones de base de datos SQLite
- **csv**: Manejo de archivos CSV
- **logging**: Registro de aplicaciones
- **json**: Serialización/deserialización JSON
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →