InnovePy

Python Master Class

La guía definitiva de la sintaxis, estructuras, paradigmas y ecosistema de Python. Desde `print()` hasta Metaclases y Concurrencia.

import this
def main(): return 0
users = [u for u in db if u.active]
class NeuralNet(nn.Module):
async def fetch_data():
df = pd.read_csv("data.csv")
@dataclass class Point:
import this
def main(): return 0
users = [u for u in db if u.active]
class NeuralNet(nn.Module):
async def fetch_data():

1. Fundamentos del Lenguaje

Python es un lenguaje interpretado, de alto nivel, tipado dinámico y fuertemente tipado. Todo en Python es un objeto.

Variables y Tipos Primitivos

No se declaran tipos explícitos. El tipo se infiere en tiempo de ejecución.

  • int: Enteros de precisión arbitraria (x = 10**100 es válido).
  • float: Punto flotante (IEEE 754, doble precisión).
  • bool: True y False (subclases de int, 1 y 0).
  • str: Cadenas inmutables Unicode. Soportan f-strings (f"Hola {nombre}").
  • None: El objeto nulo (Singleton).

Control de Flujo

La indentación (4 espacios) es obligatoria y define bloques de código. No hay llaves {}.

if x > 0: print("Positivo") elif x == 0: print("Cero") else: print("Negativo") # Operador ternario estado = "Activo" if is_active else "Inactivo"

Bucles (Loops)

for itera sobre cualquier iterable. while ejecuta mientras la condición sea cierta.

for i in range(5): # 0, 1, 2, 3, 4 if i == 2: continue print(i) else: print("Terminó sin break")

2. Estructuras de Datos

Python posee estructuras integradas muy potentes y optimizadas en C.

Listas (list)

Secuencias mutables, ordenadas y heterogéneas.

lst = [1, "dos", 3.0] lst.append(4) # Añadir al final O(1) x = lst.pop() # Sacar del final O(1) sub = lst[1:3] # Slicing: desde índice 1 hasta 2 rev = lst[::-1] # Copia invertida

Tuplas (tuple)

Secuencias inmutables. Más ligeras que las listas. Usadas para datos fijos y claves de diccionarios.

punto = (10, 20) x, y = punto # Desempaquetado (Unpacking)

Diccionarios (dict)

Mapas Hash (Tabla Hash). Claves inmutables, valores mutables. Búsqueda promedio O(1).

user = {"id": 1, "name": "Ana"} valor = user.get("age", 18) # Devuelve 18 si no existe 'age' keys = user.keys() items = user.items() # Pares (key, value)

Conjuntos (set)

Colección no ordenada de elementos únicos. Útiles para operaciones matemáticas (unión, intersección) y eliminar duplicados.

A = {1, 2, 3} B = {3, 4, 5} print(A & B) # Intersección: {3} print(A | B) # Unión: {1, 2, 3, 4, 5}

3. Funciones y Modularidad

Funciones son objetos de primera clase (se pueden pasar como argumentos).

Argumentos

  • Posicionales: Estándar.
  • Nombrados (Keyword): func(a=1).
  • *args: Tupla de argumentos posicionales variables.
  • **kwargs: Diccionario de argumentos nombrados variables.
def super_func(a, b=0, *args, **kwargs): print(args) # Tupla print(kwargs) # Diccionario super_func(1, 2, 3, 4, mode="fast")

Funciones Lambda

Funciones anónimas de una sola línea. lambda x: x**2.

Ámbito (Scope) - LEGB

Local, Enclosing (nonlocal), Global, Built-in.

4. Programación Orientada a Objetos

Clases, herencia múltiple y encapsulamiento (convención _private).

Clases y Métodos Mágicos (Dunder)

Los métodos que empiezan y terminan con __ definen comportamientos especiales.

class Vector: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): # Sobrecarga operador + return Vector(self.x + other.x, self.y + other.y) def __str__(self): return f"({self.x}, {self.y})"

Propiedades y Métodos Estáticos

Uso de decoradores @property, @staticmethod, @classmethod.

5. Python Avanzado

Iteradores y Generadores

Un generador usa yield para devolver valores uno a uno, ahorrando memoria (Lazy evaluation).

def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b

Decoradores

Funciones que modifican el comportamiento de otras funciones. Son "azúcar sintáctico" para funciones de orden superior.

def log(func): def wrapper(*args, **kwargs): print(f"Llamando a {func.__name__}") return func(*args, **kwargs) return wrapper @log def suma(a,b): return a+b

Gestores de Contexto (Context Managers)

El bloque with asegura la liberación de recursos (archivos, sockets, locks).

with open("file.txt", "r") as f: content = f.read() # El archivo se cierra automáticamente aquí

Concurrencia: GIL y AsyncIO

El Global Interpreter Lock (GIL) impide que múltiples hilos nativos ejecuten bytecode Python a la vez. Para paralelismo real en CPU se usa multiprocessing. Para E/S (red, disco) se usa threading o asyncio (con async/await).