En lugar de escribir la misma línea para cada función (como se muestra en el primer bloque de código), quiero llamar a cada función con la ayuda de un bucle (como se muestra en el segundo bloque de código)

Lo que quiero poder hacer es:

import numpy as np
A = np.arange(9).reshape(3,3)
B = np.array([3,4,6,3,2,7,0,1,7]).reshape(3,3)
#################

def calc_stats(mat):
    print(mat.max())
    print(mat.min())
    print(mat.mean())

calc_stats(A)
calc_stats(B)

Pero mediante el uso de un bucle en el que en cada iteración puedo cambiar el nombre de la función.
Algo parecido a esto:

import numpy as np
A = np.arange(9).reshape(3,3)
B = np.array([3,4,6,3,2,7,0,1,7]).reshape(3,3)
#################

def calc_stats(mat):
    for names in ["mean", "max", "min"]:
        print(mat.names())

calc_stats(A)
calc_stats(B)

Por supuesto, el código anterior no funciona porque una variable no se puede usar como nombre de función, pero ¿hay algún método para implementar lo que quiero hacer?


Esta pregunta se cerró la última vez que la publiqué porque parecía similar a esto question, pero encuentro las respuestas proporcionadas en esta publicación un poco difíciles de entender o relacionar con mi pregunta.

0
ray_lv 5 mar. 2021 a las 21:35

2 respuestas

La mejor respuesta

Si debe usar cadenas para los nombres, puede obtener las funciones usando getattr ():

def calc_stats(mat):
    for name in ["mean", "max", "min"]:
        print(getattr(np,name)(mat))

Salida:

calc_stats(A)
4.0
8
0

calc_stats(B)
3.6666666666666665
7
0
1
Alain T. 5 mar. 2021 a las 19:31

Puede mantener una lista de funciones para llamar, la llamada a cada una en el argumento proporcionado

def calc_stats(mat):
    for f in [np.mean, np.max, np.min]:
        print(f(mat))

Salida

>>> calc_stats(A)
4.0
8
0
>>> calc_stats(B)
3.6666666666666665
7
0
2
Cory Kramer 5 mar. 2021 a las 19:28