Superprincipianti in programmazione ?

Sommario


Introduzione

Ricordo quando ho iniziato ad interessarmi alla programmazione in BASIC nei primissimi anni 80 (quando ancora non avevo un computer sotto mano) e leggevo le spiegazioni sui singoli comandi cercando di capire che risultato producessero. Ora come ora mi sembra strano, ma ho fatto davvero molta fatica a capire dei concetti elementari che a quel tempo mi erano completamente estranei, in particolare mi sfuggivano i loop (cicli), ma anche la semplice operazione A=A+1 non era immediatamente intuitiva, perché presupponeva di avere chiaro il concetto di variabile.... ed era "solo" BASIC.

Se fosse stato un altro linguaggio come il Pascal o il C, sarebbe stato un disastro, perché in tutti i linguaggi più evoluti, prima di scrivere delle istruzioni, queste vanno inserite in una struttura ben precisa, che spesso necessita di includere librerie esterne, e sono quindi necessarie molte conoscenze preliminari.

Ora, un giovane (o anche meno giovane) di oggi che si volesse avvicinare da zero alla programmazione, non solo per realizzare un progetto specifico, ma anche e soprattutto per il piacere di sperimentare e comprendere la programmazione stessa, dove dovrebbe sbattere la testa? Rispetto ad una volta la programmazione si è evoluta, dapprima al paradigma ad oggetti, e successivamente, con l'arrivo delle interfacce grafiche, anche all' "event driven" (guidata dagli eventi), dove i programmi sono pilotati dalle interazioni dell'utente sull'interfaccia... Oggi ogni linguaggio per essere funzionale si deve appoggiare ad un' infinità di librerie o moduli esterni, non è più possibile come una volta avere in mente tutti i comandi, e anche per rendere funzionante una singola istruzione questa va quasi sempre "incastonata" in un insieme di righe di codice "preconfezionate" che vanno prese, almeno all'inizio, per buone come un atto di fede.

E chi volesse partire oggi con qualcosa di più semplice? Si procura un vecchio complilatore anni 80 o un vecchissimo BASIC? E'una possibilità, ma forse non troverà nemmeno più libri adeguati, e c'è anche da considerare che le vecchie implementazioni dei linguaggi di 10 o 15 anni fa non sono più adatte a gestire le necessità di connessione e comunicazione dei PC moderni, le interfacce con l'esterno sono cambiate, in favore di USB/Ethernet e protocolli ad alto livello, e le applicazioni attuali sono sempre più web-based.

Esiste dunque qualcosa che possieda entrambe le caratteristiche? La possibilità di essere affrontato all'inizio con la stessa semplicità, interattività e immediatezza del BASIC originale, ma che nel contempo abbia le potenzialità per interfacciarsi, quando più esperti, con ciò che esiste oggi (web, database, ethernet, file multimediali ecc)? La risposta è si, e questo qualcosa è anche gratuito e di libero utilizzo in quanto open source, il suo nome è......... PYTHON!

Python è un linguaggio nato nel 1989 ad opera di Guido Van Rossum. E' un linguaggio ad oggetti open source che dispone di moduli per far fronte a qualsiasi tipo di necessità attuale, dal calcolo scientifico (nasce già predisposto per il calcolo con i numeri complessi) alla comunicazione tramite rete ethernet / internet.

E'nato per essere semplice ed essenziale nella sua sintassi di base, è un linguaggio interpretato che si appoggia a semplici file di testo, e nella sua forma base a riga di comando ricorda molto l'uso del vecchio GWbasic. Ma in realtà è molto di più, ed ha anche l'enorme vantaggio di essere multipiattaforma, per cui un programma Python può funzionare su Windows, Linux, MacOs (e altre piattaforme, basta installare l'interprete adatto a ciascuna macchina).

Come si è detto Python viene incontro a tutte le necessità attuali, pur mantenendo la (o ritornando alla) semplicità di un tempo. Forse anche questo lo ha reso molto popolare, tanto che per alcune operazioni è stato adottato da centri di ricerca fisica e astronomica, dalla NASA, ed e' stato utile anche in alcune fasi della lavorazione di Guerre Stellari. Lo stesso Google ha funzionalità che si basano su script Python, e quindi possiamo essere fiduciosi che il suo utilizzo si diffonderà e consoliderà sempre di più.

Per chi lavora con l'elettronica, python è usabile anche come linguaggio su schede di controllo embedded basate su Linux, ad esempio: piattaforma di controllo GSM e scheda FOX.


E dunque?

