Calcolatrice in Python

Calcolatrice in Python

In questa lezione svilupperemo una calcolatrice in Python utilizzando le classi. La nostra calcolatrice dovrà semplicemente prendere in input due numeri richiesti ed elaborarli attraverso le operazioni aritmetiche.

Calcolatrice in Python – implementazione

Innanzitutto creeremo una classe Calculator dove utilizzeremo il costruttore init con i due parametri a e b oltre al parametro self.

Poi definiamo dei metodi per le 4 operazioni aritmetiche. Stiamo attenti alla divisione in quanto non si può dividere un numero per 0.

Ecco dunque una possibile implementazione:


class Calculator:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def add(self):
        return self.a + self.b

    def sub(self):
        return self.a - self.b

    def mol(self):
        return self.a * self.b

    def div(self):
        if self.b == 0:
            print("Non puoi dividere per zero")
            return None
        
        return self.a / self.b

Salviamo il file con nome ‘Calculator.py’ per poterlo così importare ogni qualvolta ci serve.

Dopo definiamo un’istanza passando i valori a e b e richiamiamo alcuni metodi.

Ecco il codice di esempio:



from Calculator import *

calc = Calculator(10,5)

divisione = calc.div()
print(divisione)

addizione = calc.add()
print(addizione)

Facciamo una piccola variazione alla calcolatrice in Python appena creata. Piuttosto che passare gli attributi all’istanza, li chiederemo in input.

Inoltre potremmo anche chiedere all’utente di scegliere un’operatore aritmetico.

Modifichiamo allora la classe precedente inserendo i valori di default ad a e b.

Ecco una possibile implementazione:



class Calculator:
    def __init__(self):
        self.a = 0.0
        self.b = 0.0

    def add(self):
        return self.a + self.b

    def sub(self):
        return self.a - self.b

    def mol(self):
        return self.a * self.b

    def div(self):
        if self.b == 0:
            print("Non puoi dividere per zero")
            return None
        
        return self.a / self.b

Dopo chiediamo all’utente di inserire i numeri che possono essere anche con la virgola.

Poi chiediamo di inserire l’operatore per poi eseguire correttamente l’operazione.

Infine stampiamo il risultato:



from Calculator import *

calc = Calculator()
calc.a = float(input('Inserisci il primo numero: '))
calc.b = float(input('Inserisci il secondo numero: '))

op = input("""
Scegliere un'operazione: 
+ , - , * , /
""")

if op == '+':
    risultato = calc.add()
elif op == '-':
    risultato = calc.sub()
elif op == '*':
    risultato = calc.mol()
elif op == '/':
    risultato = calc.div()
else:
    risultato = "Il carattere inserito non è valido"
    
print(risultato)

Conclusione

In questa lezione abbiamo realizzato una semplice calcolatrice in Python utilizzando le classi, nelle prossime lezioni studieremo tanti altri esempi sulle classi in Python.

Alcuni link utili

Indice tutorial sul linguaggio Python

Operazioni con i file in Python

Introduzione ai dizionari in Python

Funzione lambda in Python

Utilizzare Plot di Matplotlib

Quali sono i metodi delle liste

Memorizzare dati di input in un file di testo

Che cos’è il machine learning

Machine Learning in Python

Metodi delle classi in Python

Metodi delle classi in Python

In questa lezione studieremo come utilizzare i metodi delle classi in Python.

Ad ogni metodo, come già abbiamo visto nelle lezioni precedente, viene innanzitutto passato il parametro self che rappresenta l’oggetto stesso, ma possiamo passare altri parametri.

Riprendiamo l’esempio della lezione precedente in cui abbiamo definito una classe Student con gli attributi name, lastname ed age.

Metodi delle classi in Python – primo esempio

Aggiungiamo alla classe Student un metodo che serve semplicemente a stampare la scheda di ciascun studente.

Ecco dunque una possibile implementazione:



class Student:
    def __init__(self, name, lastname, age):
        self.name = name
        self.lastname = lastname
        self.age = age

    def stampa_studente(self):
        return f"Studente:\nNome:{self.name}\nCognome:{self.lastname}\nAge:{self.age}"

Abbiamo realizzato il metodo stampa_studente tramite il quale ritorniamo i dati dello studente, così, diversamente a ciò che abbiamo realizzato nell’esempio precedente, basterà richiamare questo metodo per stampare tutti i dati dello studente.

