giovedì 28 febbraio 2013

Inserire codice Python nei post di Blogger

Cercavo un modo semplice per inserire codice Python (e non solo) all'interno dei post di Blogger.

Mi serviva un qualcosa che lo formattasse correttamente in pochi semplici passi, magari dotato di syntax highlighting, e che possibilmente non si appoggiasse a qualche script lato utente che lo avrebbe reso inutile per quanti viaggiano in rete con Javascript disabilitato nel browser.

È così che mi sono imbattuto in hilite.me.

Basta copiare il codice nell'apposito box, selezionare il linguaggio (Python e svariate altre decine a scelta), lo stile da usare, se visualizzare o meno i numeri di riga a lato del codice, e infine un click: compare sia la preview che mostra come quel codice sarà visualizzato nel post, sia il codice in puro HTML da incollare nell'editor di Blogger aperto in modalità HTML.

Un esempio dei risultati vale più di mille parole:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
""" Calcolo della radice quadrata con il metodo iterativo di Newton.
"""
import math

x = int(input("Inserisci il numero di cui calcolare la radice quadrata: "))
tolleranza = float(input("Inserisci la tolleranza desiderata (es. 0.0001): "))
z = 1.0
count = 0

while True:
    count += 1
    z = (z + (x / z)) / 2  # nuova e migliore approssimazione della radice quadrata.
    differenza = abs(x - z**2)  # calcola quanto dista l'approssimazione dalla radice reale.
    if differenza < tolleranza:
        break

print("Il valore calcolato con il metodo di Newton e':", z, "calcolato in", count, "iterazioni.")
print("Il valore calcolato con la funzione sqrt() di Python e'", math.sqrt(x))

Per quanti conoscono Python ed i suoi framework, il sito si appoggia a Flask come web framework e Pygments come syntax highlighter. Volendo vi è anche un'API da richiamare per avere in risposta del codice pronto in HTML in formato UTF-8.

venerdì 22 febbraio 2013

Formattazione di stringhe tramite l'operatore %

Python possiede numerosi strumenti per la formattazione delle stringhe. Quelli classici sono la concatenazione e le operazioni sulle sequenze come il sezionamento. Per esempio (in Python 3.x, per Python 2.x ricordatevi non servono le parenti per print):

concatenazione di stringhe

>>> concatenazione = "Stringa" + "intera"
>>> print(concatenazione)
Stringaintera

sezionamento di stringhe

>>> print(concatenazione[0:6])
String

Molto più sofisticate sono le "espressioni di formattazione di stringa". Qualche esempio per capire cosa sono e come funzionano:

>>> nome = "Pippo"
>>> eta = 50
>>> print("Ti chiami %s." % nome)
Ti chiami Pippo.

In pratica % fa da segnaposto all'interno della stringa fra i doppi apici: quando print viene eseguita il segnaposto viene sostituito con quanto disponibile nella variabile nome ed il tutto viene stampato. I segnaposto possono essere anche più di uno, così:

>>> print("Ti chiami %s e hai %d anni." % (nome, eta))
Ti chiami Pippo e hai 50 anni.

Da notare come i due segnaposto sono diversi:
  • il primo, %s, ha una s che sta per string (stringa) e indica che in quella posizione dovrà esserci una stringa di testo;
  • il secondo, %d, ha una d che sta per digit (numero) e indica che in quella posizione dovrà esserci un numero.
Inoltre quando le variabili a destra di % sono più d'una, vanno tra parentesi tonde.

Vediamo qualche altro esempio. Immaginiamo di voler visualizzare un numero da 1 a 9, e a fianco quel numero elevato sia al quadrato che al cubo:

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

Per generare questo assortimento male allineato di numeri bastano poche righe:

1
2
3
4
for x in range(1, 10):
    quadrato = x ** 2
    cubo = x ** 3
    print(x, quadrato , cubo)

Allineiamo le cifre tutte a destra usando un'espressione di formattazione di stringa:

1
2
3
4
for x in range(1,10):
    quadrato = x ** 2
    cubo = x ** 3
    print("numero:%4d%4d%4d" % (x, quadrato , cubo))

Il risultato:

   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

Da notare che %d ora è diventato %4d, dove il 4 sta a significare che ogni cifra deve essere formattata come se fosse ampia 4 colonne anche quando il numero è più piccolo.

Fate attenzione invece al caso in cui il numero o più in generale la stringa da formattare è più grande delle colonne da noi stabilite: in questo caso Python non applica nessuna formattazione.

Nel prossimo post vedremo ulteriori utilizzi dell'operatore % di formattazione delle stringhe.