Dunque questo linguaggio può essere adatto a chiunque voglia avvicinarsi alla programmazione partendo da zero assoluto, in modo gratuito, e senza doversi far carico inizialmente di tutti quei concetti richiesti da un qualsiasi altro linguaggio e ambiente di sviluppo attuale. Tutto quello che serve è disporre di un computer su cui installare la corretta versione dell'interprete Python, che è liberamente scaricabile dal sito www.python.org/.




Concetti fondamentali

Per chi si affaccia per la prima volta al mondo della programmazione i concetti da comprendere sono molti, le righe che seguono sono una prima introduzione a quelli fondamentali per per partire.

Python è un linguaggio interpretato, su ciascuna piattaforma va installato l'interprete adeguato, che, una volta avviato, si presenta sotto forma di finestra testuale, detta anche console o shell.

Avviamo quindi l'interprete Python: si apre una finestra con un messaggio iniziale, e a caporiga compaiono i simboli >>> Questi simboli sono detti prompt, e indicano che l'interprete è in attesa di un nostro comando scritto sulla tastiera (i comandi vanno sempre confermati con il tasto Invio).

Avere a che fare con un interprete riporta un po' indietro nel tempo, quando i primi personal computer erano programmabili in BASIC, e permette di provare già subito in diretta, e con estrema semplicità, il funzionamento di molti comandi.

Per verificare il funzionamento dell'interprete possiamo scrivere i comandi dell'esempio seguente (in rosso c'è quello che dobbiamo scrivere noi e che va confermato alla fine col tasto Invio):

>>> print 12*30
360
>>> print "W il Python!"
W il Python!
>>>

Il comando print significa stampa, scrivi, e quello che lo segue è ciò che deve essere scritto, che può essere come in questi due esempi un'espressione matematica, oppure (nel secondo caso) una stringa, cioè una sequenza di caratteri (che si indica sempre racchiusa tra virgolette). Quando diamo invio l'interprete esegue il comando e si rimette in attesa. Il comando print scrive sulla console, cioè sullo schermo, per cui battendo invio vediamo subito comparire i risultati.

Per uscire dall'interprete è sufficiente dare il comando quit()




Programmi dati e variabili

Un programma è una sequenza di istruzioni (comandi) che vengono date al computer per fargli svolgere un certo lavoro e ottenere un certo risultato.

Ogni programma utilizza (elabora o manipola) dei dati, che sono tutte le cose, o meglio dire tutti gli oggetti con cui ci interessa lavorare: ad esempio nel caso più semplice dei numeri per effettuare dei calcoli matematici, oppure delle stringhe di caratteri (come gli indirizzi di una rubrica o le righe di un testo).

Per essere utilizzabili i dati vanno memorizzati nella memoria del computer.
Come facciamo a memorizzarli? Dobbiamo forse conoscere come è fatta la memoria e dove andare a scriverli? No, a tutto questo fortunatamente pensa l'interprete, da parte nostra è sufficiente dare un nome ai nostri dati, e riferirci ad essi usando quel nome.

Scriviamo quindi:
>>> a=150
>>>

Apparentemente non accade nulla, in realtà abbiamo detto all'interprete di memorizzare un numero dandogli il nome a. Questo nome è chiamato variabile, l'operazione è chiamata assegnazione di una variabile, e 150 è il valore assegnato alla variabile a.

Per semplicità all'inizio possiamo quindi immaginare le variabili come memorie per contenere i nostri dati, ma questa è solo un'approssimazione molto limitata. In generale in Python è sempre meglio pensare ad una variabile come ad un nome che diamo a qualsiasi oggetto elaborabile dal programma. Quando nel programma scriviamo il nome di una variabile, ci riferiamo implicitamente all'oggetto identificato (puntato / referenziato) dal suo nome, e si dice che quell' oggetto è il valore della variabile.

Possiamo creare tutte le variabili che ci servono per identificare i nostri oggetti di lavoro, ciascuna col suo nome. Il nome può essere composto da numeri lettere e trattini di sottolineatura _ (Nota: gli unici nomi che non si possono usare sono le parole riservate del linguaggio).

Come possiamo a questo punto verificare che il numero 150 sia stato effettivamente memorizzato da qualche parte? Anche questo è molto semplice, chiediamo all'interprete di mostrarci il valore dalla variabile a (cioè l'oggetto identificato dal suo nome che è appunto il nostro 150):

>>> print a
150
>>>


Una grande potenzialità delle variabili è che si possono usare in espressioni matematiche di qualsiasi complessità, e nel calcolo delle espressioni verrà considerato il loro valore. E' perfettamente lecito scrivere i seguenti comandi:

