Le Stringhe

In Python le stringhe sono sequenze di caratteri, in codifica Unicode UTF-8, che , una volta definite, non possono essere modificate. Tutto quello che abbiamo visto per le sequenze si applica anche alle stringhe; in questa parte riassumiamo e completiamo le informazioni sulle stringhe.

Nel codice Python le stringhe sono rappresentate come una sequenza di caratteri fra apici. Possono essere utilizzati indifferentemente apici singoli, oppure il doppio apice. Se una stringa e' delimitata da apici singoli puo' contenere doppi apici e viceversa, ad esempio sono stringhe valide:

'12345"6789'
"12345'6789"

Una stringa puo' essere vuota; una stringa vuota e' definita da:

a=''

Una stringa puo' essere composta da piu' linee, se delimitata da tre apici o tre doppi apici, esempio:

''' questa stringa
continua in questa riga '''

"""
altra stringa multilinea
anche questa linea fa parte della stringa """

Stringhe una dietro l'altra sono concatenate, anche se sono separate da spazi:

a='abcd' 'efg'
a== "abcdefg"

Entro le stringhe hanno significato particolare alcune sequenze precedute da backslash : "\" Alcune di queste sono un residuo delle codifiche che venivano utilizzate il controllo del carrello per le stampanti a modulo continuo, altre sono usate per inserire valori in diverse codifiche.

La decodifica di questi caratteri speciali non avviene nelle stringhe "raw", che sono indicate dalla lettera r prima della stringa, ad esempio:

a=r"12n4g"

Alcuni di queste sequenze speciali sono:

\\ : e' il carattere "\" (Backslash)

\' : apice singolo '

\" : doppio apice "

\a : e' un suono di allarme (ASCII Bell (BEL) )

\b : indica indietro un carattere (ASCII Backspace (BS) )

\f : indica che si va a capo (ASCII Formfeed (FF) )

\n : indica che si va a capo (ASCII Linefeed (LF))

\r : indica che si va a capo (ASCII Carriage Return (CR))

\t : tabulazione orizzontale (ASCII Horizontal Tab (TAB))

\v : tabulazione verticale (ASCII Vertical Tab (VT))

\xhh : carattere in notazione esadecimale ( hh sono le cifre esadecimali)

\ooo : carattere in notazione ottale ( ooo sono le cifre ottali)

\0 : carattere nullo

Per specificare la codifica unicode si possono usare le notazioni:

\uxxxx : ove xxxx sono cifre esadecimali

\Uxxxxxxxx : ove xxxxxxxx sono cifre esadecimali

\N{name} : nome unicode del carattere

In Python 2 i caratteri fra apici rappresentavano stringhe in codifica ASCII, e per usare codifica Unicode si doveva usare la lettera u od U avanti alla stringa: a=u"asdl" . Questo non e' piu' necessario in Python 3 perche' di default la codifica e' UTF-8.

Una notazione simile a quella usata per le stringhe puo' essere usata per definire sequenze di byte. Per farlo, davanti alla stringa si mette il carattere "b" ; ad esempio per creare sequenza di bytes ed assegnarla ad "a"

a=b'abcd'

Ci sono diversi caratteri che indicano che si va a capo, quello che si usa in Unix (e Linux) e': \n , il DOS non usa gli stessi caratteri di Unix per indicare la fine di una linea. \r \f \t \v sono comandi che servivano a controllare il carrello nelle stampanti a modulo continuo.

Sottostringhe

Ai singoli caratteri di una stringa od a sottostringhe si puo' accedere facilmente, utilizzando un indice, fra parentesi quadre. Il primo carattere di una stringa ha l'indice 0. Indici negativi indicano che si inizia a contare da fine linea: -1 e' l'ultimo elemento. Sottostringhe sono individuate da coppie di indici separate da :, il primo valore della coppia e' l'indice del primo carattere che si estrae, vengono estratti caratteri fino al secondo indice (escluso), quindi ad esempio 0:3 indica caratteri nelle posizioni: 0,1,2, il carattere in posizione 3 non viene estratto. Se manca il primo indice si inizia dal primo carattere, se manca il secondo si arriva a fine stringa. Un terzo valore, opzionale, indica il passo con cui si estraggono i caratteri; ad esempio un passo 2 estrae un carattere si ed uno no. Se il terzo valore manca si intende sia 1 e vengono estratti tutti gli elementi fra gli indici indicati. Passi negativi vanno all'indietro, nella sequenza dei caratteri, questo modo di estrarre elementi (slicing), vale per tutte le sequenze, non solo per le stringhe.

