• Non ci sono risultati.

Formattazione Avanzata dell'Output.

Nel documento Manuale Pyton (pagine 61-65)

7. Input e Output.

7.1. Formattazione Avanzata dell'Output.

Finora abbiamo incontrato due modi di scrivere valori: le dichiarazioni di espressioni e la funzione print(). Un terzo modo è usare il metodo write() dell'oggetto file, il file di output standard ha come riferimento lo sys.stdout (Vedere la Library Reference per ulteriori informazioni in proposito).

Spesso si desidera avere un maggiore controllo sulla formattazione dell'output invece che stampare semplicemente dei valori separati da spazio. Ci sono due modi per formattare l'output:

• il primo modo è quello di fare tutto con la gestione delle stringhe; tramite operazioni di divisione e di concatenazione con ciò è possibile creare qualsiasi presentazione che si possa immaginare. Il tipo stringa ha alcuni metodi che eseguono operazioni utili per la formattazione in considerazione di una determinata larghezza di colonna, che saranno discusse a breve.

• Il secondo modo è quello di utilizzare il modulo string che contiene il metodo str.format() e una classe modello (Template) che offre un modo diverso per sostituire i valori nelle stringhe.

ha un modo per convertire qualsiasi valore in una stringa, passando alle funzioni repr() o str() Il controllo dell'output.

La funzione str() è concepita per restituire una rappresentazione dei valori che sono abbastanza leggibili, mentre repr() è destinata a generare rappresentazioni che possono essere lette dall'interprete (che provocano l'eccezione Syntax Error se non c'è una sintassi equivalente). Per gli oggetti che non hanno una rappresentazione particolare per il contesto, str() restituirà lo stesso valore di repr(). Molti valori, come numeri strutture o liste e dizionari, mostrano la stessa rappresentazione utilizzando la funzione Strings, in particolare, hanno due distinte rappresentazioni.

Ecco alcuni esempi:

>>> s = 'Ciao mondo.' >>> str(s) 'Ciao mondo.' >>> repr(s) "'Ciao mondo.'" >>> str(1/7) '0.14285714285714285' >>> x = 10 * 3.25 >>> y = 200 * 200 >>> s = 'Il valore di x è ' + repr(x) + ', e di y è ' + repr(y) +  '...' >>> print(s) Il valore di x è 32.5, e di y è 40000... >>> # repr() aggiunge alla stringa le virgolette e la barra rovescia ... hello = 'Ciao mondo\n' >>> hellos = repr(hello) >>> print(hellos) 'Ciao mondo\n' >>> # L'argomento di repr() può essere un oggetto Python ... repr((x, y, ('spam', 'uova'))) "(32.5, 40000, ('spam', 'uova'))"

Questi sono due modi per scrivere un tabella di quadrati e cubi: 1° modo >>> for x in range(1, 11): ...     print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ') ...     # Notare l'uso di 'end' sulla precedente linea ...     print(repr(x*x*x).rjust(4)) ...  1   1    1  2   4    8  3   9   27  4  16   64  5  25  125  6  36  216  7  49  343  8  64  512

 9  81  729 10 100 1000 2° modo >>> for x in range(1, 11): ...     print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x)) ...  1   1    1  2   4    8  3   9   27  4  16   64  5  25  125  6  36  216  7  49  343  8  64  512  9  81  729 10 100 1000

Si noti che nel primo esempio, che uno spazio tra ogni colonna che è stata aggiunto dal metodo print() il quale, aggiunge sempre gli spazi tra i suoi argomenti.)

Questo esempio illustra il metodo str.rjust() per gli oggetti stringa, che giustifica a destra una stringa in un campo di una data ampiezza riempiendola di spazi a sinistra. Esistono metodi complementari str.ljust() e str.center(). Questi metodi non scrivono nulla, ma restituiscono una nuova stringa formattata. Se la stringa di input è troppo lunga, non viene troncata ma restituita intatta; questa scelta permette di non perdere dati a scapito di una formattazione che potrebbe non avere senso. Ma se lo scopo è quello di troncare comunque, è sempre possibile utilizzate la funzione di divisione del tipo x.ljust(n)[:n].C'è un altro metodo, str.zfill(), che formatta una stringa numerica sulla sinistra con zeri. La si capisce in merito a segni più e meno:

>>> '12'.zfill(5)Input e Output '00012' >>> '­3.14'.zfill(7) '­003.14' >>> '3.14159265359'.zfill(5) '3.14159265359'

L'aspetto nell'uso base del metodo str.format() si presenta così:

>>> print('Noi siamo i {} che dicono "{}!"'.format('cavalieri',  'Ni'))