>>> print a+45
195
>>> print a*a
22500
>>> print (a+45)*a
29250
>>>


Inoltre la parola stessa "variabili" indica che il loro valore può anche cambiare. Nell'esempio seguente assegnamo ad a il risultato dell'operazione matematica posta dopo l'uguale, cioè la somma di 800 con il valore attuale di a. Finora il valore di a era rimasto sempre pari a 150 dall'assegnazione iniziale, ma dopo questa operazione il suo valore diventa 950, come si può verificare facendone la stampa:

>>> a=a+800
>>> print a
950
>>>


Si è detto che un altro tipo di dato memorizzabile sono le stringhe di caratteri. L'esempio seguente crea la variabile b, cioè il nome della stringa "questa e' una stringa" (che viene memorizzata da qualche parte), e successivamente fa stampare il suo valore con il comando print:

>>> b="questa e' una stringa"
>>> print b
questa e' una stringa
>>>


Anche sulle stringhe è possibile compiere qualche operazione, la più comune è il concatenamento, cioè l'unione di due o più stringhe una dietro l'altra usando l'operatore di somma +. Nell'esempio seguente con il primo comando diciamo all'interprete di stampare il valore della variabile b e di attaccare in coda alla stampa anche la stringa " un po' piu' lunga" (notare lo spazio bianco lasciato all'inizio per non visualizzare la parola "un" attaccata a "stringa"). Con il secondo comando invece andiamo a modificare direttamente il valore di b, a questo punto la stringa identificata da b contiene anche l'aggiunta, lo possiamo verificare come al solito facendola stampare. Successivamente effettuiamo un ulteriore concatenamento che a questo punto dovrebbe essere chiaro.

>>> print b+" un po' piu' lunga"
questa e' una stringa un po' piu' lunga
>>> b=b+" con una aggiunta."
>>> print b
questa e' una stringa con una aggiunta.
>>> b="Sicuramente "+b
>>> print b
Sicuramente questa e' una stringa con aggiunta.
>>>


Una seconda operazione è la ripetizione di una stringa per un certo numero di volte, ottenuta con l'operatore di moltiplicazione *

>>> c="Ciao!"*3
>>> print c
Ciao!Ciao!Ciao!
>>>


Come ultima cosa, bisogna fare attenzione a non confondersi tra numeri e stringhe:

>>> a=150    assegna il valore numerico 150 ad a
>>> a="150"  assegna la stringa di caratteri "1" "5" e "0" ad a


