C#/LINQ vs Python – Functional and data oriented programming

Mi “lenguaje” funcional favorito es c#/LINQ. Con él veo claro el tratamiento de conjuntos, transformaciones, filtrados, etc. Sin embargo, es conocido que otros lenguajes (además de haskell y cia) como python  tienen buenas capacidades para expresar notación funcional. Aquí me dejo una chuleta de algunas equivalencias python(verde) vs c#(azul) que he ido recopilando últimamente. Me será útil para poder echarle un vistazo cuando me haga falta.

Recordar que para utilizar esta funcionalidad en C#/LINQ hay que importar el “namespace System.Linq”. Así mismo para algunas de las operaciones propuestas para python hay que importar el paquete “itertools“. También es interesante tener a mano la documentación de las estructuras de datos en Python.

Si conocéis mas equivalencias animáos y añadirlas a los comentarios.
Saludos.

var a= new int[]{1,2,3,4,5,5,6,8};
var b= new int[]{9,8,6,5,4};
a= [1,2,3,4,5,5,6,8]
b= [9,8,6,5,4]

Selección/Transformación

var res= from i in a select i*i;
res= [ i*i for i in a ] ;

Proyección Anónima

var res= from i in a select new{prop1=i,prop2=Math.Sin(i)};
res= [ {‘prop1’: i, ‘propb2’:sin(i)} for i in a ] ;

a.ToDictionary(i=> i*i);
a.ToDictionary(i=> i*i, i=>i);
dic([(i*i, i) for i in a])

Max/Min

maxsinval = a.Max(i=>Math.Sin(i))
maxsinval = max(a, lambda i: sin(i))

Distinct

res = a.Distinct()
res = set(a)

Union

res = a.Union(b);
res = Set(a).union(b)

Filtrado

res = from i in a where i%2==0 select i*i;
res = [ i*i for i in a if i%2==0] ;

Ordenación

res = a.Sort(i=>i %2 ==0);
res = sorted(a, key= lambda i: i %2 ==0)

All/Any

a.All(i=> i%2 ==0 )
all ([i%2==1 for i in a])

a.Any(i=> i%2==0)
any ([i%2==1 for i in a])

First/Last/Count

a.Count(i=>i%2==0)
len([i for i in a if i%2==0])

a.Count(i=>i==3)
a.count(3)

Agregation/Reduction

a.Agreggate((i,j)=>i*j);
reduce(lambda i, j: i*j,a)

Take/Skip

res = a.Take(3);
res = a[:3];

res = a.Skip(2);
res = a[2:];

res = a.Take(3).Skip(2);
res = a[2:3]

res = a.Skip(2).Take(3);
res = a[2:][:3]

a.TakeWhile(i=>i%2==0)
[i for i in takewhile(lambda i: i %2==0)]

a.SkipWhile(i=>i%2==0)
[i for i in dropwhile(lambda i: i%2==0)]

GroupBy

groups = []
uniquekeys = []
data = sorted(a)
for k, g in groupby(a, lambda i: i+’a’):
uniquekeys.append(k)
groups.append(list(g))

Combinatories Functions

permutations('ABCD', 2)
combinations('ABCD', 2)
combinations_with_replacement('ABCD', 2)

Join/Cross Product


Conclusiones

No demasiadas, simplemente que me gusta mas la notación de C#. Especialmente porque se puede leer secuencialmente las operaciones y transformaciones. Por el contrario las operaciones de Python se aplican de forma anidada por lo que se leen en orden inverso de aplicación. Un muy buen aspecto positivo de Python es que sus librerías incluyen la diversas funciones combinatorias cosa que c# no, esto es algo que me parece básico.

También, desde mi punto de vista decir que tiene mas mérito que c# llegue a este nivel de expresividad dado que es un lenguaje fuertemente tipado y estático (en su mayor parte). El compilador de c# hace un buen trabajo.

Referencias

Trabajo en python:
http://docs.python.org/library/itertools.html
http://www.siafoo.net/article/52
http://www.artima.com/weblogs/viewpost.jsp?thread=98196

Read related developerWorks articles by David Mertz:

http://sayspy.blogspot.com/2006/02/why-python-doesnt-need-something-like.html
http://srtsolutions.com/public/blog/251010
http://docs.python.org/py3k/tutorial/datastructures.html#sets

Copias de linq a python:
http://lost-theory.org/python/enum2.txt
http://themechanicalbride.blogspot.com/2007/03/linq-to-python.html
http://lost-theory.org/python/enum3.txt

One Response to C#/LINQ vs Python – Functional and data oriented programming

  1. Adrian dice:

    Increible la potencia de Python siempre he pensado que con haskell serán los lenguajes del futuro junto a f#…..sin embargo c# es lo máximo🙂

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: