Blog de Javier Smaldone

Todos los días se aprende algo viejo

17 comentarios

ikkaro dijo:
26 de abril de 2007 a las 21:20  

Gracias por el post, después de tanto tiempo posteas algo realmente interesante, sobretodo para los desarrolladores de software, lenguajes como Ruby, Python y perl facilitan mucho la tarea del desarrollador, yo personal mente aprendí Python y estoy comenzando con una pequeña aplicación (proyecto final de la Uni) y me ha facilitado mucho el trabajo, ahora es cosa de comenzar con Ruby que segun puedo ver en tus ejemplos es muy muy util.

gracias por el tiempo.

Adrian dijo:
27 de abril de 2007 a las 6:13  

Hola Javier, muy bueno el articulo; nomas queria comentarte que JavaScript tambien tiene closures, mira este articulo (en ingles): http://www.joelonsoftware.com/items/2006/08/01.html
Muchos frameworks que estan apareciendo para JavaScript ultimamente como Prototype o Dojo usan muchisimo las closures… es potentisimo.
Saluti!
Adri

Patricio dijo:
27 de abril de 2007 a las 10:53  

me gustó “después de tanto tiempo posteas algo realmente interesante” … jiji.

27 de abril de 2007 a las 12:49  

Ejem… senti que el post me lo dedicaron, puede ser?
jajaja
de todas formas…
SIGO SIN ENTENDER!

jajaj. excelente el post macho.
sds

javier dijo:
27 de abril de 2007 a las 12:55  

Patricio:

Sí, parece que dijera otra cosa. Pero como hace mucho que no posteo nada, no tengo por qué tomarlo a mal ;)

Santi:

Por algo no te avisé del post. Tardaste poco en descubrirlo (y saltaste como yo imaginaba) :P

javier dijo:
27 de abril de 2007 a las 13:39  

Ya que alguien preguntó por ahí, aquí va la definición de ‘map’ en el lenguaje Haskell:

map f [] = []
map f (x:xs) = (f x):(map f xs)

Explicación:

- Al aplicar una función a una lista (arreglo) vacía, se obtiene una lista vacía.

- Al aplicar una función a una lista no vacía (que tiene un elemento ‘x’ seguido de una lista ‘xs’), se obtiene una lista cuyo primer elemento es el resultado de aplicar la función al primer elemento original (‘x’), y cuya cola (el resto de la lista) es hacer ‘map’ con la misma función a la cola de la lista original (‘xs’).

Nota: El operador ‘:’ añade un elemento a la cabeza de una lista.

Ricardo dijo:
29 de abril de 2007 a las 18:29  

Comento porque Javier me lanzó el guante: y sí, los lenguajes cada vez se acercan más a 1950!! :)

Juanjo dijo:
1 de mayo de 2007 a las 10:22  

Las que siguen son soluciones en Python de los ejemplos que planteaste, algunas usan clausuras, otros puede que no :)

El ejemplo simple:

def f(a):
return [2*x for x in a]

El ejemplo de people:

[p.name for p in people if p.age > 18]

Problema 1:

a = [x.upper() for x in a]

Problema 2:

[", ".join([y,x]) for [x,y] in a]

Problema 3:

Este no quedó tan bien como los otros, pero te dejo mi interacción en REPL de Python:

>>> p1 = Persona()
>>> p1.age = 19
>>> p1.name = “Juan Hewr”
>>> p2 = Persona()
>>> p2.age = 2
>>> p2.name = “Baby Jones”
>>> p3 = Persona()
>>> p3.age = 30
>>> p3.name = “Sussan Ahoria”
>>> people = [p1, p2, p3]

>>> s = 0.0
>>> adults = [p for p in people if p.age > 18]
>>> for p in adults:
print p.name
s += p.age
Juan Hewr
Sussan Ahoria
>>> print s/len(adults)
24.5

Problema 4:

max(cadenas)