Nel primo caso la variabile a identifica un dato numerico, e può essere usata per effettuare calcoli matematici, nel secondo caso invece identifica una stringa, e può essere usata per effettuare elaborazioni simboliche (come la ricerca di parole all'interno di un testo ecc).




L'input da tastiera

Finora abbiamo assegnato dei valori alle variabili scrivendo delle assegnazioni esplicite (a=150 ecc). E' anche possibile far si che l'interprete ci chieda di immettere manualmente da tastiera i valori da assegnare alle variabili, e questo è utile in un programma interattivo che pone delle domande all'operatore e si attende delle risposte.

I comandi per fare questo sono input(), per i valori numerici, e raw_input() per le stringhe di caratteri qualsiasi. L'esempio seguente dice all'interprete che deve stampare il messaggio "Immetti un numero " e che deve attendere che noi lo digitiamo sulla tastiera. Quando diamo invio il valore viene assegnato alla variabile d.

>>> d=input("Immetti un numero ")
Immetti un numero 1890
>>>


Lo spazio alla fine della stringa serve per fare in modo che la scrittura del valore non appaia attaccata alla fine della parola "numero". A questo punto possiamo verificare il valore di d, e dobbiamo vedere stampato il valore che abbiamo inserito:

>>> print d
1890
>>>


La stessa cosa se volessimo far chiedere l'inserimento di una stringa (sono sempre evidenziate in rosso le parti che dobbiamo scrivere noi). :

>>> e=raw_input("Immetti una stringa: ")
Immetti una stringa: ecco la stringa
>>> print e
ecco la stringa
>>>




Verso la programmazione

Si può cominciare a comprendere che la programmazione consiste fondamentalmente nello scrivere una certa sequenza di comandi per manipolare i dati (gli oggetti di lavoro) identificati dalle variabili, chiedere eventualmente dei valori all'operatore umano, effettuare operazioni, scrivere risultati ecc. A questo punto abbiamo quasi tutte le conoscenze per poter scrivere dei semplici programmi matematici interattivi, e sta solo alla nostra fantasia applicarli ed estenderli a qualsiasi tipo di calcolo ci venga in mente di fare.

In Python, come in tutti gli altri linguaggi, le quattro operazioni fondamentali somma sottrazione moltiplicazione e divisione si indicano rispettivamente con + - * / L'elevamento a potenza si indica invece con il doppio asterisco ** Altre funzioni matematiche più complesse (come la radice quadrata che si indica con sqrt) si rendono disponibili caricando il modulo (libreria di funzioni Python) di nome math. Basta scrivere all'inizio:

>>> import math
>>>


Le operazioni matematiche sono eseguite con certe priorità, prima moltiplicazioni divisioni elevamenti a potenza, poi somme e sottrazioni. Si possono usare le parentesi per stabilire le proprie priorità di calcolo, e naturalmente il contenuto all'interno delle parentesi verrà calcolato per primo. Il seguente esempio mostra il risultato di un'operazione con e senza le parentesi:

>>> print (10+3)*5
65
>>> print 10+3*5
25
>>>




Il primo vero programma

Anche se può non sembrare, con le conoscenze acquisite finora possiamo finalmente scrivere il primo vero programma, cioè un insieme di comandi Python raggruppati in un file di testo esterno, da richiamare (o se preferite: lanciare, avviare, eseguire) con il comando execfile(). L'interprete leggerà il file una riga dopo l'altra ed eseguirà quello che vi è scritto di fare.

Ecco il programma, che a questo punto non dovrebbe presentare particolari difficoltà di comprensione, a parte alcuni particolari di cui parliamo dopo. Scriviamolo con un editor di testo (come il blocco note) e salviamolo in un file di nome pitagora.py

# Teorema di Pitagora
import math
print "Calcolo ipotenusa triangolo rettangolo"
a=input("Inserisci la misura del primo cateto ")
b=input("Ora il secondo cateto ")
c=math.sqrt( a*a + b*b )
print "L'ipotenusa misura",c


Per avviarlo basta dire all'interprete: >>> execfile("pitagora.py") (in alcuni casi potrebbe servire specificare il nome completo del percorso del file, ad esempio "c:\prove\pitagora.py")

A questo punto il nostro programma si avvia e questo è ciò che appare a video (nell'ipotesi di rispondere 100 alla prima richiesta e 200 alla seconda):

Calcolo ipotenusa triangolo rettangolo
Inserisci la misura del primo cateto 100
Ora il secondo cateto 200
L'ipotenusa misura 223.60679775
>>>


Nel suo piccolo questo programma presenta tutte le fasi tipiche dell'elaborazione: l'acquisizione di dati, l'elaborazione, e la presentazione dei risultati, in più è interattivo, nel senso che per compiere il suo lavoro chiede informazioni all'esterno attraverso la console (schermo e tastiera). Dal momento in cui l'esecuzione ha inizio, l'interprete non mostra più il prompt, e sarà il nostro programma a dirigere gli eventi. Solo al termine del programma l'interprete si rifà vivo con >>> in attesa di nuovi comandi.


Le cose da spiegare

La prima riga "# Teorema di Pitagora" è un semplice commento per chi legge il programma e viene ignorata dall'interprete, infatti l'interprete Python considera il carattere # come l'inizio di un commento e ignora ciò che si trova dopo. Nei programmi, soprattutto quando cominciano a diventare grandi, è buona norma inserire sempre dei commenti che ricordino le funzioni svolte dalle diverse sezioni. (Nota: l'unico caso in cui il carattere # non è considerato l'inizio di un commento è quando fa parte dei caratteri di una stringa).

La seconda riga "import math" carica il modulo matematico math di Python, cioè rende utilizzabili le funzioni matematiche in esso contenute. Nel pacchetto di installazione di base sono compresi moltissimi moduli contenenti funzioni aggiuntive a quelle di base. Le funzioni di base, cioè quelle usabili senza caricare moduli aggiuntivi, sono dette built-in. Per una visione più organica e completa si può sempre consultare la libreria di riferimento di Python.
Ma prima di tutto è meglio studiarsi questi due ottimi tutorial:
Corso pensare da informatico (versione .PDF)
Tutorial in italiano

Nella penultima riga troviamo il comando math.sqrt() questo è il modo in cui si richiamano le funzioni dei moduli esterni, cioè nome del modulo.funzione (è detta notazione punto).

Nell'ultima riga si può notare una virgola tra le cose da stampare. Questa dice all'interprete che dopo la stringa "L'ipotenusa misura" c'è ancora qualcosa da stampare sulla stessa riga. Gli elementi da stampare separati da una virgola risulteranno sempre searati da uno spazio:

>>> print "stringa1",1280,"stringa2",44
stringa1 1280 stringa2 44
>>>