Esempi:

a='0123456'

a[0]        vale '0'
a[1]        vale '1'
a[-1]       vale '6'
a[-2]       vale '5'

a[:] a[0:]  sono tutta la stringa
a[:0]       e' la stringa vuota

a[:3]      vale '012'
a[3:]      vale '3456'


a[0:2]     vale: '01'
a[1:3]     vale: '12'
a[:-1]     vale: '012345'
a[-3:-1]   vale: '45'
a[-1:-3]   vale '' (la stringa vuota)

a[::-1]    vale  '6543210'  (ribalta la stringa)

a[0:5:2]   vale '024'    (da 0 a 5, passo 2 )

a[1::2] vale: '135' , si va dall'elemento 1 alla fine della stringa
                      prendendo un elemento si ed uno no.

a[1::3] vale:  '14'    si prende un elemento ogni 3.

a[-1:-5:-2] vale '64' : passo negativo va all'indietro.
a[-1:-3:1]   vale '' :la stringa vuota:  il passo e' +1 e' in avanti.
                      e' come: a[-1:-3]

Una stringa puo' facilmente essere separata in caratteri, con una assegnazione del tipo:

f1,f2,f3='abc'

f1,f2 ed  f3 assumono i valori dei caratteri 'a', 'b', 'c'

Operazioni su stringhe

L'operatore "+" concatena le stringhe; l'operatore "*" ripete una stringa un certo numero di volte:

Esempi:

a='0123456'
b='abcdefg'

a+b  e' la stringa: '0123456abcdefg'
b*2  e' la stringa: 'abcdefgabcdefg'

L'operatore "in" da risultato: True se una sottostringa e' compresa in una stringa:

Esempi:

'0' in a    vale: True
'01' in a   vale: True
'09' in a   vale: False

In una istruzione for su una stringa la variabile assume i valori dei caratteri della stringa. Ad esempio, l'espressione nell'esempio seguenteproduce, nei cicli del loop, un valore di "i" che assume, in ordine, tutti i valori dei caratteri della stringa

for i in a:
   i

Funzioni per le stringhe

Ci sono molte funzioni per trattare le stringhe; se: a= '0123456' ; b='abcedfg' :

len(a) e' 7: il numero di caratteri della stringa

min(a) e' '0' il carattere piu' piccolo (nella sequenza dei caratteri ASCII)

max(a) e' '6'

max(b) vale: 'g'

Alcune funzioni sono attributi dell'oggetto stringa, per cui la sintassi e' diversa:

b.index('c') e': 2 : l'indice del carattere 'c' nella stringa

b.capitalize() e' la stringa: 'Abcdefg' (primo carattere maiuscola)

b.upper() e' la stringa: 'ABCDEFG' ( muta i caratteri in maiuscolo)

b.lower() muta i caratteri in minuscolo

b.replace('a','X') e' la stringa: 'Xbcdefg' , cambia il carattere a in X

b.replace('a','X',3) effettua la sostituzione per le prime 3 sottostringhe che trova (di default fa la sostituzione per tutte)

split : la funzione split, dato in argomento un separatore, crea una lista con le parti della stringa. L'argomento di default di split e' uno spazio bianco, bianchi ripetuti sono compattati; la funzione e' un attributo dell'oggetto stringa.

Esempi:

 b='1,2,3' ; s=b.split(',')  # produce ['1', '2', '3']

'   a   b '.split()  produce: ['a', 'b']

join : la funzione unisce piu' stringhe in una sola, separandole con una stringa data.

'-'.join(["a","b","c"])      #  produce:  'a-b-c'

Esempi di Conversioni di numeri in stringhe e viceversa ( qui a='123456' ):

int(a) e' il numero 123456, analogamente str(450) e' la stringa '450'

float(a) muta una stringa in un numero in virgola mobile.

str(1.6E3) e' la stringa '1600.0'