L’unico parametro che abbiamo passato al metodo stampa_studente è self, ma come già detto potremmo passare altri parametri.

Adesso, dopo aver importato la classe Student, creiamo delle istanze di esempio e stampiamo i dati utilizzando il metodo stampa_studente.



from Student import *

student1 = Student("Nick", "Rossi", 23)
student2 = Student("Janet", "Verdi", 24)

print(student1.stampa_studente())
print(student2.stampa_studente())

Metodi delle classi in Python – secondo esempio

Realizziamo un secondo esempio in cui definiamo una classe auto con attributi e metodi.

Come attributi inseriamo solo la marca, la cilindrata e le porte. Poi aggiungiamo un semplice metodo immatricolazione che serve ad inserire la targa dell’auto.

Ecco dunque una possibile implementazione:



class Auto:
    def __init__(self, marca, cilindrata, porte):
        self.marca = marca
        self.cilindrata = cilindrata
        self.porte = porte

    def immatricolazione(self, targa = 0):
        self.targa = input("Inserisci la targa")
        return self.targa

Salviamo poi il file con il nome di ‘Auto.py‘.

In un altro file richiamiamo la classe e definiamo un’istanza.

Stampiamo la marca dell’auto. Poi, quando richiamiamo il metodo immatricolazione ci verrà richiesto di inserire la targa dell’auto. La stampiamo utilizzando print.

Ecco quindi il codice di esempio:



from Auto import *

auto1 = Auto("Fiat", 90, 5)

print(auto1.marca)
print("La targa dell'auto: ", auto1.immatricolazione())

Conclusioni

In questa lezione abbiamo utilizzando dei semplici metodi delle classi in Python, nelle prossime lezioni approfondiremo questo argomento.

Alcuni link utili

Indice tutorial sul linguaggio Python

Operazioni con i file in Python

Introduzione ai dizionari in Python

Funzione lambda in Python

Utilizzare Plot di Matplotlib

Quali sono i metodi delle liste

Memorizzare dati di input in un file di testo

Classi in Python

Classi in Python

In questa lezione svilupperemo alcuni esempi di classi in Python, al fine di consolidare quanto appreso nelle lezioni precedenti.

Classi in Python – primo esempio

Sviluppiamo dunque un primo esempio nel quale definiamo una classe Student:



class Student:
    def __init__(self, name, lastname, age):
        self.name = name
        self.lastname = lastname
        self.age = age

Salviamo questa classe nel file ‘Student.py‘ e poi in un altro file Python lo importiamo utilizzando from ed import.

Definiamo un’istanza di Student e poi la stampiamo:



from Student import *

student1 = Student("Nick", "Rossi", 23)

print("Name =", student1.name, "\nLastname =", student1.lastname, "\nAge =", student1.age)

In output avremo quindi:

Name = Nick
Lastname = Rossi
Age = 23

Stiamo associando alla variabile student1 un’istanza dell’oggetto Student.

Cosa succede se ad esempio omettiamo un qualsiasi parametro?

Facciamo dunque un esempio dove omettiamo di inserire l’età:



from Student import *

student1 = Student("Nick", "Rossi")

print("Name =", student1.name, "\nLastname =", student1.lastname)

In questo caso il codice restituirà un errore:

...
TypeError: Student.init() missing 1 required positional argument: ‘age’

Questo perchè tutti i parametri sono obbligatori.

Come fare allora per rendere un parametro opzionale? Lo studieremo nel prossimo paragrafo.

Classi in Python – rendere un parametro opzionale

Per rendere un parametro opzionale, possiamo ad esempio assegnare un valore di default come ad esempio 0.



class Student:
    def __init__(self, name, lastname, age = 0):
        self.name = name
        self.lastname = lastname
        self.age = age

In questo modo quando definirò l’istanza student1 non si avrà più l’errore di prima:



from Student import *

student1 = Student("Nick", "Rossi")

print("Name =", student1.name, "\nLastname =", student1.lastname)

L’output sarà quindi:

Name = Nick
Lastname = Rossi

Possiamo sempre assegnare un valore ad age, in modo da sovrascrivere il valore di default:



from Student import *

student1 = Student("Nick", "Rossi", 22)

