¿Asignar múltiples funciones a una sola variable?

En Python podemos asignar una función a una variable. Por ejemplo, la función math.sine:

sin = math.sin rad = math.radians print sin(rad(my_number_in_degrees)) 

¿Hay alguna forma fácil de asignar múltiples funciones (es decir, una función de una función) a una variable? Por ejemplo:

 sin = math.sin(math.radians) # I cannot use this with brackets print sin (my_number_in_degrees) 

Creo que lo que quiere el autor es alguna forma de encadenamiento funcional. En general, esto es difícil, pero puede ser posible para funciones que

  1. tomar un solo argumento,
  2. devuelve un solo valor,
  3. los valores de retorno para la función anterior en la lista son del mismo tipo que los del tipo de entrada de la siguiente función es la lista

Digamos que hay una lista de funciones que necesitamos encadenar, de las cuales tomar un solo argumento y devolver un solo argumento. Además, los tipos son consistentes. Algo como esto …

 functions = [np.sin, np.cos, np.abs] 

¿Sería posible escribir una función general que los agrupe a todos juntos? Bueno, podemos usar reduce aunque, a Guido no le gusta especialmente el map , reduce implementaciones y estaba a punto de eliminarlas …

Algo como esto …

 >>> reduce(lambda m, n: n(m), functions, 3) 0.99005908575986534 

Ahora, ¿cómo creamos una función que hace esto? Bueno, solo crea una función que toma un valor y devuelve una función:

 import numpy as np def chainFunctions(functions): def innerFunction(y): return reduce(lambda m, n: n(m), functions, y) return innerFunction if __name__ == '__main__': functions = [np.sin, np.cos, np.abs] ch = chainFunctions( functions ) print ch(3) 

Solo crea una función de envoltorio:

 def sin_rad(degrees): return math.sin(math.radians(degrees)) 

Llame a su función de envoltura como de costumbre:

 print sin_rad(my_number_in_degrees) 

Podría escribir una función auxiliar para realizar la composición de la función por usted y usarla para crear el tipo de variable que desea. Algunas características interesantes son que puede combinar un número variable de funciones que aceptan un número variable de argumentos.

 import math try: reduce except NameError: # Python 3 from functools import reduce def compose(*funcs): """ Compose a group of functions (f(g(h(...)))) into a single composite func. """ return reduce(lambda f, g: lambda *args, **kwargs: f(g(*args, **kwargs)), funcs) sindeg = compose(math.sin, math.radians) print(sindeg(90)) # -> 1.0