|
Completiamo l'analisi dei comandi esaminando il comando di stampa, ovvero "print".
Semplicemente, print valuta l'espressione che lo segue e visualizza il valore risultate.
Si possono separare da virgole gli argomenti, e in questo caso l'output risultante risulterà separato da spazi.
Alla fine della linea print aggiunge un ritorno a capo. Se non si vuole questo ritorno a capo è sufficiente che l'ultimo elemento di una espressione da stampare sia una virgola.
La caratteristica di print è di stampare stringhe. A volte si vuole però ottenere la stampa di numeri o di altri tipi di oggetti. La cosa più naturale, che è di concatenare una stringa ad un numero, non funziona:
>>> print "ciao "+1
Traceback (most recent call last):
File "<interactive input>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects
Occorre invece trasformare in stringa il numero con la funzione str(): quindi
>>> print "ciao "+str(1)
ciao 1
La funzione repr() è molto simile a str ma ha una importante differenza: tenta di produrre output adatto non tanto alla leggibilità per l'uomo quanto per l'interprete. In pratica è più utile quando si scrivono dati in un file che poi dovranno venire riletti. Ci sono delle leggere differenze tra i due metodi che si notano maggiormente per le stringhe e i numeri in virgola mobile. Per esempio:
>>> s = 'ciao' ; n = 0.1
>>> print str(s), str(n)
ciao 0.1
>>> print repr(s), repr(n)
'ciao' 0.10000000000000001
Quando si compogono delle stampe sono utili i metodi che si occupano di giustificare a destra o a sinistra le stringhe, e in particolare per i numeri, quelli che si occupano di aggiungere zeri in testa. In particolare, string.ljust giustifica a sinistra aggiungendo spazi in coda fino a raggiungere la dimensione voluta, string.rjust giustifica a destra aggiungendo spazi in testa; infine string.zfill aggiunge zeri in testa fino a raggiungere la larghezza voluta del campo. Ecco un esempio:
>>> for i in range(1,10):
... print string.ljust(str(i*i), 3) + string.rjust(str(i*i),3),string.zfill(i+i, 3)
...
1 1 002
4 4 004
9 9 006
16 16 008
25 25 010
36 36 012
49 49 014
64 64 016
81 81 018
Sebbene questi metodi siano di una certa utilità, nella maggior parte dei casi viene utilizzato però l'operatore "%". Questo operatore, prende due parametri: una stringa e una tupla. La stringa contiene un "modello" di quello che si vuole ottenere, in cui certi elementi vengono sostituiti dai elementi nella tupla. Facciamo subito un esempio:
>>> "(%03d)(%4.2f)(%5s)(%-5d)" % (1,2,3,4)
'(001)(2.00)( 3)(4 )'
C'è molto da dire da questo semplice esempio. In particolare, "%" nella stringa inizia le stringhe di formato, che sono seguite da alcuni numeri, e che terminano con una lettera. Notiamo i significati: "d" serve per visualizzare un numero decimale, "f" per visualizzare un numero in virgola mobile, e "s" per le stringhe. Ce ne sono altri per la verità. Poi: "%5s" significa che l'ampiezza del campo è esattamente di cinque caratteri, che viene riempito di spazi in testa. Se invece scrivo "%-5d", utilizzando il meno sto dicendo che il campo deve essere riempito di spazi in coda. Per quanto riguarda i numeri, specificando uno 0 in testa come in "%03d" intendo che vengano aggiunti degli spazi in testa. Infine, con i numeri in virgola mobile, posso utilizzare una espressione come questa: "%5.2f", dove il numero 5 indica la lunghezza totale del campo, il .2 indica la precisione (ovvero il numero di cifre decimali).
I vari dichiaratori di formato (così si chiamano le sottostringhe che cominciano con "%" e finiscono con una lettera) si applicano in ordine di apparizione agli elementi della tupla. Ma è possibile utilizzare come parametro anche gli elementi di una hash map. Questo si deve immediatamente dal seguente esempio:
>>> map = { "uno": 1, "due": 2 }
>>> "a:%(uno)d b:%(due)s" % map
'a:1 b:2'
In pratica, scrivendo "%(uno)d" si accede all'elemento di chiave "uno" nella hash map che segue l'operatore. Questo elemento viene poi formattato con le usuali regole già prima descritte.
|