print("Name =", student1.name, "\nLastname =", student1.lastname, "\nAge =", student1.age)

Possiamo assegnare i valori di default ad uno o più parametri.

Facciamo dunque un altro esempio:



class Student:
    def __init__(self, name = "Nick", lastname = "Rossi", age = 0):
        self.name = name
        self.lastname = lastname
        self.age = age

Definiamo un’istanza senza passare alcun valore ma lasciando i valori di default:



student1 = Student()

print("Name =", student1.name, "\nLastname =", student1.lastname, "\nAge =", student1.age,)

Conclusioni

In questa lezione abbiamo studiato alcuni esempi di classi in Python, nelle prossime lezioni vedremo come utilizzare i metodi delle classi.

Alcuni link utili

Indice tutorial sul linguaggio Python

Operazioni con i file in Python

Introduzione ai dizionari in Python

Funzione lambda in Python

Utilizzare Plot di Matplotlib

Quali sono i metodi delle liste

Memorizzare dati di input in un file di testo

Che cos’è il machine learning

Machine Learning in Python

Class Python

Class Python

Per definire una classe in Python utilizziamo la dichiarazione class seguita dal nome univoco della classe. All’interno di questa classe specifichiamo poi gli attributi ed i suoi metodi.

Tutte le classi hanno una funzione chiamata __init__(), che viene eseguita quando la classe viene avviata per creare un nuovo oggetto. Questa funzione identifica il costruttore, cioè rappresenta l’inizializzazione delle impostazioni dell’oggetto.

Il costruttore è dichiarato come qualsiasi altro metodo.

La sintassi per definire una classe è dunque questa:



class NomeClasse():
    #inizializzazione degli attributi
    def __init__(self, parametri):
        #attributi
    def nome_metodo(self, parametri):
        #azioni del metodo

Secondo le regole di programmazione, in tutti i linguaggi, il nome della classe si scrive sempre in maiuscolo, se è un nome composto si utilizza il PascalCase.

I nomi dei metodi sono in minuscolo e se sono costituiti da nomi composti si utilizza lo snake_case ovvero il carattere undescore (_) per separare le parole.

Il parametro self è un riferimento all’istanza corrente della classe ed è utilizzato per accedere alle variabili che appartengono alla classe. In definitiva self identifica la classe stessa e consente di utilizzare gli attributi all’interno dei metodi

Class Python – esempi

Facciamo un primo esempio per comprendere meglio l’utilizzo delle classi. Creiamo una semplice classe rettangolo avente come attributi la base e l’altezza ed il metodo area.



class Rect():
    #inizializzazione degli attributi
    def __init__(self, base, altezza):
        self.base = base
        self.altezza = altezza

    def area(self):
        return self.base * self.altezza

Creiamo poi un’istanza di questa classe:



#rect1 è un'istanza di Rect
rect1 = Rect(4,5)
#stampiamo la base
print("Base =", rect1.base)

#cambiamo la base
rect1.base = 10
print("Nuova Base =", rect1.base)

#stampiamo l'altezza
print("Altezza =", rect1.altezza)

#stampiamo l'area
print("Area =", rect1.area())

Class Python – salvataggio

Di solito le classi venfono salvate in file separati, come i moduli in Python, per poi essere richiamati con questo metodo:



from NomeClasse import *

Nel caso della nostra classe Rect la salviamo in un file di nome ‘Rect.py’ e poi la richiamo in questo modo:



from Rect import *

rect1 = Rect(4,5)

Stiamo attenti ad utilizzare le iniziali maiuscole.

Conclusioni

In questa lezione abbiamo spiegato il concetto di classe in Python e abbiamo visto come crearla attraverso la dichiarazione class.

Alcuni link utili

Indice tutorial sul linguaggio Python

Operazioni con i file in Python

Introduzione ai dizionari in Python

Creare matrici in Python

Funzione lambda in Python

Utilizzare Plot di Matplotlib

Quali sono i metodi delle liste

La programmazione ad oggetti

La programmazione ad oggetti

Diamo un’introduzione sulla programmazione ad oggetti prima di affrontarla con Python.

Con il termine di OOP, ovvero Object Oriented Programming, intendiamo un paradigma di programmazione. In questo paradigma un programma può essere visto come un insieme di oggetti che interagiscono tra loro.

