Los paradigmas de programación utilizados en Python son 4, cada uno tiene sus beneficios y usos dependiendo de la situación. Los frameworks web de Python, por ejemplo, suelen utilizar una mezcla de paradigma procedimental y orientación a objetos.
Es de los paradigmas más comunes, en él se utilizan los conceptos de clases, objetos y herencia entre otros para estructurar el código. Python permite la herencia, lo que significa que una clase puede heredar atributos y métodos de otra.
# Creación de clase class Persona: # Método de inicialización def __init__(self, nombre, edad): self.nombre = nombre self.edad = edad # Método def mostrar_informacion(self): print(f"Nombre: {self.nombre}, Edad: {self.edad}") # Creación de objetos de clase personas con valores iniciales persona1 = Persona("Juan", 30) persona2 = Persona("María", 25) # Ejecución de métodos de cada objeto persona1.mostrar_informacion() persona2.mostrar_informacion()
El paradigma procedimental en Python realiza una ejecución secuencia de distintas funciones que encapsulan bloques de código que realizan tareas específicas; organizando las mismas mediante bucles y otras estructuras de control como condicionales.
# Creación de función (la misma no pertenece a ninguna clase) def calcular_promedio(numeros): suma = 0 for numero in numeros: suma += numero promedio = suma / len(numeros) return promedio numeros = [5, 10, 15, 20, 25] # Llamada a función (nótese que no pertenece a ningún objeto) promedio = calcular_promedio(numeros) print(f"El promedio de la lista es: {promedio}")
En el paradigma funcional, como dice el nombre, la unidad principal son las funciones; haciendo gran uso de lambdas, `map()`, `filter()` y `reduce()`. Este enfoque promueve el uso de funciones sencillas, sin efectos secundarios; evitando el uso de condicionales o bucles complejos que modifiquen los datos y reemplazándolos por múltiples funciones más sencillas que conectan entre sí.
from functools import reduce numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] def cuadrado(numero): return numero ** 2 def es_par(numero): return numero % 2 == 0 def suma(a, b): return a + b # Usando map() para elevar al cuadrado cada número cuadrados = list(map(cuadrado, numeros)) # Usando filter() para obtener números pares numeros_pares = list(filter(es_par, numeros)) # Usando reduce() para sumar todos los números suma_total = reduce(suma, numeros) print("Cuadrados:", cuadrados) print("Números pares:", numeros_pares) print("Suma total:", suma_total)
Técnicamente la programación procedimental también es imperativa, sin embargo, en este caso nos referimos al llamado explícito de instrucciones que pueden darse sobre los datos. Un uso común es el análisis de datos como en un Jupyter Notebook o ejecutar directamente los comandos en la consola de Python.
Son clases que se crean por conveniencia con el propósito principal de almacenar datos. Estas incluyen por defecto métodos especiales de comparación de valores y representación como cadenas.
from dataclasses import dataclass # Creación de un dataclass. No es necesario un __init__ @dataclass class Persona: nombre: str edad: int # Creación de objetos persona1 = Persona("Juan", 30) persona2 = Persona("María", 25) # Acceso directo a los atributos print(persona1.nombre) print(persona2.edad) # Muestra el objeto como __repr__ print(persona1) # Comparación de objetos a través de __eq__ print(persona1 == persona2)
Las funciones Lambda son bastante utilizadas en la programación funcional, esta funcionalidad permite crear funciones anónimas, comúnmente albergando operaciones simples y cortas.
# Definición de una función lambda suma = lambda x, y: x + y resultado = suma(3, 5) print(resultado) # También es posible utilizarlas directamente numeros = [1, 2, 3, 4, 5] cuadrados = list(map(lambda x: x ** 2, numeros)) print(cuadrados)
Los decorators son funciones que modifican o envuelven otras funciones o métodos (como el caso de dataclass que crea los métodos especiales sobre la clase). Se utilizan para extender funcionalidades de funciones o alterar el comportamiento de las mismas.
# Definición de un decorador def wrapper_decorator(func): def mensaje(): print("Antes de llamar a la función.") func() print("Después de llamar a la función.") return mensaje @wrapper_decorator def saludo(): print("¡Hola, mundo!") # Llamada a la función decorada saludo()