Noi siamo i cavalieri che dicono "Ni!"

Le parentesi e i caratteri al loro interno (chiamati campi di formato) vengono sostituiti con gli oggetti passati nel metodo str.format(). Un numero tra parentesi graffe può essere usato per riferirsi alla posizione dell'oggetto passato al metodo str.format().

>>> print('{0} e {1}'.format('pancetta', 'uova')) pancetta e uova

>>> print('{1} e {0}'.format('pancetta', 'uova')) uova e pancetta

Se argomenti di parole chiave vengono utilizzati nel metodo str.format(), i loro valori sono indicati utilizzando il nome dell'argomento.

>>> print('Questo {bevanda} è {aggettivo}.'.format( ...       bevanda='vino', aggettivo='veramente buono')) Questo vino è veramente buono.

Argomenti posizionali e parole-chiave possono essere combinati in modo arbitrario.

>>> print('La vita di {0}, {1}, e {altro}.'.format('Gianni',  'Alfredo', altro='Giorgio'))

La vita di Gianni, Alfredo e Giorgio.

Le seguenti forme contratte, possono essere utilizzate per convertire i valori prima della formattazione; '!a' (applica ascii()), '!s' (applica str()) e '!r' (applica repr()) possono essere usati per convertire il valore prima della formattazione:

>>> import math

>>> print('Il valore di PI approssimato è {}.'.format(math.pi)) Il valore di PI approssimato è 3.14159265359.

>>> print('Il valore di PI approssimato è {!r}.'.format(math.pi)) Il valore di PI approssimato è 3.141592653589793.

Un ':' opzionale seguito da una formattazione specifica, permette un maggiore controllo sul modo in cui il valore è formattato. L'esempio seguente arrotonda Pi a tre cifre dopo la virgola.

>>> import math

>>> print('Il valore di PI è approssimativamente  {0:.3f}.'.format(math.pi))

Il valore di PI è approssimativamente 3.142.

Passando un intero dopo il ':'farà sì che il campo sia un numero minimo di caratteri estesi. Questo è utile per fare tabelle ben formattate.

>> tabella = {'Alfredo': 4127, 'Gianni': 4098, 'Andrea': 7678} >>> for nome, telefono in tabella.items(): ...     print('{0:10} ==> {1:10d}'.format(nome, telefono)) ... Gianni      ==>       4098 Andrea      ==>       7678 Alfredo     ==>       4127

Se si ha una stringa di formato davvero lunga che non si vuole dividere, sarebbe bello se si potesse fare riferimento alle variabili da formattare per nome invece che per posizione. Questo può essere fatto semplicemente passando il dizionario e utilizzando le parentesi quadre '[]' per accedere alle chiavi.

>>> tabella = {'Alfredo': 4127, 'Gianni': 4098, 'Andrea': 8637678} >>> print('Gianni: {0[Gianni]:d}; Alfredo: {0[Alfredo]:d}; '

...       'Andrea: {0[Andrea]:d}'.format(tabella) Gianni: 4098; Alfredo: 4127; Andrea: 8637678

Ciò potrebbe essere fatto anche passando la tabella come argomenti chiave con la notazione '**'.

>>> tabella = {'Alfredo': 4127, 'Gianni': 4098, 'Andrea': 8637678} >>> print('Gianni: {Gianni:d}; Alfredo: {Alfredo:d}; Andrea: 

{Andrea:d}'.format(**table))

Gianni: 4098; Alfredo: 4127; Andrea: 8637678

Ciò è particolarmente utile in combinazione con la funzione precostituita vars(), che restituisce un dizionario contenente tutte le variabili locali.

Come si è potuto notare, Python possiede una capacità di formattazione dell'output veramente notevole che permette buoni risultati estetici con poca fatica. Tutto questo è utile per formattazioni su schermo a linea di comando oppure per la scrittura su file, ma perdere un po' di valore quando Python viene utilizzato con interfacce grafiche le quali si occupano in prima persona della formattazione dei vari campi.

Per una panoramica completa sulla formattazione delle stringhe usando str.format() , fare riferimento a Format String Syntax.

7.1.1. Formattazione Stringhe Classica.

L'operatore % può essere utilizzato anch'esso per la formattazione di una stringa. Esso interpreta l'argomento di sinistra come la stringa di formato sprintf(), e restituisce la stringa formattata da questa operazione. Ma vediamolo meglio con un' esempio:

>>> import math

>>> print('Il valore approssimato di PI è %5.3f.' % math.pi) Il valore approssimato di PI è 3.142.

Ulteriori informazioni possono essere trovate nella sezione printf-style String Formatting .

Nel documento Manuale Pyton (pagine 61-65)