Finora, per lo sviluppo dei nostri programmi, abbiamo seguito un approccio procedurale e/o funzionale.

Ricordiamo che nell’approccio procedurale si eseguono le istruzioni secondo un ordine predefinito per ottenere il risultato desiderato, partendo dai dati di input.

Nell’approccio funzionale abbiamo utilizzato le funzioni da poter poi richiamare all’occorrenza anche in un programma principale detto main().

Adesso, nella programmazione orientata agli oggetti seguiremo un approccio che segue l’idea di utilizzare delle unità funzionali autonome.

Chiaramente i vari approcci possono essere utilizzati assieme.

Disponibile il libro su Python “50 Algoritmi per imparare Python”

La programmazione ad oggetti – OOP

Questo tipo di programmazione prende nome proprio dall’elemento su cui si basa, ovvero l’oggetto.

Un oggetto rappresenta dunque l’entità del problema. Infatti in esso possiamo memorizzare le informazioni che riguardano il suo stato ed associare un insieme di operazioni che esso può compiere.

Un oggetto può avere dunque degli attributi e dei metodi.

Gli attributi sono gli elementi che caratterizzano l’oggetto, cioè che lo descrivono.

I metodi invece sono le funzionalità che l’oggetto mette a disposizione.

Un classico esempio può essere rappresentato dall’oggetto auto. Questo oggetto può avere infatti degli attributi e dei metodi, facilmente classificabili.

Gli attributi possono ad esempio essere:

  • Casa_Produttrice
  • Cilindrata
  • Numero_Porte
  • Alimentazione
  • Potenza
  • ecc…

Mentre i metodi possono essere ad esempio:

  • Cambio_Marcia
  • Accelera
  • Frena
  • Rifornisci
  • ecc…

Come possiamo notare gli attributi sono le caratteristiche dell’auto, mentre i metodi sono le azioni che si possono esercitare sull’auto come accelerare, frenare, ecc.

Disponibile il libro su Python “50 Algoritmi per imparare Python”

La programmazione ad oggetti – Classe

Diamo un altro concetto importante per la programmazione ad oggetti, ovvero quello di classe.

La classe è la descrizione astratta dell’oggetto attraverso i suoi attributi e metodi. Infatti, per poter utilizzare un oggetto occorre creare una sua istanza.

Per rappresentare una classe si può usare anche uno schema grafico, ovvero un diagramma della classe che serve a identificare il nome, i suoi attributi e i suoi metodi.

Come ad esempio questo diagramma rappresentato nella tabella sotto:

Auto
Attributi
Casa_Produttrice
Cilindrata
Numero_Porte
Alimentazione
Metodi
Cambio_Marcia
Accelera
Frena
Rifornisci

Dopo aver definito una classe, nella programmazione ad oggetti, possiamo rappresentare le sue istanze.

Ad esempio:

Auto1

Casa_Produttrice: Fiat
Cilindrata: 60 kw
Numero_Porte: 5
Alimentazione: Diesel

Auto2

Casa_Produttrice: Maserati
Cilindrata: 90 kw
Numero_Porte: 5
Alimentazione: Diesel

Abbiamo definito così delle istanze dell’oggetto auto specificando i suoi attributi, in questo modo possiamo identificare le due auto facilmente ed utilizzarle all’interno dei nostri programmi.

Disponibile il libro su Python “50 Algoritmi per imparare Python”

Conclusioni

In questa lezione abbiamo semplicemente fornito un’introduzione sulla programmazione orientata agli oggetti, nelle prossime lezioni approfondiremo in dettaglio questi concetti.

Alcuni link utili

Indice tutorial sul linguaggio Python

Operazioni con i file in Python

Introduzione ai dizionari in Python

Creare matrici in Python

Funzione lambda in Python

Utilizzare Plot di Matplotlib

Quali sono i metodi delle liste

Disponibile il libro su Python “50 Algoritmi per imparare Python”

Aggiungere un numero random in un file

Aggiungere un numero random in un file

In questa lezione svilupperemo un semplice algoritmo per aggiungere un numero random in un file in Python.

Supponiamo di avere un file che contiene un numero.

Innanzitutto stampiamo il numero contenuto nel file, dopo generiamo un numero random e lo sommiamo al numero che è contenuto nel file.

Poi sommiamo i due numeri e aggiungiamo il numero così ottenuto al file, iniziando da una nuova riga.

