[pyar] Funciones lambdas dentro de for

Angel Freire cuerty en gmail.com
Mie Sep 24 12:47:04 ART 2014


2014-09-24 12:41 GMT-03:00 Angel Java Lopez <ajlopez2000 en gmail.com>:

> Si, es lo que pasa en otros lenguajes con closure de ese tipo, como
> JavaScript.
>
> Lo que hago (disculpen, ni idea de Python) es, en JavaScript, el viejo
> truco del makefn:
>
> function mifunc(static, dynamic) {
>   console.log(static, dynamic);
> }
>
> function makefn(static) {
>     return function (dynamic) {
>         return mifunc(static, dynamic);
>     }
> }
>
> var functions = [];
>
> for (var k = 1; k <= 3; k++)
>     functions.push(makefn(k));
>
>
> 2014-09-24 12:37 GMT-03:00 fisa <fisadev en gmail.com>:
>
>> Porque cada lambda está teniendo una clausura a la variable "i", que
>>
>> se crea para el for, pero es la misma variable que se usa a lo largo
>> de todos los ciclos. Todas tus funciones tienen clausuras a esa misma
>> variable, que al final termina teniendo el 3.
>>
>> El día 24 de septiembre de 2014, 12:34, Manuel Kaufmann
>> <humitos en gmail.com> escribió:
>> > Hola lista!
>> >
>> > Ahora sí que estoy descolocado. Esperaba un resultado diferente a esto
>> > y aún no entiendo su porqué.
>> >
>> >>>> def mifunc(static, dynamic):
>> > ...   print static, dynamic
>> > ...
>> >>>> functions = []
>> >>>> for i in (1,2,3):
>> > ...   functions.append(lambda d: mifunc(i, d))
>> > ...
>> >>>> functions[0](55)
>> > 3 55
>> >>>> functions[1](55)
>> > 3 55
>> >>>> functions[2](55)
>> > 3 55
>> >>>>
>> >
>> > Yo esperaba los resultados:
>> > 1 55
>> > 2 55
>> > 3 55
>> >
>> > ¿Porqué esto no es así?
>> >
>> > --
>> > Kaufmann Manuel
>> > -- http://elblogdehumitos.com.ar
>> > _______________________________________________
>> > pyar mailing list pyar en python.org.ar
>> > http://listas.python.org.ar/listinfo/pyar
>> >
>> > PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>> >
>> > La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>>
>>
>>
>> --
>> fisa  -  Juan Pedro Fisanotti
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>>
>
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>

Podes usar lawvere[0] para hacer currying[1]:

from lawvere import arrow

@arrow(domain=(int, int), codomain=int)
def add(x, y):
  return x + y

# currying:
add2 = add(2)

assert add2(3) == 5
assert add(1)(2) == 3 # successive calls


[0] https://pypi.python.org/pypi/lawvere
[1] http://en.wikipedia.org/wiki/Currying

-- 
http://blog.cuerty.com

"If you want to set off and go develop some grand new thing, you don't need
millions of dollars of capitalization. You need enough pizza and Diet Coke
to stick in your refrigerator, a cheap PC to work on and the dedication to
go through with it."
- John Carmack
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20140924/0d73d257/attachment-0001.html>


More information about the pyar mailing list