download: funcionesPF.py
#!/usr/bin/python2.3

print "\nEjemplos con la funcion map()\n"

# MAP: aplica una funcion a cada elemento de una lista
# y retorna una lista con los resultados.

list = [1, 2, 3.0, "hola", True]
rdo = map(type,list)

print "Lista: ", list, "\n"
print "Resultado de mapear la funcion 'type': ", rdo

list = [1, 2, 3, 4, 5]
rdo = map(lambda n: n*n, list)

print "List: ", list, "\n"
print "Resultado de mapear una funcion anonima (que eleva al cuadrado):"
print rdo, "\n"

# map acepta mas listas como argumentos:

list1 = [1, 2, 3]
list2 = ["Uno", "Dos", "Tres"]

def func2(num, palabra):
	aux = str(num) # convierte 'num' a 'string'
	return aux + " - " + palabra

print map(func2,list1,list2) # map toma un elemento de cada lista para
			     # darle argumentos a 'func2'. Si una de las dos
		             # listas tuviera mas elementos que la otra:

list2.append("Cuatro")
print map(func2,list1,list2)	

# Python completa la lista con menos elementos con elementos nulos: None
	
print "\nEjemplos con la funcion filter()\n"

# FILTER: aplica una funcion que retorna un valor booleano (True o False)
# a los elementos de una lista y retorna una lista que contiene solo los 
# elementos que evaluaron True.

abc = "AbcdfghjklnoprsuVxyz" # las cadenas de caracteres pueden usarse de la misma
			     # forma que una lista (pero son inmutables)

# De las letras que forman mi abecedeario alterado me quedo solo
# con las que estan en la cadena "Feliz Anio Nuevo"

print "map: ", map(lambda i: i in "Feliz Anio Nuevo", abc), "\n"
print "filter: ", filter(lambda i: i in "Feliz Anio Nuevo", abc), "\n"

# Problema: de una lista de numeros detectar los primos.
# Usando filter se puede dar una solucion, aunque no es optima.

def primo(n):
	from math import sqrt
	test = filter(lambda x: n % x == 0, range(2, int(sqrt(n)))) 
	if len(test) == 0: return True
	else: return False

#print "\n", 1, primo(1), 2, primo(2), 5, primo(5), 27, primo(27), 99, primo(99)

def primos(m=100):
	return filter(primo,range(m))

print primos()
print primos(250)

# filter() con mas de una lista
# print filter(lambda b,v: b and v, [True, True, False], [False, True, False])
# No, obtuve este error: filter expected 2 arguments, got 3
		
print “\nEjemplos con la funcion reduce()\n”
# REDUCE: permite aplicar a los elementos de una lista una funcion que tome 
# dos argumentos. Aplica la funcion a los dos primeros elementos de la lista,
# luego aplica la funcion al resultado obtenido y al tercer elemento de la 
# lista.. continua hasta reducir la lista a un solo elemento.
print reduce(lambda x,y: x+y, [1,2,3,4])
# reduce() acepta opcionalmente un tercer argumento, este es un valor inicial
# que se agrega al principio de la lista:
print reduce(lambda x,y: x+y, [1,2,3,4], 10)
# Se podria usar reduce() para obtener el maximo de una lista de valores  
# definiendo una funcion maximo() y luego aplicandola a dicha lista

Copyleft 2006 Juanjo Conti