Supponendo che il file number_random.txt contenga il numero 6, proviamo questo codice di esempio:


import random

f = open('number_random.txt', 'r+')
numero = f.readline()
print(numero)

random_number = random.randint(1, 100)
print(random_number)

somma = random_number + int(numero)
print(somma)

f.write('\n' + str(somma))
f.close()

Occorre utilizzare la modalità r+ per poter aprire un file in lettura e scrittura contemporaneamente.

Ricordiamo inoltre che il metodo write() vuole una stringa, quindi dobbiamo convertire il numero ottenuto dalla lettura del file in una stringa utilizzando il casting con str().

Aggiungere un numero random in un file – secondo esempio

In questo secondo esempio cercheremo di indovinare il numero che è contenuto nel file di testo number.txt.

Supponendo che il file contenga un solo numero, apriamo il file in modalità di sola lettura e leggiamo il numero. Dopo chiediamo qual è il numero contenuto nel file e diamo un messaggio di vittoria o di sconfitta dopo averlo confrontato.

Sviluppiamo un possibile algoritmo che risolve il nostro problema utilizzando anche una semplice funzione:


f = open('number.txt', 'r')
number = f.readline()

def indovina(num):
    if num == number:
        return True

my_number = input('Quale numero è contenuto nel file?: ')

risultato = indovina(my_number)

if risultato:
    print('Hai indovinato!')
else:
    print('Non hai indovinato')
    print('Il numero era: ' + number)

Aggiungere un numero random in un file – terzo esempio

Adesso modifichiamo l’algoritmo dando degli aiuti all’utente. Ogni volta che l’utente proverà ad indovinare gli verrà detto se il numero pensato è più basso o più alto di quello contenuto nel file di testo.

Il tutto per 5 volte.

Quando siamo davanti ad un problema complesso dobbiamo scomporlo in sottoproblemi per renderlo più semplice.

Allora dapprima sviluppiamo il caso più semplice, cioè una sola risposta:


f = open('number.txt', 'r')
number = f.readline()

def indovina(num):
    if num == number:
        return 0
    elif num > number:
        return 1
    else:
        return 2
 

my_number = input('Quale numero è contenuto nel file?: ')

risultato = indovina(my_number)

if risultato == 0:
    print('Hai indovinato!')
elif risultato == 1:
    print('Il numero da indovinare è più basso')
else:
    print('Il numero da indovinare è più alto')

Adesso generiamo i 5 tentativi, facendo in modo di terminare il gioco quando si finiscono i tentativi oppure quando si indovina.

Generiamo una prima soluzione nella quale usciremo dal ciclo attraverso l’uso di break:


f = open('number.txt', 'r')
number = f.readline()

def indovina(num):
    if num == number:
        return 0
    elif num > number:
        return 1
    else:
        return 2
 
tentativi = 5

for i in range(tentativi):
    my_number = input('Quale numero è contenuto nel file?: ')
    risultato = indovina(my_number)
    if risultato == 0:
        print('Hai indovinato!')
        break
    elif risultato == 1:
        print('Il numero da indovinare è più basso')
    else:
        print('Il numero da indovinare è più alto') 

Adesso creiamo una nuova funzione evitando così l’utilizzo del break:


f = open('number.txt', 'r')
number = f.readline()

def indovina(num):
    if num == number:
        return 0
    elif num > number:
        return 1
    else:
        return 2
 
tentativi = 5
trovato = False

def gioco():
    for i in range(tentativi):
        my_number = input('Quale numero è contenuto nel file?: ')
        risultato = indovina(my_number)
        if risultato == 0:
            print('Hai indovinato!')
            return
        elif risultato == 1:
            print('Il numero da indovinare è più basso')
        else:
            print('Il numero da indovinare è più alto')

gioco()

In questa lezione abbiamo sviluppato alcuni algoritmi come ad esempio aggiungere un numero random in un file in Python, oppure indovinare il numero contenuto in un file di testo. Nelle prossime lezioni ci eserciteremo ancora sui file.

Alcuni link utili

Indice tutorial sul linguaggio Python

1 – Introduzione al linguaggio Python

2 – Le variabili

3 – Operatori aritmetici e di assegnazione

4 – Stringhe

5 – Casting

6 – Input e print

7 – Primi esercizi in Python