Ir al contenido principal

Programación funcional en Python

Map

Aplica una función a todos los elementos en una lista de entrada. Aquí está el plano:

Sintaxis:

map(función a aplicar, lista de entrada)
Ejemplo:
import math
items=[5,3,1,4]
list(map(math.sqrt,items))
Salida por consola:
Out[1]: [2.23606797749979, 1.7320508075688772, 1.0, 2.0]

Lambdas 

Lambdas son funciones de una línea. También se les conoce como funciones anónimas en otros idiomas. Es posible que desee utilizar lambdas cuando no desee utilizar una función dos veces en un programa. Son como las funciones normales e incluso se comportan como ellas.
Sintaxis: 

Variable = lambda argumento: manipular(argumentos)

Ejemplo:
Creamos una función f que me devuelve el cuadrado de un número:

def f(x):
    return x**2
Por consola obtenemos:
f(2)
Out[3]: 4

Pero puedo hacer lo mismo con lambda en una sola línea: 

g= lambda x:x**2
Por consola obtenemos:
print(g(4))
16

Filter
Crea una lista de elementos para los cuales una función devuelve verdadero. 
Sintaxis:


filter (función, iterable)

Ejemplo,  filtra de los items el número par: 
items=[5,3,1,4]
list(filter(lambda x: x%2==0, items))
Salida por consola:
Out[11]: [4]



Comprehensions


Comprensiones 

Las comprensiones son una característica de Python que realmente extrañaría si alguna vez tuviera que dejarlo. Las comprensiones son construcciones que permiten que las secuencias se construyan a partir de otras secuencias. Python 2 y Python 3 admiten tres tipos de comprensión:
  • lista de comprensiones
  • comprensión del diccionario
  • establecer comprensiones
  • comprensión del generador
Sintaxis lista de comprensiones:

variable = [Expresión de salida for Expresión de salida in lista ingresada if condición]
Ejemplo 1:
import math
items=[5,3,1,4]
m= [math.sqrt(x) for x in items]
Salida por consola:
print(m)

[2.23606797749979, 1.7320508075688772, 1.0, 2.0] #Salida como lista


Ejemplo 2:
import math
items=[5,3,1,4]
[x/2 for x in items]
Salida por consola:
Out[17]: [2.5, 1.5, 0.5, 2.0]

Ejemplo 3:
[x/2 for x in items if x>1]
Salida por consola:
Out[18]: [2.5, 1.5, 2.0]

Ejemplo 4:
[num for num in items if num %2==0]#De la lista items saca los números divisibles para 2
Salida por consola:

Out[19]: [4]


Ejemplo 5:
[num*2 for num in items if num %2==0] #todo numero que cumpla esa condición se multiplica por dos
Salida por consola: 

Out[20]: [8]

Ejemplo 6: En este caso definimos un rango y obtenemos los números divisibles para dos y tres. 
[num for num in range(1,100) if num %2==0 and num%3==0]
Salida por consola: 
Out[21]: [6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, 78, 84, 90, 96]


Ejercicios 
1) Con map se puede trabajar tanto en tuplas como listas: 
import math
items =[5,3,1,4]
tuple(map(math.sqrt,items))
Out[2]: (2.23606797749979, 1.7320508075688772, 1.0, 2.0)

list(map(math.sqrt,items))

Out[3]: [2.23606797749979, 1.7320508075688772, 1.0, 2.0]

2) El algún momento puedes necesitar esto...
map(math.sqrt,items)

Out[4]: <map at 0x108d21e48>

3) Ejercicio con lambda:
g= lambda x:x**2
Consola:
g(5)

Out[6]: 25

4) Que pasa si filtramos con lambda pero no agregamos a list: 
import math
items =[5,3,1,4]
list(filter(lambda x: x%2==0, items))

Out[8]: [4]

import math
items =[5,3,1,4]
(filter(lambda x: x%2==0, items))

Out[9]: <filter at 0x108d83588> #Obtenemos 

5) Sacar la raíz de una lista con comprensiones: 
import math
items =[5,3,1,4]

[math.sqrt(x) for x in items]
Consola:
Out[10]: [2.23606797749979, 1.7320508075688772, 1.0, 2.0]

6) Dividir una lista para 3: 
items =[5,3,1,4]
[x/3 for x in items]
Out[12]: [1.6666666666666667, 1.0, 0.3333333333333333, 1.3333333333333333]

7) Sacar los números divisibles para 5 de una lista:
items =[5,3,1,4]

[num for num in items if num %5==0]
Out[16]: [5]

8) Multiplicar los números divisibles para 3 por dos: 
items =[5,3,1,4]
[num*2 for num in items if num %3==0]
Out[18]: [6]

9) Multiplicar por 4 los números divisibles para 5 y 7 en un rango del 0 al 100: 
items = range(100)
[num*4 for num in items if num %5==0 and num%7==0]

Out[19]: [0, 140, 280]

10) Multiplicar por 4 los números divisibles para 5 y 7 en un rango del 1 al 100: 
items = range(1, 100)
[num*4 for num in items if num %5==0 and num%7==0]

Out[20]: [140, 280]

11) Determinar los números divisibles para 5 y 7 en un rango del 1 al 100: 
items = range(1,100)
[num for num in items if num %5==0 and num%7==0]

Out[21]: [35, 70]

12) EJERCICIO NUMEROS PRIMOS (Explicar el código)
noprimos = [j for i in range(2,8) for j in range(i*2, 50, i)]
primos = [x for x in range(2,50) if x not in noprimos]
print("Números no primos: ",noprimos)
print("Números primos: ", primos)
Números no primos:  [4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 10, 15, 20, 25, 30, 35, 40, 45, 12, 18, 24, 30, 36, 42, 48, 14, 21, 28, 35, 42, 49]
Números primos:  [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

13) Cuente cuantos números 2 se repiten en la siguiente lista: 
items = [1,2,43,2,4,2,5]
items.count(2)
Out[29]: 3



Referencias: 

4. Mapear, Filtrar y Reducir - Python Tips 0.1 documentación. (n.d.). Retrieved November 4, 2018, from http://book.pythontips.com/en/latest/map_filter.html

Filtro de Python () - Biblioteca estándar de Python. (n.d.). Retrieved November 4, 2018, from https://www.programiz.com/python-programming/methods/built-in/filter

Comentarios

Entradas más populares de este blog

Desempacar y Tuples en Python

UnPacking dictionary (Desempaquetando diccionarios)

Enumerate