Tractament de cadenes en Python
El tractament de cadenes de Python és potser una d'aquelles coses que fan el llenguatge més potent. He fet feina amb altres llenguatges: C, C++, Forté, Pascal, Basic, ... i de lluny el tractament de cadenes de Python és el més clar, potent i a la vegada intuïtiu que m'he trobat, sols s'hi atraca un poc un llenguatge un tant esotèric anomenat icon al qual m'hi vaig aficionar ja fa molt de temps.
Anem a veure un parell d'exemples:
>>> a = "hola"
>>> b = ' món'
>>> print a+b
hola món
Com podem veure no import si feim servir cometes dobles o simples, i la concatenació de cadenes és simplement una suma. Tot i això hem de saber que les cadenes són també objectes i un dir ens dirà el que hi podem fer
>>> dir(a)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__',
'__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__',
'__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__',
'__rmul__', '__setattr__', '__str__','capitalize', 'center', 'count', 'decode',
'encode', 'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdigit',
'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition',
'replace', 'rfind', 'rindex', 'rjust', 'rpartition','rsplit', 'rstrip', 'split', 'splitlines',
'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
Per exeple un help(a.zfill) ens dirà què fa aquesta funció
Help on built-in function zfill:zfill(...) S.zfill(width) -> string
Pad a numeric string S with zeros on the left, to fill a field
of the specified width. The string S is never truncated.
(END)
És a dir, afegeix zeros a l'esquerra fins a l'emplada que volguem:
>>> a.zfill(10)
'000000hola'
Juguem un poc més amb les cadenes, què us imaginau que passarà si multiplicam una cadena per un sencer?
>> a*2
'holahola'
Bastant previsible, no? Python té aquestes coses, que pots preveure què passarà sense tenir-ne massa idea del llenguatge.
Suposem ara que volem agafar trossos d'una cadena, python tracta les cadenes com a matrius de caràcters i per tant és possible fer coses com aquestes:
>>> test = "hola món què 'passa' per aquí"
>>> print test[0]
'h'
>>> print test[0:4]
hola
>>> print test[:4]
hola
>>> print test[9:]
què 'passa' per aquí
>>> print test[9:22]
què 'passa'
>>> print test[9:-9]
què 'passa'
Fixem-nos en el darrer exemple, hem fet servir valors negatius per a referir-nos al final de la cadena.
També podem fer coeses com un recorregut pels caràcters de la cadena amb
>>> for char in test:
... if char == "'":
... print "cometa"
...
cometa
cometa
>>> [x for x in test if x > 'h']
['o', 'l', 'm', 'xc3', 'xb3', 'n', 'q', 'u', 'xc3', 'xa8',
'p', 's', 's', 'p', 'r', 'q', 'u', 'xc3', 'xad']
Però de llarg la meva preferida és la possibilitat de crear plantilles, a l'estil del printf de C o de les que darrerament ha incorporat Java 5, que ja era hora!
>>> missatge="hola %s, avui vindré a les %i"
>>> print missatge % ('Maria', 10)
hola Maria, avui vindré a les 10
O fins i tot fer servir diccionaris per això:
>>> missatge="hola %(nom)s, avui vindré a les %(hora)i"
>>> params = {'nom':'Catalina', 'hora':8}
>>> print missatge % params
hola Catalina, avui vindré a les 8
Me deix tota la part de funcions, expressions regulars i altres, això és sols per obrir boca, i potser ajudar a entendre a alguna gent del perquè el Python m'agrada tant.
Us deix algunes referències: