#format wiki
#LANGUAGE it
<<BR>>
<<Include(NuoviStrumentiWiki/PaginaDiProva)>>
<<Indice(depth=1)>>
<<Informazioni(forum="https://forum.ubuntu-it.org/viewtopic.php?f=46&t=638200"; rilasci="22.04 20.04 18.04")>>

= Introduzione =

In questa pagina vengono mostrati alcuni programmi scritti in Python a difficoltà crescente. Non è per niente una guida alle funzionalità del linguaggio. Se si desidera approfondire le proprie conoscenze, consultare la sezione [[#Ulteriori_risorse|Ulteriori Risorse]].

Questi listati sono scritti per l'interprete Python 3.x; per la guida nella vecchia e deprecata versione Python 2.7 consultare la [[Programmazione/Python/Listati|relativa guida]].

= Listato 1 =
Esempio di script minimale: calcola l'area di un triangolo richiedendo all'utente di immettere la misura dei lati.
{{{#!python
#!/usr/bin/python3

""" Questa è un'area di commento usata per indicare cosa fa il programma e come.

    Calcola l'area di un triangolo qualsiasi, noti i suoi tre lati.
    Usa la formula di Erone: sqrt p*(p-a)*(p-b)*(p-c)  
    dove:  sqrt = radice quadrata; p = (a+b+c)/2;  a,b,c lati
"""

# tutto ciò che viene preceduto dal carattere  #  è
# considerato dall'interprete come un commento
import math  # importa il modulo math; anche questo è un commento 
a = int(input('inserisci il primo lato  '))
print('primo lato = ', a)
b = int(input('inserisci il secondo lato  '))
print('secondo lato = ', b)
c = int(input('inserisci il terzo lato  '))
print('terzo lato = ', c)
print();
print(" ora calcolo l'area di questo triangolo")
print()
p = (a+b+c) / 2
s = math.sqrt(p * (p-a) * (p-b) * (p-c))

print("l'area  del triangolo è " , s)
}}} ''Listato del programma Area``Triangolo.py''

= Listato 2 =
Il programma precedente si interrompe se durante l'inserimento dei dati, per errore, viene digitato un carattere non numerico. Per questo il seguente script, che salviamo col nome `AreaTriangolo2.py`, inserisce un controllo sul dato immesso. 
{{{#!python
#!/usr/bin/python3

import math
i = 0
l = []
print("\nInserire le misure dei lati:")
while True:
    a = input(f'\tMisura del {i+1}° lato:  ')
    if not a.isdigit():
        print("non hai digitato un numero valido. Riprova")
        continue  # ricomincia il ciclo while e ripete la richiesta dello stesso lato
    # una volta verificato che il dato immesso è una cifra, lo
    # converte in numero a virgola mobile e lo inserisce in un array 
    l.append(float(a))
    i += 1  
    if i < 3:
        continue # ricomincia il ciclo while per passare al successivo lato
    else:
        print()
        print('primo lato   = ', l[0])
        print('secondo lato = ', l[1])
        print('terzo lato   = ', l[2])
        p = (l[0]+l[1]+l[2]) / 2 # calcola il semiperimetro
        if  p > l[0]  and  p > l[1] and p > l[2]:
            break  # esce dal ciclo while per fine input
        else:
            print("questi dati non possono rappresentare i lati di un triangolo. Riprova:")
            i = 0
            l = []
            continue # ricomincia il ciclo while per acquisire di nuovo tutti i lati

s = math.sqrt(p * (p-l[0]) * (p-l[1]) * (p-l[2]))
print("l'area di questo triangolo è " , s)
print()
print("Fine programma ")
}}} ''Listato del programma Area``Triangolo2.py''

= Listato 3 =

Questa è un'alternativa più efficiente della versione precedente `AreaTriangolo2.py`: utilizza le classi e la gestione delle eccezioni per eliminare ogni possibilità di errore di immissione senza costringere a immettere solo numeri interi.
{{{#!python
#!/usr/bin/python3

from math import sqrt# Importa la funzione sqrt (radice quadrata) dal modulo math


class TriangoloInesistente(Exception):
    """Classe per sollevare un'eccezione se vengono immesse misure incompatibili."""
    
    def __init__(self, message="\nUn triangolo con queste misure non esiste. Riprova."):
        self.message = message


class Triangolo:
    """Classe per costruire gli oggetti triangolo da calcolare
    
    Oltre al costruttore, la classe ha due metodi:
    un metodo che calcola il perimetro e uno che calcola l'area.
    Attributi della classe sono le misure dei tre lati a, b, c
    """

    def __init__(self, a, b, c):
        """Metodo costruttore. In Python i costruttori hanno il nome speciale __init__
        
        Controlla se i tre valori immessi sono accettabili,
        cioè se sono validi come misure dei lati di un triangolo.
        In caso contrario solleva una eccezione TriangoloInesistente.
        """
        
        if a + b > c and a + c > b and b + c > a:
            self.a = a
            self.b = b
            self.c = c
        else:
            # quando il tipo dei dati è corretto (numeri in virgola mobile) 
            # ma i valori sono incompatibili.
            raise TriangoloInesistente
    def perimetro(self):
        "Metodo che calcola il perimetro"
        return self.a + self.b + self.c

    def area(self):
        "Metodo che calcola l'area (tramite formula di Erone)"
        p = self.perimetro() / 2.0
        return sqrt(p * (p - self.a) * (p - self.b) * (p - self.c))


while True:
    # Chiede all'utente di immettere le misure dei lati
    print("\nInserire le misure dei lati:")
    lati=[]
    for lato in 'abc':
        while True:
            l = input(f"\tMisura del lato {lato}: ")
            try :
                l = float(l)
            # se viene inserito un valore che non si può trasformare in un numero,
            # ad esempio una lettera, si solleva l'eccezione ValueError 
            except ValueError:
                print("\nDevi inserire valori numerici. Riprova.\n")
            # se invece non è stata sollevata nessuna eccezione
            # possiamo salvare il valore del lato
            else:
                lati.append(l)
                break
    try:
        # Crea una nuova istanza della classe Triangolo.
        # In pratica facciamo una chiamata al suo metodo costruttore:
        # sarebbe stato lo stesso scrivere "triangolo = Triangolo.__init__(a,b,c)"
        triangolo = Triangolo(lati[0], lati[1], lati[2])
    # qua gestiamo l'eccezione che potrebbe sollevarsi nella classe Triangolo
    except TriangoloInesistente as err:
        #"err" è l'oggetto creato da Python durante il verificarsi dell'errore 
        print(err.message)
        continue
    # Utilizza i metodi definiti nella classe per ottenere perimetro ed area
    # dell'oggetto triangolo e stampa a video i risultati.
    print()
    print("Perimetro = ", triangolo.perimetro())
    print("Area = ", triangolo.area())

    # Chiede all'utente se intende terminare il programma.
    exit = input("\nUscire [digitare 's' per confermare]? ")
    print("")
    if exit == "s": break
}}} ''Listato del programma !AreaTriangolo2ConEccezioni.py''


= Listato 4 =

Ora supponiamo di dover calcolare l'area di un appezzamento di terreno scomposto in un numero finito di triangoli.<<BR>>
Una volta nota l'area, supponiamo che debba essere divisa, per volontà testamentaria, in tre parti in funzione dell'età di tre fratelli.<<BR>>
Useremo come base lo script [[#areatriangolo2|AreaTriangolo2.py]], con qualche modifica o aggiunta; lo salveremo come  `AreaTriangolo3.py`.
{{{#!python
#!/usr/bin/python3

from math import sqrt

### fase di input
nomi = []
fratelli =[]
lati= []
x = 1
while x <= 3:
    a = input(f' Inserici il nome del {x}° fratello: ')
    if not a.isalpha():
        print(" Errore nell'immettere il nome. Riprova")
        continue  # ricomincia il ciclo while per reinserire il nome che era errato
    nomi.append(a.title()) #  salva nella lista nomi il nome (con iniziale maiuscola)
    x += 1

for nome in nomi:
    a = ""
    while not a.isdigit():
        a = input(f" Inserisci l'età di {nome}: ")
        if not a.isdigit():
            print(" Non hai digitato un numero valido. Riprova")

    fratelli.append((nome, int(a)))
for n, e in fratelli:
    print(f' Età di {n}: {e}', end="  ")
print('\n')
#input dei dati per il calcolo dell'area dell'appezzamento
tria = []
n_tri = 0
si = ''
while si != "S":
    n_tri += 1
    lati = []
    p = 0
    for i in range(1, 4):
        while True:
            try:
                a = input(f' Inserisci il {i}° lato del {n_tri}° triangolo: ')
                lati.append(float(a))
            except ValueError:
                print(" Non hai digitato un numero valido. Riprova")
                continue  #continua il ciclo while costringendo a reimmettere il dato 
            break
    # terminato l'input dei dati del triangolo 
    # li ripresenta a video per maggior chiarezza
    for i, lato in enumerate(lati):
        print(f' {i + 1}° lato = {lato}', end=" ")
        p += lato / 2
    if not p > lati[0] and p > lati[1] and p > lati[2]:
        print("\n Questi dati non rappresentano i lati di un triangolo. Riprova")
        continue # ricomincia il ciclo while perché i dati immessi erano errati
    tria.append(lati)
    print('\n')
    si = input(" hai finito di immettere i triangoli?  conferma con S/s  ").upper()

### fase di calcolo area appezzamento
# il calcolo dell'area verrà ripetuto una volta per triangolo
stot = 0
for i, lati in enumerate(tria):
    p = 0
    print(f"\n {i + 1}° triangolo\n Lati:", end=' ')
    for lato in lati:
        print(lato, end='  ')
        p += lato / 2.0
    print()
    s = sqrt(p * (p-lati[0]) * (p-lati[1]) * (p-lati[2]))
    print(f" Area = {s}")
    stot += s
print(f"\n L'area totale dell'appezzamento di terreno è di mq {stot:<15.2f}")
print(" quanto terreno spetta a ciascuno dei tre fratelli in base all'età:")

seta = sum([eta for n, eta in fratelli])  # somma delle età dei fratelli
areau = stot / seta  # rapporto tra area totale e somma delle età

for fratello in fratelli:
    nome, eta = fratello
    area = areau * eta
    print(f"\n l'area spettante a {nome} somma {area:<10.2f}")

print()
print(' Fine programma ') 

}}} ''Listato del programma !AreaTriangolo3.py''
<<BR>><<BR>>

= Ulteriori risorse =
 * [[https://wiki.python.org/moin/BeginnersGuide|Guida ufficiale per principianti (Inglese)]]
 * [[https://www.python.it/doc/newbie/|Python per i principianti]]
 * [[https://www.html.it/guide/guida-python/|Una guida per Python]]



 * È possibile anche scrivere applicazioni dotate di interfaccia grafica, per informazioni consultare la [[Programmazione/Python/InterfacceGrafichePython3|relativa guida]].


----
##CategoryProgrammazione 
CategoryHomepage