07 maggio, 2019

Codice chiaro: list comprehension


Alle volte i giovani sono molto più informati, aggiornati e --in una parola-- nerd di me. Lo so io sono solo wannabe-nerd e vecchio, mica facile adeguarsi.
Ah! 'na roba: una volta si usava commentare così lo sapevano tutti,intesi come quei pochi che leggono il post, ma the times they are a-changin' (cit.).
Allora provo anch'io ad andare di grok (si usa questa espressione?).

La versione Python dello script per inserire spazi tra i caratteri di una stringa del post Modi diversi per utenti diversi poteva essere scritta meglio, mi dicono.

Vero, verissimo, basta usare la list comprehension. Prossimamente riparlerò di questo argomento, più in dettaglio, come anche argomenti simili, p.es. map ma subito la nuova versione dello script.

Wikipedia è ottima per introdurre l'argomento nella sua definizione matematica e il suo inserimento, storicamente, nei linguaggi di programmazione, qui List comprehension il inglese; la versione italiana, Comprensione di lista, è purtroppo solo un abbozzo.

La documentazione ufficiale di Python è scritta in legalese, Displays for lists, sets and dictionaries.

Uh! ahemmm... cioè sarebbe... Mi serve un esempio semplice per vedere se ho capito.

Se voglio la lista dei quadrati dei numeri naturali da 1 a 10; una volta (OK, ancora adesso si può scrivere:

>>> quad = []
>>> for n in range (1, 11):
...     quad.append(n * n)
...
>>> print(quad)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]


Con list comprehension il codice è più sintetico e, una volta che ci si è abituati, più chiaro:

>>> quad = [n * n for n in range(1, 11)]
>>> print(quad)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]


Semplice vero? L'espressione ha cioè la forma risultato = [operazione in ciclo-for].

OK, torno allo script incriminato, questo:

#:/usr/bin/python3

import sys

f = sys.stdin
st = f.readline().strip()

stsp = ''
for c in st:
    stsp += c + ' '
print(stsp.rstrip())


diventa così:

#:/usr/bin/python3

import sys

f = sys.stdin
st = f.readline().strip()

st = ' '.join(c for c in st)
#print('*'+st+'*')
print(st)


nota: la print() commentata è per controllo, per vedere che non serve la strip().

Eseguendola si ha:

$ echo prova con List Comprehension | py3 lcomp
p r o v a   c o n   L i s t   C o m p r e h e n s i o n
$


🙂

py3 è un alias

$ alias py3
alias py3='python3 -q'
$


Altra nota: come si vede sopra la REPL (l'interprete dei comandi, quello che si ha scrivendo python3 nel terminale (per Windows digitare python)) è comodissima per le cose al volo 🙂

🔴

2 commenti:

  1. A livello di performance la list Comprehension presenta dei vantaggi? Perché altrimenti, a mio parere, è solo un modo meno leggibile di fare la stessa cosa.

    Ci si abitua a tutto :) ma il mio dubbio è che a forza di badare alla forma si perda la sostanza.

    RispondiElimina
  2. Ne riparlerò ancora. Ma, prima di subito, con il tempo le cose cambiano, l'evoluzione (evilussione?).

    RispondiElimina