Slices a Python
Els slices són una una operació fonamental sobre les seqüències a Python. La seva semàntica no és complexa però és molt rica i això els fa complicats d'entendre en el seu abast. A continuació hi trobareu un resum. L'especificació original cal anar-la a cercar a la referència de Python punts 3, 4 i 5.
Indexat
L'operació d'indexat permet accedir als elements d'una seqüència a través de l'índex. En general una seqüència es considera indexada començant per zero. Per exemple:
D'altra banda, hi ha un indexat «secundari» que indexa del darrer element cap el primer, és a dir en sentit invers a l'anterior. Per distingir-lo de l'indexat ordinari, l'indexat invers usa índexos negatius. Així, el darrer element és el d'índex -1, el penúltim d'índex -2, etc. Per exemple:
És important tenir en compte que el signe només indica a quin índex ens referim, si al primari o al secundari. No se li ha d'atribuir cap altre significat en termes matemàtics.
Un idiom habitual és accedir al darrer element d'una seqüència l usant l[-1]. També succeeix que l[0] = l [-len(l)].
Per què en l'indexat «secundari» no es comença per zero com en el primari? Doncs per que el zero no té signe i no es podria distingir si és un índex primari o secundari. D'aquesta manera sempre se sap que 0 és un índex primari.
Semàntica
La semàntica es pot expressar assumint com a preexistents els segments sobre l'índex primari. Definim la funció primari() que trasllada els índexs secondaris cap als primaris donat v el valor de l'índex i l la seqüencia sobre la que s'aplica. La funció index_general atorga la semàntica a l'accés amb un o altre índex.
Segments (slices)
Un segment d'una seqüència és una subseqüència —possiblement buida— de la seqüència original. L'operació que permet obtenir subseqüències s'inspira en la notació dels intervals matemàtics. Així, donada una seqüència l, el segment l[2:6] denota la subseqüència formada pels elements d'l amb índexos en l'intèrval \([2,6)\), és a dir l[2], ..., l[5].
Noteu que una subseqüència pot ser buida. Això és el que passa quan l'extrem dret està damunt del esquerre o a l'esquerra d'aquest. Per exemple, el segment l[2:2] i el segment l[4,2] són una seqüència buida.
Exemples:
La definició és coherent tant sobre l'índex primari com sobre l'índex secundari com sobre ambdós. Recordi's que el signe només ens diu a quin índex ens referim. Així, per a la llista l=[10,20,30,40,50,60] el segment l[-5:5], ens parla de la subseqüència que va des de l'element l[-5] —el 20— fins a l'anterior al l[5] —el 50—; per tant és la subseqüència [20,30,40,50].
Observeu els següents segments:
Semàntica
La semàntica segueix la mateixa lògica que el cas de l'indexat simple.
Segments estesos (extended slices)
Els segments estesos afegeixen als segments ordinaris el concepte de «pas». El pas determina la forma en com passem d'un element al següent en calcular la subseqüència. Per exemple, si l=[10,20,30,40,50,60], llavors l[0:5:2] denota la subseqüència que comença a l[0] i, comptant de 2 en 2, acaba abans de l[5], és a dir [10, 30 50].
Els segments estesos apliquen també quan l'indexat del segment és secundari. Per exemple, l[-5:-1:2] obté [20,40], com també ho faria l[-5:5:2].
El pas pot ser negatiu. En aquest cas el significat del signe no coincideix amb el significat del signe dels segments o de l'indexat. Que el pas sigui negatiu significa que recorrem la seqüència de dreta a esquerra per calcular la subseqüència. En aquest cas, també canvia la manera d'entendre els límits del segment, que cal que vagin de dreta a esquerra per coherència. Així, assumint l=[10,20,30,40,50,60], l'expressió l[4:1:-1] calcula [50,40,30]. Naturalment, els límits del segment es poden expressar també amb índexs secundaris. Així, l[-1:0:-1] calcula [60,50,40,30,20].
Semàntica