Composición de funciones en Python

Requisito previo: reduce() , lambda

La composición de funciones es la forma de combinar dos o más funciones de tal manera que la salida de una función se convierte en la entrada de la segunda función y así sucesivamente. Por ejemplo, sean dos funciones «F» y «G» y su composición se puede representar como F(G(x)) donde «x» es el argumento y la salida de la función G(x) se convertirá en la entrada de F() función.

Ejemplo:

# Function to add 2 
# to a number
def add(x):
    return x + 2
  
# Function to multiply 
# 2 to a number
def multiply(x):
    return x * 2
  
# Printing the result of 
# composition of add and 
# multiply to add 2 to a number 
# and then multiply by 2
print("Adding 2 to 5 and multiplying the result with 2: ", 
      multiply(add(5)))

Producción:

Adding 2 to 5 and multiplying the result with 2: 14

Explicación
Primero add() se llama a la función en la entrada 5. Se add()suma 2 a la entrada y la salida que es 7, se da como entrada a multiply()la que se multiplica por 2 y la salida es 14

Mejor manera de implementar la composición.

Hay una mejor manera de implementar la composición de Function. Podemos crear una función especial que puede combinar dos funciones cualesquiera.

# Function to combine two
# function which it accepts 
# as argument
def composite_function(f, g):
    return lambda x : f(g(x))
  
# Function to add 2
def add(x):
    return x + 2
  
# Function to multiply 2
def multiply(x):
    return x * 2
  
# Composite function returns
# a lambda function. Here add_multiply
# will store lambda x : multiply(add(x))
add_multiply = composite_function(multiply, add)
  
print("Adding 2 to 5 and multiplying the result with 2: ",
      add_multiply(5))

Producción:

Adding 2 to 5 and multiplying the result with 2: 14

Composición de N número de funciones
Podemos componer cualquier número de funciones modificando el método anterior.

# Function to combine two 
# function which it accepts
# as argument
def composite_function(f, g):
      
    return lambda x : f(g(x))
  
# Function to add 2
def add(x):
    return x + 2
  
# Function to multiply 2
def multiply(x):
    return x * 2
  
# Function to subtract 2
def subtract(x):
    return x - 1
  
# Composite function returns
# a lambda function. Here
# add_subtract_multiply will 
# store lambda x : multiply(subtract(add(x)))
add_subtract_multiply = composite_function(composite_function(multiply,
                                                              subtract), 
                                           add)
  
  
print("Adding 2 to 5, then subtracting 1 and multiplying the result with 2: ",
      add_subtract_multiply(5))

Producción:

Sumando 2 a 5, luego restando 1 y multiplicando el resultado por 2: 12

Ahora modificaremos nuestra función compuesta a una función que pueda componer cualquier número de funciones en lugar de dos usando la función reduce() de la biblioteca functools.

# importing reduce() from functools
from functools import reduce
  
# composite_function accepts N
# number of function as an 
# argument and then compose them
def composite_function(*func):
      
    def compose(f, g):
        return lambda x : f(g(x))
              
    return reduce(compose, func, lambda x : x)
  
# Function to add 2
def add(x):
    return x + 2
  
# Function to multiply 2
def multiply(x):
    return x * 2
  
# Function to subtract 2
def subtract(x):
    return x - 1
  
# Here add_subtract_multiply will 
# store lambda x : multiply(subtract(add(x))) 
add_subtract_multiply = composite_function(multiply,
                                           subtract,
                                           add)
  
print("Adding 2 to 5, then subtracting 1 and multiplying the result with 2: ", 
      add_subtract_multiply(5))

Producción:

Sumando 2 a 5, luego restando 1 y multiplicando el resultado por 2: 12

Explicación
La reduce()función está tomando las dos primeras funciones de *func y componiéndolas usando compose()y luego componiendo la tercera función a la función compuesta anterior y así sucesivamente. Aquí el multiply()y subtract()se compone primero (multiplicar (restar (x)) y luego agregar() se compone (multiplicar (restar (agregar (x))).

Publicación traducida automáticamente

Artículo escrito por Arunishsingh y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *