Ajà! List comprehension explained
Escrit per Aaloy a 31 de January , 2008 a les 8:47 p.m.
En les darreres versions Python va introduir una modificació de sintaxi que permet no tirar tant de la programació funcional per algunes coses, el que es coneix com a list comprehension .
Encara que els exemples ajuden a fer-se una idea de com funciona la sintaxi, el que m'ha acabat d'obrir el ulls damunt la idea i la seva utilitat ha estat aquest article. En ell s'explica la sintaxi des del punt de vista matemàtic, és a dir, els matemàtics estan acostumats a escriure conjunts de la manera X = { x | x mod 2 = 0 } on x pertany als Naturals serveix per a indicar el conjunt dels nombres parells.
Els múltiples de tres, per exemple es poden escriure com
T = { 3x | x pertany als naturals}
Quan programam els nostres conjunts són finits, però la idea és la mateix i és ben bé la notació que es fa servir per la sintaxi de la list comprehension.
parells = [2*x for x in range(0,10)]Ens tornarà la llista dels deu primers nombres parells, o bé
parells = [x for x in range(0,101) if x%2 ==0]ens retornarà la llista dels nombres parells que hi ha entre zero i 100. Notació matemàtica en estat pur.
Si en lloc d'una variable en tenim dues, llegit en termes de conjunts matemàtics la notació té tot el sentit del món
parelles =[(x,y) for x in range(0,3) for y in range(0,5)]
Diu: conjunt de tots els parell on el primer nombre va de zero a tres (no inclòs) i el segon va de zero a cinc (no inclòs).
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4)]Si el que volem és el mateix conjunt però on els dos nombres no són iguals bastaria fer
parelles =[(x,y) for x in range(0,3) for y in range(0,5) if x != y]és a dir:
[(0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 3), (2, 4)]
Enllaços citats
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Comentaris
1 Comentari de paurullan a les 06:04 del Sunday 13 Apr de 2008
Realment és un tema que trobo molt interessant. A més, l'expressivitat i
concretitut que pots assolir sempre serà moltíssim major que amb una funció
coxina.
Amb una cosa no hi estic d'acord:
2 Comentari de aaloy a les 06:04 del Sunday 13 Apr de 2008
Pau, lo del comentari de la programació funciona no és una apreciació meva, és un dels motius de la utilització d'aquesta construcció. Del manual de Python "List comprehensions provide a concise way to create lists without resorting to use of map(), filter() and/or lambda"
Python té eines potents de programació funcional, però pareix que es consideren poc "pythòniques", supòs que perquè fan mal de llegir el codi.
Un parell més de referències que també estan bé:
* http://pycage.blogspot.com/2008/01/tablet-python-3-list-comprehension.html
* http://en.wikipedia.org/wiki/List_comprehension