ord('A') da 65, codice ascii del carattere

chr(65)  fornisce 'A'

bin(2)     produce: '0b10'

hex(16)  produce: '0x10'

oct(8)  produce: '0o10'

Ci sono molte altre funzioni per le stringhe: funzioni che riconoscono se una stringa e' minuscola o maiuscola od un numero, per trovare sottostringhe, per contare quante volte una sottostringa e' contenuta in una stringa, per trasformare tabulazioni in spazi bianchi, per trovare in che punto di una stringa si trova una sottostringa, per vedere se una sottostringa termina od inizia con certi caratteri, per creare una stringa che ne contenga un'altra piu' piccola al centro etc. Alcune di queste funzioni sono nella tabella che segue:

stringa.rstrip()     : elimina \n alla fine

stringa.isalpha()    : True se contiene solo caratteri alfabetici

stringa.isnumeric()  : True se e' un numero

stringa.islower()    : True se caratteri minuscoli

stringa.isupper()   : True se caratteri maiuscoli

stringa.expandtabs(4)          : mette 4 spazi al posto dei tab

stringa.ljust(width,fillchar)  : allinea la stringa a sinistra
stringa.rjust(width,fillchar)  : allinea la stringa  a destra

stringa.startswith(stringa2) : True se inizia con la stringa2
stringa.endsswith(stringa2)  : True se finisce con la stringa2

Format

Abbiamo gia' visto l'operatore "%" , che permette di trasformare numeri e stringhe in un'unica stringa "formattando" i dati in modo simile a come viene effettuato dalle funzioni di stampa del linguaggio C.

In python3 c'e' anche la funzione "format" per fare questo, e Rossun diceva che l'operatore "%" sarebbe stato eliminato prima o poi. L'uso della funzione format e':

'{0} {1}, {2:.0f} you'.format(1, 'spam', 4.0)

format ha come argomenti le variabili da formattare, ed e' un attributo delle stringhe. La stringa di formattazione ha i place-holders per gli argomenti rappresentati con numeri, fra parentesi graffe, eventualmente seguiti da ":" e la specifica di formato.

Ecco alcuni esempi di uso della funzione format:

'{0:.2f}'.format(1.3333))                    produce: '1.33'
format(1.3333, '.2f')                        produce: '1.33'
'{page}: {book}'.format(page=2, book='PR5E') produce: '2: PR5E'
'{0:10} = {1:10}'.format('spam', 123.4567)   produce: 'spam       =   123.4567'

Si puo' anche usare la sintassi seguente (keyword arguments) per specificare i place-holders

'{motto}, {0} and {food}'.format(42, motto=3.14, food=[1, 2])

Produce: '3.14, 42 and [1, 2]'

f-string

Le f-string (formatted string literals), sono state introdotte con Python 3.6, del 2016. Sono stringhe precedute dalla lettera "f" (o "F" ), e contengono, fra parentesi graffe, espressioni Python arbitrarie, valutate all'esecuzione. Il risultato viene poi inserito nella stringa.

L'espressionme puo' essere seguita da: "!r" , "!s", "!a", che indicano il modo di conmvertire la stringa in carattetri, rispettivamente con le funzioni repr() , str(), od ascii().

Una specifica di formattazione, analogo a quelle usate per "format", puo' essere inserita, alla fine dell'espressione (dopo l'eventuale "!r"), preceduta da ":"

Esempi:

name = 'gigi'
num=123
a=F'Hello {name}, Your number is {num*2}'
'Hello gigi, Your number is 246'

num=124.3
f"{num!s:>10s}"
'     124.3'

b=5.0
a=3.2
f"b vale {3}, a vale {a}. La somma vale {a+b:10.2}"
'b vale 3, a vale 3.2. La somma vale        8.2'

width = 10
precision = 4
value = 12.34567
f"result: {value:{width}.{precision}}"
'result:      12.35'

today = datetime(year=2017, month=1, day=27)
f"{today:%B %d, %Y}"  # specifica di formato per le date
'January 27, 2017'

Template string

Le "template string" permettono sostituzioni di parti in lunghi testi:

from string import Template
student = 'Anna'
template = Template('Hello $name!')
a=template.substitute(name=student)

'Hello Anna!'