Python

I/O di base               

Eccoci quindi al momento di metterci all'opera. Vediamo di capire come funziona Python e cosa può fare per noi. Per la semplice installazione rimando al sito ufficiale ed alla documentazione ivi reperibile, tenete presente che il download da effettuare è quello relativo alla versione 3.x, come detto nella premessa è questo il nostro target. 

print("ciao")

Come primo programma mi pare abbastanza semplice. Potete dare questa riga in pasto alla console interattiva (che userò molto nel prosieguo) o salvarla in un file con estensione .py e mandarla in esecuzione con la semplice istruzione:

python nomefile.py

Python è un linguaggio interpretato, come noto, per cui ciò che avviene è comune per questo tipo di linguaggi e concettualmente molto semplice: l'interprete traduce le istruzioni in un linguaggio adatto per la macchina virtuale sottostante la quale si incarica di mandare in esecuzione il codice diciamo intermedio ricevuto dall'interprete. Da un punto di vista pratico quindi l'interprete prende il codice sorgente e se corretto genera il codice intermedio, detto byte code, memorizzandolo in un file con estensione .pyc (Python compilato), che, a partite dalla versione 3.2 del linguaggio si trova in una sottodirectory della locazione del file originale e che si chiama __pychache__ . Questo sistema, detto in breve, semplifica la gestione delle modifiche e delle versioni.
Una volta fatto ciò il bytecode viene mandato in esecuzione dalla PVM (Python Virtual Machine). Non c'è quindi traduzione diretta da codice sorgente a codice nativo per la piattaforma sottostante. E' la PVM, che viene lanciata automaticamente, voi non dovete far nulla, che si occupa di interfacciarsi con la macchina. Si tratta di un meccanismo ben noto per tuti i linguaggi di scripting. Come avrete capito questa sequenza è il motivo principale che rallenta i programmi Python rispetto ai linguaggi compilati. La semplicità d'uso a volte si paga ma d'altronde la fase di esecuzione viene raggiunta molto più rapidamente rispetto a quando si adoperano cicli completi di compilazione... se i programmi sono senza dubbio più lenti lo sviluppo nel suo complesso potrebbe non esserlo.
D'altronde tutti i testi su Python facilmente illustrano le alternative, già accennate nel paragrafo introduttivo, per mitigare gli aspetti prestazionali. Altri nomi noti in questo senso sono Shed o Skin. E potete informarvi facilmente sui cosiddetti frozen binaries. Un'occhiata interessata io la darei, anche per altri motivi, al progetto Parrott che propone una virtual machine alternativa per vari linguaggi tra cui, appunto, Python. Infine anche Google, che apprezza molto questo linguaggio, sta lavorando su qualcosa di utile. Qui però ci occupiamo di sintassi e semantica, tralasciando, per ora, le questioni prestazionali.

Detto questo torniamo al brevissimo esempio presentato ad inizio paragrafo. La parola al'interno di doppia apici è una stringa ovvero una sequenza alfanumeric di caratteri. Delle stringhe parleremo molto diffusamente per ora basti questa semplice (ed incompleta) definizione. print è una funzione built-in (non una istruzione, com'era in Python 2.x dove l'argomento non era messo tra parentesi), cioè facente parte del linguaggio in maniera nativa, che espone in output una stringa (o un oggetto, più in generale), eventualmente, come vedremo, può prevedere anche un separatore, ridirigere  l'output ecc... La sua definizione è la seguente:

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)¶

print è il nome della funzione
*objects rappresenta in pratica l'argomento che sarà stampato ed è obbligatorio
sep è il separatore che di default è uno spazio
end indica il carattere che termina la stringa, il default è un newline (a capo) se volete non andare giù di una riga dovete mettere: end = ""
file indica il file su cui stampa che di default è lo standard output
flush è stato aggiunto mi pare dalla versione 3.2 in avanti e, se posto a true, forza lo svuotamento del buffer di scrittura. Lo useremo poco, credo.

Vediamo un esempio:

>>> print("a","b")
a b
>>> print("a","b",sep="")
ab

Capite la differenza? Nel primo caso print stampa due stringhe ("a" e "b") e il separatore di default le tiene a distanza l'una dall'altra. Nel secondo caso il separatore è posto uguale ad una stringa vuota ("") e quindi le due stringhe risultano unite, a contatto. Provate cosa succede mettendo un altro separatore a vostra scelta. Ricordate, piccolo consiglio di stile, che un separatore è un separatore, non un posto di comodo dove mettere una stringa... per cui, se ben potete legittimamente scrivere

>>> print("Hello","you", sep=" to ")
Hello to you

 imho, è una mezza porcheria.

Fin qui abbiamo visto le basi per la scrittura a video. E' il momento di pensare a qualche nozione di base per gestire l'input. La funzione anche in questo caso built-in che viene comunemente adoperata in Python 3.x e proprio input(), che legge l'input da tastiera, scartando il carattere di newline (in pratica quando diamo l'invio), e riversando il tutto internamente in una stringa.

  Esempio 1.1
1
2
3
print("inserisci il tuo nome: ", end="")
nome = input()
print("ciao, ", nome)

Questo è del tutto simile a quanto si vede in altri linguaggi (guardate ad esempio il corrispondente esempio che ho pubblicato nella sezione dedicata a Falcon) e non dovrebbe dare eccessivi problemi di comprensione. Come detto input memorizza l'input in una stringa che potrà poi essere elaborata per i successivi scopi che vorremo. Di per se stesso input è una funzione molto semplice (la corrispondente in Python 2.x era raw_input a significare la "crudezza" dell'istruzione) mentre esiste la possibilità di fare delle elaborazioni preliminari tramite la funzione eval. Ma la vedremo più avanti.