giovedì 29 novembre 2012

Gestire l'output con format()

Salve!

Intanto la nostra "Mission Python" va avanti....Sono stato fuori tutta la giornata e al ritorno ho trovato una bella sorpresa...stava lì buona buona in gmail...Le sorprese si condividono, vero? Ecco a voi nuovo post del caro Juhan!! Vi avviso, è un po' tosto...Il post, ovvio...ma anche Juhan! Non per niente nel post si parla del pythonista tosto. :))


Recentemente abbiamo visto come leggere e scrivere su file. Tutto OK? No un problema ce l'abbiamo ancora, vediamo un esempio (troppe.py):
#!/usr/bin/python
# -*- coding: utf-8 -*-

import math

area = 120

raggio = math.sqrt(area / math.pi)
lato = math.sqrt(area)
rapp = 2 * raggio / lato

print "Raggio del cerchio =", raggio
print "Lato del quadrato =", lato
print "Rapporto diametro / lato =", rapp 

OK, ma troppa grazia! cosa ce ne facciamo di tutte quelle cifre? Riusciremmo mai a fare un segmento lungo così con un righello? Poi qualche matematico è anche capace di dire che sono valori approssimati.
E allora io direi di approssimarli come si deve, per esempio con due cifre decimali (due.py):
#!/usr/bin/python
# -*- coding: utf-8 -*-

import math

area = 120

raggio = math.sqrt(area / math.pi)
lato = math.sqrt(area)
rapp = 2 * raggio / lato

print "Raggio del cerchio =", round(raggio, 2)
print "Lato del quadrato =", round(lato, 2)
print "Rapporto diametro / lato =", round(rapp, 2) 

Meglio vero? Ma non è elegante. E poi se andate a vedere write() accetta un solo argomento e sarebbe bello avere qualcosa di più pratico. Pensa te che cu--- fortuna: ce l'abbiamo!

Anzi ci sono due modi, quello vecchio (lo trovate ancora, continua a funzionare ma è sconsigliato) e quello nuovo.

Cominciamo a vedere il modo vecchio (vecchio.py):
#!/usr/bin/python
# -*- coding: utf-8 -*-

import math

area = 120

raggio = math.sqrt(area / math.pi)
lato = math.sqrt(area)
rapp = 2 * raggio / lato

s1 = "Raggio del cerchio = %.2f" %raggio
s2 = "Lato del quadrato = %.2f"  %lato
s3 = "Rapporto diametro / lato = %.2f" %rapp 
print s1
print s2
print s3

Ma un pythonista (sì, si dice così) lo script lo scriverebbe probabilmente così (pyvecchio.py):
#!/usr/bin/python
# -*- coding: utf-8 -*-

import math

area = 120

raggio = math.sqrt(area / math.pi)
lato = math.sqrt(area)
rapp = 2 * raggio / lato

s1 = "Raggio del cerchio = %.2f\nLato del quadrato = %.2f" %(raggio, lato)
s2 =  "Rapporto diametro / lato = %.2f" %rapp 
print s1
print s2

Il risultato è usuale al precedente.

Se trovate la riga st1 = ... troppo lunga avete ragione: un pythonista tosto scriverebbe così (pytosto.py):
#!/usr/bin/python
# -*- coding: utf-8 -*-

import math

area = 120

raggio = math.sqrt(area / math.pi)
lato = math.sqrt(area)
rapp = 2 * raggio / lato

st = "Raggio del cerchio = %.2f\n\
Lato del quadrato = %.2f\n\
Rapporto diametro / lato = %.2f" %(raggio, lato, rapp) 

print st

Notare che un backslash (\) al termine della riga viene interpretato come "la riga continua".

Però a un certo punto si è deciso di cambiare tutto. E tanto vale che ci abituamo anche noi, tanto è così che si fa adesso come quando "ce lo chiede l'Europa"

Il modo attuale usa format(), metodo delle stringhe (OK, dobbiamo ancora vedere bene cosa sono i metodi, prossimamente, per adesso diciamo che è una funzione). Nell'help online lo trovate qui.

Le specifiche di format() sono parecchie, le trovate qui

 e a prima vista possono intimidire ma niente panico! Ecco l'esempio precedente attualizzato (nuovo.py):
#!/usr/bin/python
# -*- coding: utf-8 -*-

import math

area = 120

raggio = math.sqrt(area / math.pi)
lato = math.sqrt(area)
rapp = 2 * raggio / lato

st = "Raggio del cerchio = {:.2f}\n\
Lato del quadrato = {:.2f}\n\
Rapporto diametro / lato = {:.2f}".format(raggio, lato, rapp) 

print st

OK, finora niente di che, vero. Riprendiamo un esercizio vecchio, la tabella dei quadrati e cubi, fatta qui

Dateci un'occhiata e vedrete che le colonne non sono allineate bene. Propongo di rifarlo, aggiungendoci le radici quadrate (tab-qcr.py):
#!/usr/bin/python
# -*- coding: utf-8 -*-

import math

st = "\t{:2d}  {:4d}  {:5d}  {:5.2f}"
print "\tn    n^2    n^3   rad" 
for i in range(1, 11):
    print st.format(i, i**2, i**3, math.sqrt(i))
print "\nOK"

OK? Mi sa che format() richiede un altro post, con esempi per i vari casi. Sì lo so è una pizza, ma è così. Alla prossima.

Juhan

L'indice di "Mission Python" lo trovate qui.

Nessun commento:

Posta un commento