javier dijo:
1 de mayo de 2007 a las 13:34  

Muchas gracias Juanjo por las soluciones.

Con respecto al problema 4, un detalle:

En Ruby también puedes obtener el máximo elemento de un arreglo ‘a’ usando

a.max

Sin embargo, la idea era mostrar como aplicar una función al estilo del ‘fold’ de los lenguajes funcionales. ¿Podrías reescribir la solución en esos términos?

Juanjo dijo:
1 de mayo de 2007 a las 14:02  

Primero una aclaración de algo que me pasé por alto: max(a) en Python cuando a es una lista de strings no da el string más largo sino el que está más al final en un ordenamiento creciente alfabético estando las minúsculas antes que las mayúsculas. Es así también en ruby?

>>> max(“hola”, “juanjo”)
‘juanjo’
>>> max(“hola”, “Juanjo”)
‘hola’
>>> max(“a”, “A”)
‘a’
>>> max(“a”, “AAAAAAAAAAAAAAAAAAAAAa”)
‘a’
>>> max(“a”, “AAAAAAAAAAAAAAAAAAAAA”, “a”)
‘a’
>>> max(“AAAAAAAAAAAAAAAAAAAAA”, “a”)
‘a’
>>> max(“b”, “a”)
‘b’
>>> max(“B”, “a”)
‘a’

Juanjo dijo:
1 de mayo de 2007 a las 14:03  

Sorry, estando las minúsculas después que las mayúsculas.

javier dijo:
1 de mayo de 2007 a las 14:15  

Así es, Juanjo. Yo también me equivoqué. max, aplicado a strings devuelve el máximo según el orden lexicográfico, y no según la longitud.

Me sigue quedando la duda. ¿Hay algo similar a ‘inject’ o ‘fold’ en Python?

Juanjo dijo:
1 de mayo de 2007 a las 14:39  

Ahora si vamos a intentar resolver el ejemplo 4 en Python:

Mmm inject está bueno para resolver ese problema.. pero creo que no tenemos algo así en Python. Intentemos de todas formas:

Tenemos una lista de strings:

a = ["hola", "juAnjO", "Argentina", "8"]

Una función ‘criterio’:

def longer(a, b):
if len(a) > len(b):
return a
else:
return b

And this magic functions called ‘mas’:

def mas(l, c, v):
if l:
return mas(l[1:], c, c(l[0], v))
else:
return v

Que nos va a permitir hacer algo como esto:

>>> mas(a, longer, “”)
‘Argentina’

Mirando desde más cerca.. esta función ‘mas’, es muy parecida a ‘inject’, salvo por el nombre :)

>>> inject = mas
>>> numeros = [1,2,3,4,5,6]
>>> def suma(a, b):
return a + b
>>> inject(numeros, suma, 0)
21

Mmm parece que funciona, comprobemoslo:

>>> sum(numeros)
21

Si!

Nos leemos!

29 de junio de 2007 a las 23:16  

Esta muy bueno, pero me quedo con Perl

Rafa dijo:
5 de agosto de 2007 a las 20:00  

otra forma de resolver el problema 4 con ruby es la siguiente:

a.max {|x,y| x.length y.length }

melvinn dijo:
13 de marzo de 2009 a las 2:29  

como puedo sumar los elementos de dos listas que se ven de esta manera:
lista=[1,2,3,4,5]
lista2=[7,7,5,3,1]
donde la lista 3 sera el resultado de el primer elemento de la lista uno y el último de la lista 2, y el ultimo elemento de la lista uno con el primer elemento de la lista 2 quedando asi
list3[2,5,8,11,12] espero sus respuestas desde ya GRACIAS!!!!!!!!!!!!

Pingback & Trackback
mygif
10 de julio de 2010 a las 1:59  

[...] unos días leí este post en el blog de Javier Smaldone. Closures: Essentially a closure is a block of code that can be [...]

Artículo al azar

Deja tu comentario: