martedì 19 febbraio 2013

Mission Python - Stringhe e format()

Recentemente ho pubblicato un post, su OK, panico in cui c'è codice Python che ha destato qualche perplessità. Il package SymPy è grosso, articolato, fa tante cose e va assimilato un po' per volta ma non è di quello che voglio parlare.

Si tratta del trattamento dell'output, in particolare dell'istruzione format().
Chi si è lamentato ha in parte ragione: format() è un casino! Come lo è negli altri linguaggi, per esempio nel C/C++ ma anche nel Basic (sempre che si usi ancora PRINT USING).
L'help online di Python è abbastanza completo, ci sono gli esempi, qui, ma ecco un esempio semplice-semplice che spero chiarisca i dubbi (st.py).

#!/usr/bin/python
# -*- coding: utf-8 -*-

st = 'questa string viene spezzata | in corrispondenza della pipe'
pos = st.find('|')
print '"|" si prova in posizione', pos
print
print 'si può scrivere così:'
print st[:pos]   # cioè prima di |
print st[pos+1:] # cioè dopo |
print
print 'ma per eliminare i blank:'
print st[:pos].rstrip()   # r come destra
print st[pos+1:].lstrip() # l come sinistra
print
print "in un'unica istruzione:"
print st[:pos].rstrip() + '\n' + st[pos+1:].lstrip() # \n = a capo
print
print 'ma il "+" per le stringhe è lento, allora:'
print '{0}\n{1}'.format(st[:pos].rstrip(), st[pos+1:].lstrip())
print
print 'che si può scrivere anche:'
print '{}\n{}'.format(st[:pos].rstrip(), st[pos+1:].lstrip())
print
print 'o anche:'
print '{:s}\n{:s}'.format(st[:pos].rstrip(), st[pos+1:].lstrip())

Allora abbiamo una stringa troppo lunga che vogliamo spezzare in corrispondenza del carattere |.
La posizione la determiniamo con find(). Siccome find() è un metodo delle stringhe la sintassi è quella oggetto-punto-metodo, nel nostro caso st.find('|'). Questa restituisce un intero corrispondente alla posizione del carattere cercato; se questo manca restituisce -1.
La sottostringa di st contente i caratteri da a a b (escluso) si scrive st[a:b]. Se voglio la sottostringa fino a b (escluso) scrivo st[:b] (sì, potrei scrivere anche st[0:b]). Se voglio la sottostringa da b (escluso) alla fine scrivo st[b+1:] (sì, potrei scrivere st[b+1:len(st)]).
Se voglio eliminare gli spazi all'inizio e alla fine della stringa userò la strip(). Per eliminarli solo all'inizio userò lstrip() dove l sta per left, sinistra. Idem per la fine rstrip() con r per right, destra.

Per concatenare le stringhe (unirle) si può usare + ma non viene considerato bello. (OK, di solito lo uso, va benissimo).
Allora entra in gioco la format(), altro metodo che si applica alle stringhe. Nel nostro caso possiamo usare uno qualunque dei 3 metodi impiegati nello script. Un'ultima cosa \n diventa 'a capo' come \t corrisponde a una tabulazione.

Per oggi basta così, resta da vedere il caso dei numeri, prossimamente.
Poi, pensa che bello: questo post mi ha permesso di fare il gemellaggio tra due blog, chissà se funziona. Chissà se la cosa piace a B., è stato lui a protestare (ma solo perché mi segue attentamente, merita una citazione, imho).

L'indice di Mission Python lo trovate qui.

3 commenti:

  1. Ottimo post! Ma i nostri blog sono più che gemelli... :))

    RispondiElimina
  2. Ciao, posterete ancora o il corso mitico MISSION PYTHON può considerarsi concluso?

    RispondiElimina
  3. Per il momento siamo fermi...diciamo che è finito il primo tempo :))

    RispondiElimina