Rootstack

Paradigmas soportados en Python

December 05, 2023

Tags: Tecnologías

python

 

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.

 

Paradigma orientado 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()

 

python

 

Paradigma procedimental

 

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}")

 

Paradigma funcional

 

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)

 

python


Paradigma imperativo

 

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.

 

Conceptos del Lenguaje

 

Dataclasses

 

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) 

 

python

 

Lambdas

 

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)

 

Decorators

 

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()

 

Tips Cómo familiarizarse más fácil con el código

 

  1. Vistazo general de la estructura del proyecto, ya sea desde el IDE o utilizando el comando `tree` para identificar si existen directorios como `models`, `routes`(enfocado más que todo a web) o `services`.
  2. Revisar por lo menos uno de los archivos de cada uno de estos directorios para aparte de saber su ubicación, el rol que juegan dentro del proyecto. Ejemplo, qué tanta lógica se está abstrayendo en servicios.
  3. Una vez familiarizado con estos archivos, es más sencillo revisar el código fuente del archivo "principal" (puede variar si es CLI, un lambda, un framework) ya que sin necesidad de conocer el código interno de cada archivo o método, podemos seguir la lógica conociendo el rol de cada una de las clases.

 

Te recomendamos en video