Convertire, formattare

Come far stampare a Python quello che vogliamo noi.

Abbiamo visto che esistono diversi tipi di oggetti: int, float, string, list, ... È indifferente usare un tipo o un altro? Proviamo a chiederlo direttamente a Python, costruiamo 3 oggetti che contengono il numero 7:

>>> i = 7
>>> f = 7.
>>> s = "7"

e confrontiamoli tra di loro:

>>> i == f
True
>>> i == s
False
>>> f == s
False

Alcune osservazioni:

  1. Come vedi il simbolo = viene usato in due modi. Nel solito modo funge da operatore di assegnazione. Invece, se ripetuto due volte (così: ==) serve a confrontare due valori.
  2. Se i due valori sono uguali, il confronto darà come risultato True, altrimenti darà come risultato False.
  3. True e False sono particolari oggetti di Python, ed indicano, ovviamente, ciò che tutti noi intendiamo per vero e falso.

Evidentemente i contenuti delle variabili precedenti non sono tutti uguali! E il primo caso? Al suo interno Python tratta in modo diverso numeri interi e numeri razionali o in vircola mobile (float), ma quando serve converte gli interi in razionali.

Python mette a disposizione delle funzioni che cercano di trasformare un oggetto di un tipo in un oggetto di un altro tipo. È possibile trasformare un numero intero in un numero numero in virgola mobile e viceversa (ovviamente perdendo i decimali), una stringa che contiene un numero in un numero corrispondente e viceversa, un numero in una stringa. Se nella shell omettiamo l’istruzione print, IDLE mostra il dato con alcune informazioni in più.

>>> i
7
>>> f
7.0
>>> s
'7'
>>> int(f)
7
>>> str(i)
'7'
>>> float(s)
7.0

Nel passaggio da Python 2 a Python 3 il comportamento della divisione è cambiato: in Python 3 la divisione dà sempre come risultato un numero decimale (in questa versione anche l’istruzione print si comporta in modo differente). Quanto segue riguarda il comportamento di Python 2. Supponiamo di avere nella variabile a il numero 15 e nella variabile b il numero 4 e di voler ottenere la stampa di questa stringa: “15/4=3.75”. Creiamo le nostre variabili e usiamo i metodi che già conosciamo:

>>> a = 15
>>> b = 4
>>> print a, "/", b, "=", a/b
15 / 4 = 3

La divisione dà solo la parte intera del quoziente, ma se trasformiamo una variabile intera in virgola mobile otteniamo il risultato corretto:

>>> print a, "/", b, "=", float(a)/b
15 / 4 = 3.75

I calcoli ora sono esatti, ma non mi piacciono gli spazi inseriti. Per eliminarli, posso evitare le virgole, trasformare in stringhe ogni numero e concatenare le stringhe:

>>> print str(a) + "/" + str(b) + "=" + str(float(a)/b)
15/4=3.75

Ottengo esattamente quello che volevo, ma l’istruzione è penosa da scrivere... Python mette a disposizione un altro metodo per ottenere lo stesso risultato: la formattazione di stringhe. Scrivo la stringa come voglio ottenerla, ma al posto delle variabili metto dei segnaposto: “{}”, a questo punto viene chiamato il metodo format passandogli gli argomenti che sostituiranno i segnaposti.

>>> print("{}/{}={}".format(a, b, a/b))
15/4=3.75

Riassumendo

  • È possibile entro certi limiti trasformare un oggetto in un altro.

  • Questo permette di trattare interi come float, stringhe come interi, ...

  • È possibile costruire stringhe con il metodo format:

    <stringa con segnaposti>.format(oggetto1, oggetto2, ...)
    

    usando come segnaposti “{}”.

Prova tu

  1. Prova le seguenti linee di comando e prendi nota di ciò che fa Python.

    >>> int(10)
    >>> int("10")
    >>> int(10.3)
    >>> float(10)
    
    >>> float("10")
    >>> float(10.3)
    >>> str(10)
    >>> str("10")
    
    >>> print(str(1.3)+'1')
    >>> print(str(10)*5)
    >>> print(float(10)*5)
    >>> print(float(5)/2)
    
  2. Riprendi gli esercizi 3, 5, 6 del capitolo riguardante le espressioni e costruisci delle stringhe con la risposta completa al problema usando la conversione di tipo con la concatenazione e poi usando la formattazione di stringhe (ad es. “L’ipotenusa di un triangolo con i cateti lunghi 3 e 4 è lunga 5”).

  3. Metti il valore 5 nella variabile base e il valore 3 nella variabile esponente, poi scrivi il comando per ottenere la stringa: “5^3=125” usando le funzioni di conversione e la formattazione di stringa.

  4. Metti in una variabile un numero intero, poi scrivi l’istruzione che produce la stringa formata dal numero della variabile, dal suo quadrato e dal suo cubo, separati da un tabulatore.