¿Como repetir una función para varias variables en python 3?

publicado por: Anonymous

Suponiendo que tengo una función

def f_show(text):
  print(text)

var_1 = "algo"
var_2 = "en cada"
var_3 = "variable"
f_show(var_1)
f_show(var_2)
f_show(var_3)

Como llamo la función para varias variables. Sin tener que repetir f_show para cada una.

solución

En el caso de Python 2 es tan simple como pasarle las variables a map en una lista:

>>> def f_show(text):
...   print(text)
>>> map(f_show, ['algo', 'en cada', 'variable'])
algo
en cada
variable
[None, None, None]

Lo que hace map es simplemente aplicar la función para cada uno de los elementos de la lista. La última línea [None, None, None] es el valor retornado por map para cada llamada a la función f_show, como solo estás imprimiendo el valor en realidad no nos interesa el resultado, solo nos interesa que se ejecute.

En Python 3 se complica un poco ya que map retorna un iterador:

>>> def f_show(text):
...   print(text)
... 
>>> it = map(f_show, ['algo', 'en cada', 'variable'])
>>> it
<map object at 0x7f23ee92a898>

Así que puedes iterar para ver los resultados:

>>> for x in it:
...   x
... 
algo
en cada
variable

Eso sigue siendo mejor que llamar a la función una por una, ¿no?

Te preguntarás para qué usar map si puedo iterar sobre cada variable y llamar a la función:

>>> for v in ['algo', 'en cada', 'variable']:
...    f_show(v)
... 
algo
en cada
variable

Pues, justamente lo anterior es otra forma de hacerlo. El tema es que en este caso particular solo estamos haciendo un print, por eso nos damos el trabajo de iterar para poder mostrarlo pero, ¿que pasaría si en vez de print hacemos otra cosa un poco más elaborada?:

def funcion_compleja(*args, **kwargs):
    # algo muy complejo por aquí
    return resultado_super_complejo

Pues en ese caso bastaría con convertir el resultado demap en una lista:

>>> resultados_complejos = list(map(funcion_compleja, lista_de_inputs_complejos)

Y esto es, en definitiva, más compacto que iterar con un for para llamar a la función.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *