Software in pratica

 ☗   ▶ 

Programmi variabili dati espressioni
Prendere decisioni
Ripetizioni
Funzioni
Operazioni con le stringhe
Liste e tabelle
Uno sguardo agli oggetti
La gestione degli errori


INTRODUZIONE

Se state leggendo questo testo probabilmente avete sentito parlare di programmazione, state cercando di capire cosa significhi in pratica, e vi state domandando se riuscirete mai a far "vivere" qualcosa di vostro usando questo fantastico prodotto tecnologico dalle possibilità pressoché infinite che è il computer.

Questo testo, rivolto ai principianti assoluti come ero io all'inizio degli anni 80, vuole presentare brevemente i "ferri del mestiere" della programmazione usando il linguaggio Python, e prende spunto dal lavoro di Roberto Antoniotti, che in quegli anni ha saputo trasmettere con estrema sintesi e chiarezza gli stessi concetti (con il linguaggio BASIC installato sugli home computer di allora) dando "il la" a molti appassionati e futuri programmatori.

Affinché quella memoria non vada persa, e come tributo per il suo lavoro, mi permetto quindi di usare quà e là quegli esempi e frasi che tanto mi hanno fatto riflettere, quando ancora faticavo a comprendere il funzionamento di un semplice loop. Pur con gli inevitabili e profondi adattamenti ed integrazioni (in BASIC non c'erano lo stesso tipo di funzioni o gestione degli errori, gli oggetti ecc), ho tentato di mantenere la stessa filosofia: pochi concetti sintetici ma soprattutto pratici.

Questo infatti non è un testo che parla astrattamente di algoritmi, e neppure un corso completo di Python, anzi, gli esempi stessi potrebbero essere riscritti in modo migliore o, come si dice, più pythonico. Qui invece ci sono, in ordine progressivo di complessità e potenzialità, gli elementi di base comuni a praticamente tutti i linguaggi, per iniziare a sperimentare (ed eventualmente approfondire) questa branca della tecnica, che non è solo tecnica, ma anche logica, capacità di schematizzare i problemi, trovare possibli soluzioni partendo da un insieme di vincoli, e in tutto questo è indubbiamente richiesta anche fantasia e creatività.

Se utilizzate Windows, per le prime prove è consigliabile usare l'ambiente di sviluppo IDLE di Python, che comprende una finestra (editor) con cui scrivere modificare e salvare il programma, e una seconda finestra (console o shell) dove avviene l'esecuzione vera e propria e appaiono i risultati. Se usate Linux (dove IDLE andrebbe installato separatamente), è altrettanto comodo eseguire i programmi in una finestra terminale, e scriverli con un editor di testo come gedit (disponibile comunque anche per Windows) che, alla pari di IDLE, ha l'evidenziazione colorata della sintassi e l'autoincolonnamento. È bene inoltre non mescolare mai spazi e tabulazioni, per cui è consigliabile settare subito il proprio editor per inserire quattro spazi quando si preme il tasto tabulazione (Tab).

Una caratteristica della console è quella di accettare comandi in modo diretto proprio come il vecchio BASIC, che vengono cioè eseguiti immediatamente appena confermati con invio, in questo modo si possono fare delle prove con singole istruzioni per vederne subito il risultato. Ricordando che le istruzioni in Python vanno sempre scritte in minuscolo, provate quindi a scrivere nella console:

print(2+2)

dando invio deve apparire la risposta 4, a conferma che l'interprete Python sta funzionando ed è in grado di eseguire qualsiasi comando in questo linguaggio.

Se invece questa istruzione la salvate in un file di testo su disco (dandogli estensione .py) la potete eseguire quante volte volete. Con IDLE è sufficiente premere F5 nella finestra editor, corrispondente alla scelta del menu Run ---> Run Module. Da una finestra console/terminale di Windows o Linux potete invece lanciare il programma scrivendo:

python nomedelfile.py

IMPORTANTE: In questo testo si usa la versione 3 del linguaggio. La sintassi delle istruzioni print e input (descritte in seguito) è leggermente diversa rispetto alla versione 2. Chi volesse usare Python2 al posto di Python3 deve scrivere all'inizio dei programmi le due righe seguenti, che rendono il funzionamento di print e input identico alla versione 3:

from __future__ import print_function
input = raw_input

PROGRAMMI

Il concetto di programma intuitivamente lo conoscete già, pensate alle frasi:

In tutti i casi si tratta di una sequenza ben precisa e ordinata di cose da fare. In informatica è la stessa cosa, un programma non è nient'altro che una sequenza precisa e ordinata di istruzioni comprensibili dal computer, che vengono eseguite una dopo l'altra per ottenere un certo risultato.

Con le istruzioni potete fondamentalmente:

ESECUZIONE DEL PRIMO PROGRAMMA

Tradizione vuole che il primo programma in un nuovo linguaggio scriva semplicemente sul video le parole "Hello World!", e questo faremo. Scrivete la seguente riga con un editor di testo (rispettando maiuscole e minuscole e iniziando sulla prima colonna senza lasciare spazi prima di print) e salvate il file chiamandolo hello.py in una directory che userete per le prove.

print("Hello World!")

Aprite una finestra terminale su Linux, o prompt DOS su Windows, spostatevi nella directory in cui avete salvato il file, e avviate il programma scrivendo:

python hello.py

Se appare la scritta Hello World! il programma è stato eseguito correttamente, in particolare avete appena usato la funzione print del linguaggio Python, che permette di stampare a video quanto specificato tra le sue parentesi (in questo caso una stringa di caratteri), useremo la funzione print in quasi tutti gli esempi.


VARIABILI DATI E ASSEGNAMENTI

Alla base della programmazione ci sono le variabili, che sono dei nomi scelti a piacere per riferirvi ai vostri dati. In Python le variabili si definiscono con un semplice assegnamento nome=dato, ad esempio la seguente riga assegna il numero 4400 ad una variabile di nome 'a':

a = 4400

Con questo assegnamento dite al computer che 'a' è un nome che si riferisce al numero 4400. Questo nome può essere usato in qualsiasi espressione al posto del numero stesso.

b = a + 100

Con questa riga dite invece al computer di calcolare l'espressione a+100, nell' espressione Python sostituisce automaticamente il nome della variabile 'a' con il dato a cui essa si riferisce, ed infine assegna il risultato (il numero 4500) alla variabile di nome 'b'. Con le variabili potete quindi scrivere espressioni matematiche come si fa in algebra.

Come potete notare, a destra dell' uguale si scrivono sempre i dati o le espressioni da valutare, mentre a sinistra si scrivono i nomi con cui ci si vuole riferire ai dati o ai risultati delle espressioni.

I tipi di dati elementari con cui potete lavorare, comuni a praticamente tutti i linguaggi, sono:

I NUMERI

I numeri interi possono avere qualsiasi lunghezza, e possono essere scritti in diversi modi:
0
100
-20          # negativo
0xFFFF       # esadecimale
0b1001       # binario

I numeri floating point hanno hanno una precisione di 16 cifre e vanno scritti indicando sempre la virgola (anche se senza cifre decimali):

0.0
3.141
6.67E-11     # notazione scientifica esponenziale
-0.015E20
0.           # il punto indica un float
42.
.127

LE STRINGHE

Se volete assegnare ad una variabile una stringa, bisogna sempre ricordarsi di racchiudere i caratteri della stringa tra virgolette o tra apici in uno di questi modi:

a = "STRINGA"
b = 'STRINGA'

Una stringa può avere qualsiasi lunghezza, può contenere anche un solo carattere, oppure nessuno, in questo ultimo caso si chiama stringa vuota o stringa nulla:

a = "z"      # un solo carattere
b = ""       # stringa vuota
c = ''       # stringa vuota

In questo testo per chiarezza i numeri e le stringhe sono evidenziati con colori diversi, in modo che sia immediatamente visibile quale sia il tipo di dato. Non bisogna infatti mai confondere un valore numerico con una stringa di caratteri numerici:

a = "1250"   # una stringa di caratteri
b = 1250     # un valore numerico

I NOMI DELLE VARIABILI

Ricordatevi che Python distingue tra lettere maiuscole e minuscole (è case sensitive). Tutte le istruzioni si scrivono in minuscolo, mentre per i nomi definiti da voi potete scegliere, facendo attenzione che 'casa' e 'Casa' sono due nomi diversi in quanto la 'c' minuscola è diversa dalla 'C' maiuscola. In particolare viene consigliato di seguire questo schema:
nomi_di_variabili   minuscolo e trattino underscore
nomi_di_funzioni    minuscolo e trattino underscore
NomiDiClassi        camel case (iniziali maiuscole)
NOMI_DI_COSTANTI    maiuscolo e trattino underscore

Si consiglia inoltre di scegliere nomi più chiari possibili riguardo a ciò a cui si riferiscono, né troppo corti da risultare sigle incomprensibili, né troppo lunghi da appesantire la lettura del programma, ancora meglio se scritti in inglese per rendere il programma facilmente leggibile anche al resto del mondo (in questo testo comunque usiamo nomi italiani per facilitare la comprensione e non confondere i propri nomi con le parole riservate e le funzioni predefinite di Python).

I nomi delle variabili possono essere composti solo da lettere (maiuscole o minuscole), cifre (da 0 a 9) e trattini di sottolineatura _ (underscore) ma non devono mai iniziare con una cifra. Inoltre non si possono usare i nomi già riservati per il linguaggio indicati nella seguente tabella:

False     class       finally    is          return
None      continue    for        lambda      try
True      def         from       nonlocal    while
and       del         global     not         with
as        elif        if         or          yield
assert    else        import     pass
break     except      in         raise

È anche consigliabile usare nel programma esclusivamente caratteri appartenenti al set di caratteri ASCII, quindi niente lettere accentate o altri simboli che non appartengono al set ASCII di base. È possibile scrivere stringhe formate da qualsiasi carattere, ma richiede alcune accortezze che non rientrano nello scopo di questo testo. I caratteri di base sempre utilizzabili, che comprendono le cifre numeriche, le lettere maiuscole e minuscole, e diversi simboli di punteggiatura, parentesi e simboli matematici, sono i seguenti:

0 1 2 3 4 5 6 7 8 9
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
a b c d e f g h i j k l m n o p q r s t u v w x y z 
! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ 

INPUT

Un altro modo per assegnare un valore ad una variabile è la funzione input. Il programma incontrando una input si ferma, e aspetta che voi inseriate da tastiera il valore da assegnare alla variabile specificata (il valore va confermato con il tasto invio).

La funzione input produce sempre una stringa di caratteri, se volete trasformarli in numero intero o float la input va ulteriormente racchiusa nelle parentesi delle funzioni int e float, che hanno appunto il compito di effettuare queste conversioni.

Se volete ottenere una stringa:        a = input()
Se volete ottenere un numero intero:   a = int(input())
Se volete ottenere un numero float:    a = float(input())

Sul concetto di funzione torneremo più avanti, ma, come potete dedurre già ora, le funzioni servono per effettuare una qualche operazione su quello che viene specificato all'interno delle loro parentesi, "restituendo" un qualche risultato o svolgendo qualche compito. La funzione input() produce una stringa, e se è posta tra le parentesi di della funzione int, questa stringa viene convertita in numero intero, che viene a sua volta restituito dalla funzione int per essere in questo caso assegnato alla variabile 'a'.

Se, volendo acquisire un numero intero o float, provate ad immettere caratteri non validi (ad esempio lettere al posto di cifre), o anche solo a dare invio senza aver scritto nulla, otterrete un errore di esecuzione con l'arresto immediato del programma, perché le funzioni int o float non riconoscono una sequenza di cifre valida.

Si può far fronte a questa eventualità, lo vedremo quando parleremo di gestione degli errori, per adesso ricordatevi di inserire sempre correttamente i numeri.


PRINT

Ora vi starete domandando cosa ve ne fate di sfilze di numeri o stringhe assegnati alle variabili. Intanto li potete vedere a video con la funzione print, che in italiano significa appunto stampa. Quindi per vedere apparire sulla console il dato assegnato ad una variabile dovete scrivere:

print(a)

Naturalmente si possono rappresentare sullo schermo anche caratteri alfanumerici, parole, frasi, e tutto il set di caratteri particolari disponibili, volendo stamparli ricordatevi sempre di racchiuderli tra virgolette:

print("HELLO WORLD!")


OPERATORI MATEMATICI

Con le variabili numeriche potete compiere tutte le operazioni aritmetiche fondamentali, le quattro operazioni e l'elevamento a potenza. Gli operatori matematici di base sono i seguenti:

+	     somma
-	     sottrazione
*	     moltiplicazione
/	     divisione
//	     divisione intera
%	     modulo (resto della divisione)
**	     elevamento a potenza

Se vi sembra strana la mancanza della radice quadrata, sappiate che in realtà esiste una funzione apposita per estrarre la radice (la vedremo più avanti), ma si può calcolare lo stesso ricordando che la radice ennesima di un numero è pari allo stesso numero elevato al reciproco di n, quindi per ottenere la radice quadrata di un numero è sufficiente elevarlo alla 0.5

Vediamo quindi subito una dimostrazione delle abilità matematiche del vostro computer sfruttando la formula del teorema di Pitagora, che permette di conoscere la misura dell'ipotenusa di un triangolo rettangolo conoscendo quella dei due cateti. Questo programma completo può servirvi come spunto per realizzare qualsiasi altro tipo di calcolo.

#------ PROGRAMMA PITAGORA

print("TEOREMA DI PITAGORA")
a = float(input("INSERISCI LA MISURA DEL PRIMO CATETO: "))
b = float(input("ORA L'ALTRO CATETO: "))
c = (a * a  +  b * b)**0.5
print("L'IPOTENUSA MISURA:", c)
Risultato:
TEOREMA DI PITAGORA
INSERISCI LA MISURA DEL PRIMO CATETO: 12.5
ORA L'ALTRO CATETO: 4.3
L'IPOTENUSA MISURA: 13.21892582625381

Il simbolo # identifica l'inizio di un commento all'interno del programma, che viene ignorato durante l'esecuzione, ma è molto utile per ricordare a cosa serve una certa istruzione, cosa fa una certa riga o un intero blocco di istruzioni.

La funzione input ha una stringa specificata tra le parentesi, questa indica il messaggio di richiesta (prompt) che deve comparire a video durante la input stessa, se non vi fosse questa possibilità dovreste scrivere due istruzioni separate, una print per visualizzare la richiesta, seguita da una input.

La print finale contiene due elementi, una stringa e una variabile, separati da una virgola. La virgola indica che sulla stessa riga verrà scritto qualcos'altro di seguito (separato da uno spazio).

Ecco un esempio magari banale, ma adatto a spiegare e ampliare quanto detto, è importante cercare di capire come si comporta il programma in ogni situazione, per abituare la vostra mente a formulare le idee con la stessa logica.

print("NORMALMENTE")
print("VADO A CAPO.")
print("CON LA", "VIRGOLA", "VADO DI SEGUITO.")
print()                        # lascia una riga vuota
print("CON END ", end="")
print("VADO DI SEGUITO ", end="")
print("CON ALTRE PRINT.")
Risultato:
NORMALMENTE
VADO A CAPO.
CON LA VIRGOLA VADO DI SEGUITO.

CON END VADO DI SEGUITO CON ALTRE PRINT.

Pitagora è un programma rigorosamente sequenziale, in quanto formato da un unico blocco di istruzioni che vengono eseguite in ordine dalla prima all'ultima. Il seguente diagramma di flusso (flowchart) è un sistema per rappresentare graficamente le operazioni svolte da un programma, i parallelogrammi indicano operazioni di ingresso/uscita, i rettangoli le elaborazioni, e le frecce indicano l'ordine di esecuzione (flusso) delle istruzioni.



Nella scrittura di un'espressione matematica bisogna ricordare che le operazioni vengono effettuate con una ben precisa priorità: prima sono calcolati gli elevamenti a potenza, poi moltiplicazioni e divisioni, ed infine somme e sottrazioni. Potete usare le parentesi per creare espressioni arbitrariamente complesse e modificare l'ordine delle priorità, le operazioni all'interno delle parentesi vengono infatti eseguite per prime. In caso di più operazioni alla stessa priorità, queste vengono calcolate sequenzialmente da sinistra verso destra:

print( 5 * 6 + 10 )          # 40
print( 5 * (6 + 10) )        # 80
print( 4 * 3 + 8 / 2 )       # 16.0
print( 4 * (3 + 8) / 2 )     # 22.0
print( 3.0 / 12.0 * 9.0 )    # 2.25
print( 3.0 / (12.0 * 9.0) )  # 0.027777777777777776

Nota: in Python 2.x la divisione produce un risultato intero se tutti gli operandi sono di tipo intero, float se almeno un operando è di tipo float, in Python 3.x invece produce sempre un risultato float.

 ☗   ▶