Problemi in questa pagina? Segnalali in questa discussione
Introduzione
In questa pagina vengono mostrati alcuni programmi scritti in Python a difficoltà crescente. Non è una guida esauriente a tutte le funzionalità del linguaggio. Se si desidera approfondire le proprie conoscenze, consultare la sezione Risorse.
Alcune note:
- tutto ciò che viene scritto preceduto dal carattere # è considerato dall'interprete come un commento.
questi listati sono scritti per l'interprete Python 2.7.xx per la guida nella più recente versione Python 3.x, vedi ListatiPython3
Listato 1
1 #!/usr/bin/python
2 import sys
3 import string
4 import math
5 ''' questa è un'area di commento che uso per indicare cosa fa il programma o sorgente o script.
6 Il programma principale o il main, calcola l'area di un triangolo qualsiasi noti i suoi tre
7 lati usando la formula di Erone.
8 Formula sqrt p*(p-a)*(p-b)*(p-c) sqrt = radice quadrata, p = (a+b+c)/2 a,b,c lati
9 Salvatelo sul disco con il nome che vi propongo AreaTriangolo.py o come più vi piace
10 '''
11 a = input('inserisci il primo lato ')
12 print ' primo lato = ',a
13 b = input('inserisci il secondo lato ')
14 print ' secondo lato = ',b
15 c = input('inserisci il terzo lato ')
16 print ' terzo lato = ',c
17 print
18 print " ora calcolo l'area di questo triangolo"
19 print
20 p = (a+b+c)/2
21 s = math.sqrt(p*(p-a)*(p-b)*(p-c))
22
23 print " l'area del triangolo e' =" ,s
Listato del programma AreaTriangolo.py
Listato 2
Il programma precedente termina se durante l'inserimento dei dati, per errore, viene digitato un carattere non numerico. È necessario quindi inserire un controllo sul dato immesso. A questo scopo è stato preparato questo altro programmino che salviamo col nome AreaTriangolo2.py:
1 #!/usr/bin/python
2 import sys
3 import math
4 import string
5 i = 0
6 l=[]
7 while True:
8 a= raw_input('inserisci il '+str(i+1)+' lato ')
9 for j in range(len(a)) :
10 errato = 'F'
11 if a[j] in string.digits:
12 errato = 'F'
13 continue #continua il ciclo for
14 else:
15 errato = 'T'
16 print "hai digitato qualcosa che non è un numero.Riprova"
17 break # termina il ciclo for
18 if errato =='T':
19 continue #continua il ciclo while
20
21 i +=1
22 l.append(float(a)) # completata la verifica che il dato inserito sia una cifra, viene trasformato
23 # in un numero a virgola mobile e inserito in un array
24 if errato =='F'and i <3:
25 # questo controllo ci serve per riprendere l'inserimento dei dati dopo aver completato il controllo
26 # sul dato precedente
27 continue # continua il ciclo while per passare al successivo input
28 elif errato =='F' and i >=3:
29
30 print ' primo lato = ',l[0]
31 print
32 print ' secondo lato = ',l[1]
33 print
34 print ' terzo lato = ',l[2]
35 print
36 p = (l[0]+l[1]+l[2])/2.0 # calcola il semi perimetro
37 if p > l[0] and p>l[1] and p >l[2]:
38 print " ora calcolo l'area di questo triangolo"
39 break # esce dal ciclo while per fine input
40 else:
41 print "questi dati non possono rappresentare i lati di un triangolo. Riprova "
42 i =0
43 l=[]
44 continue # continua nel ciclo while per ricominciare i nuovi input
45
46
47
48
49
50 print
51
52 s = math.sqrt(p*(p-l[0])*(p-l[1])*(p-l[2]))
53
54 print " l'area del triangolo e' =" ,s
55 print
56 print "Fine programma "
Listato del programma AreaTriangolo2.py
Listato 2 con eccezioni
Mostriamo anche un'alternativa che utilizza le classi e la gestione delle eccezioni modificando il programma precedente AreaTriangolo2.py:
1 #!/usr/bin/python
2
3 # Importiamo la funzione sqrt (radice quadrata) dal modulo math
4 from math import sqrt
5
6 # Definiamo una classe Triangolo con tre metodi:
7 # un costruttore, un metodo che calcola il perimetro e uno che calcola l'area del triangolo.
8 class Triangolo:
9
10 # Attributi della classe (le misure dei tre lati)
11 a, b, c = 0, 0, 0
12
13 # Metodo costruttore
14 def __init__(self,a,b,c):
15 # Controlliamo se i tre valori dati possono effettivamente essere le misure dei lati di un triangolo.
16 # Caso contrario solleviamo una bella eccezione!
17 if ((a+b>c) and (a+c>b) and (b+c>a)):
18 self.a=a
19 self.b=b
20 self.c=c
21 else:
22 # stabiliamo che l'errore e' di tipo ValueError, cioe' il tipo di dato e' corretto(numeri in
23 # virgola mobile) ma i valori sono sballati.ValueError è un errore definito da Python, ma
24 # volendo potremmo crearci un errore personalizzato, ad esempio TriangoloInesistente
25 raise ValueError, "\nUn triangolo con queste misure non esiste. Riprova."
26
27 # Metodo che calcola il perimetro
28 def perimetro(self):
29 return self.a + self.b + self.c
30
31 # Metodo che calcola l'area (tramite formula di Erone)
32 def area(self):
33 p=self.perimetro()/2.0
34 return sqrt(p*(p-self.a)*(p-self.b)*(p-self.c))
35
36
37 while True:
38 # Chiediamo all'utente di immettere le misure dei lati
39 print "\nInserire le misure dei lati:"
40 lati=[]
41 for lato in ['a','b','c']:
42 while True:
43 l=raw_input("\tMisura del lato "+lato+": ")
44 try :
45 l = float(l)
46 # se l'utente inserisce un valore che non puo' essere trasformato in un numero,
47 # ad esempio una lettera, python sollevera' l'eccezione ValueError, e noi
48 # prontamente la gestiamo
49 except ValueError:
50 print "\nDevi inserire valori numerici. Riprova.\n"
51 #se invece non e' stata sollevata nessuna eccezione, possiamo salvare il
52 #valore del lato
53 else:
54 lati.append(l)
55 break
56
57 try :
58 # Creiamo una nuova istanza della classe Triangolo.
59 # In pratica facciamo una chiamata al suo metodo costruttore.
60 # Sarebbe stato lo stesso scrivere "triangolo=Triangolo.__init__(a,b,c)"
61 triangolo=Triangolo(lati[0],lati[1], lati[2])
62 #qua gestiamo l'eccezione che noi stessi potremmo aver sollevato nella classe Triangolo
63 except ValueError, e:
64 #"e" e' l'oggetto creato da python durante il verificarsi dell'errore
65 print e.message
66 continue
67 # Utilizziamo i metodi definiti in precedenza per ottenere perimetro ed area dell'oggetto triangolo,
68 # e stampiamo a video i risultati.
69 print ""
70 print "Perimetro = ", triangolo.perimetro()
71 print "Area = ", triangolo.area()
72
73 # Chiediamo all'utente se intende terminare il programma.
74 exit=raw_input("\nUscire [digitare 's' per confermare]? ")
75 print ""
76 if exit=="s": break
Listato del programma AreaTriangolo2.py con eccezioni
Listato 3
Ora supponiamo di dover calcolare l'area di un appezzamento di terreno di svariati ettari scomposto in un numero finito di triangoli.
Una volta nota l'area, supponiamo che debba essere divisa, per volontà testamentaria, in tre parti in funzione dell'età di tre fratelli i cui nomi sono Angelo, Alberto, Amilcare o come volete voi.
Useremo lo stesso programma AreaTriangolo2.py, con qualche modifica o aggiunta, che chiameremo AreaTriangolo3.py:
1 #!/usr/bin/python
2 import sys
3 import math
4 import string
5 # fase di input
6 nomi = []
7 eta= []
8 lati= []
9 x= 1
10 while x <=3:
11 a= raw_input('Inserici nome '+str(x)+' fratello ')
12 #verifichiamo l'input immesso
13 errore = 'F'
14 for i in range(len(a)):
15 if a[i] in string.letters:
16 continue # continua il ciclo for
17 else:
18 if i <= len(a):
19 print "errore nell'immettere il nome .riprova"
20 errore = 'T'
21 break # esce dal ciclo for
22 if errore == "T":
23 continue # continua il ciclo while costringendo a reinserire il dato immesso prima in maniera errata
24 else:
25 # lo rendiamo tutto maiuscolo indipendentemente se lo sia o meno
26 nomi.append(string.upper(a))
27 print nomi
28 x +=1 # questo incremento ci serve per poter distinguere nella immissione a quale persona assegnare il nome
29
30 #ora prendiamo in input le loro eta
31 x = 0
32
33 while x < range(len(nomi)):
34
35 a= raw_input("inserisci l'eta di "+nomi[x]+' ')
36 for j in range(len(a)) :
37 errato = 'F'
38 if a[j] in string.digits:
39 errato = 'F'
40 continue #continua il ciclo for
41 else:
42 errato = 'T'
43 print "hai digitato qualcosa che non è un numero.Riprova"
44 break # termina il ciclo for
45 if errato =='T':
46 continue #continua il ciclo while
47
48 x +=1
49 eta.append(int(a))
50 if errato =='F'and x <3:
51
52 continue # continua il ciclo while per passare al successivo input
53 elif errato =='F' and x >=3:
54 print ' Eta di' +nomi[0] +" "+ str( int(eta[0]))
55 print
56 print ' Eta di' +nomi[1] +" "+ str( int(eta[1]))
57 print
58 print ' Eta di' +nomi[2] +" "+ str( int(eta[2]))
59 print
60 break
61 #input dei dati per il calcolo dell'area dell'appezzamento
62
63 i = 0
64 l=[]
65 tria = []
66 while True:
67 a= raw_input('inserisci il '+str(i+1)+' lato ')
68 for j in range(len(a)) :
69 errato = 'F'
70 if a[j] in string.digits:
71 errato = 'F'
72 continue #continua il ciclo for
73 else:
74 errato = 'T'
75 print "hai digitato qualcosa che non è un numero.Riprova"
76 break # termina il ciclo for
77 if errato =='T':
78 continue #continua il ciclo while
79
80 i +=1
81 l.append(float(a))
82 if errato =='F'and i <3:
83 # questo controllo verifica se abbiamo terminato i dati in input relativi ad un triangolo
84 continue # continua il ciclo while per passare al successivo input
85 elif errato =='F' and i >=3:
86 # qui avendo termianto l'input dei dati relativi ad un trinagolo li ripresenta a video per maggior chiarezza
87 print ' primo lato = ',l[0]
88 print
89 print ' secondo lato = ',l[1]
90 print
91 print ' terzo lato = ',l[2]
92 print
93 p = (l[0]+l[1]+l[2])/2.0
94 if p > l[0] and p>l[1] and p >l[2]:
95 print " l'area di questo triangolo e' calcolabile"
96 tria.append(l)
97 l=[]
98 si = raw_input(" hai finito di immettere i lati dei triangoli ? conferma con S/s ")
99 if si == "S" or si =='s':
100 print "Inizia la fase di calcolo "
101 break # esce dal ciclo while per fine input
102 else:
103 i =0
104 l=[]
105 continue # continua nel ciclo while per input dati nuovo triangolo
106 else:
107 print "questi dati non rappresentano i lati di un triangolo. Riprova "
108 i =0
109 l=[]
110 continue # continua nel ciclo while perche i dati in input del triangolo erano errati
111
112
113 #fase di calcolo area appezzamento
114 n = len(tria) # il calcolo dell'area verrà ripetuto n volte una per ogni triangolo
115
116 p = 0
117 stot = 0
118 for i,l in enumerate(tria):
119 for j in range( len(l)):
120 print l[j]
121 p = p+l[j]
122 print "semiper. nel "+str(i+1)+ " triangolo = "+ str(p/2.0)
123 print
124 p=p/2.0
125 s = math.sqrt(p*(p-l[0])*(p-l[1])*(p-l[2]))
126 print "area "+str(i+1)+ " triangolo = "+ str(s)
127 print
128 stot = stot +s
129 p=0
130 print
131 print "l'area totale dell'appezamento di terreno e di mq " + str(stot)
132 print
133 print "ora calcoliamo quanto terreno spetta a ciascuno dei tre fratelli"
134
135 seta = 0
136 for i in eta:
137 seta=seta+i
138
139
140 areau =(stot/seta)
141
142 for i in eta:
143 a =areau*i
144 nomi.append(a)
145 for i in range(0,3):
146 print "l'area spettante a " +nomi[i] + " somma mq. "+ str(nomi[i+3])
147 print
148
149 print' Fine programma '
Listato del programma AreaTriangolo3.py
Ulteriori risorse
È possibile anche utilizzare delle interfacce grafiche, per informazioni consultare la relativa guida.