01 - Python Programming

Introduzione a Python


Panoramica di Python

Storia di Python

Python è un linguaggio di programmazione creato da Guido van Rossum nel 1991. È stato sviluppato come successore di ABC, un linguaggio che mirava a essere facile da usare. Python è conosciuto per la sua sintassi leggibile e il suo supporto per più paradigmi di programmazione, inclusi quelli imperativi, procedurali, orientati agli oggetti e funzionali.


Differenze tra Python 2 e Python 3

Python 2 e Python 3 sono due versioni principali del linguaggio Python, e presentano alcune differenze chiave che rendono importante la scelta della versione giusta per il proprio progetto.


Funzionalità Introdotte nelle versioni recenti di Python 3

Python 3 ha visto molte aggiunte significative negli ultimi anni, rendendo il linguaggio più potente e versatile.


Applicazioni di Python

Python è utilizzato in vari campi grazie alla sua versatilità:


Installazione e Configurazione dell'Ambiente di Sviluppo

Installare Python

Per iniziare a programmare in Python, è necessario installarlo sul proprio sistema operativo.


Configurare un ambiente di sviluppo

Un buon ambiente di sviluppo migliora l'esperienza di programmazione. Visual Studio Code è un editor di codice gratuito e potente con un'ottima estensione per Python.


Primi Passi con Python

Scrivere e eseguire il primo programma Python

Il primo programma che la maggior parte delle persone scrive in un nuovo linguaggio di programmazione è il classico "Hello, World!".

# Questo è il nostro primo programma in Python
print("Hello, World!")

Questo semplice programma stampa "Hello, World!" sulla console. La funzione print() è usata per produrre output.


Utilizzo dell'interprete Python

Python può essere eseguito in diversi modi:


Termini e Definizioni Fondamentali

Concetti di Base

Identificatori e parole chiave

Gli identificatori sono i nomi utilizzati per variabili, funzioni, classi, ecc. Devono seguire queste regole:

Esempi di nomi validi:

my_variable = 10
Variable1 = 20
_hidden = 30

Le parole chiave sono riservate dal linguaggio e non possono essere usate come identificatori. Alcune delle parole chiave di Python includono: if, else, while, for, def, class, ecc.


Commenti e documentazione del codice

Commentare il codice è essenziale per la leggibilità e la manutenzione.

I commenti aiutano a spiegare cosa fa il codice e sono particolarmente utili quando il codice diventa complesso.



Termini e Definizioni Fondamentali

Concetti di Base

Identificatori e parole chiave

Commenti e documentazione del codice

Logica e Struttura di Python

Logica e Struttura di Python

Blocco di codice e indentazione

Python usa l'indentazione per definire i blocchi di codice. Ogni blocco di codice deve essere indentato allo stesso livello. Questo rende il codice più leggibile e organizzato.

Un errore comune è non mantenere la coerenza nell'indentazione, che può causare errori di sintassi.


Python come linguaggio interpretato

Python è un linguaggio interpretato, il che significa che il codice viene eseguito direttamente dall'interprete Python, riga per riga, senza una fase di compilazione preliminare. Questo permette un ciclo di sviluppo rapido, poiché il codice può essere testato e modificato facilmente.

In contrasto, i linguaggi compilati come C o C++ traducono il codice sorgente in un file eseguibile prima dell'esecuzione. Questo può portare a tempi di sviluppo più lunghi, ma eseguire il codice più velocemente.


Literals, Variabili e Sistemi Numerici

Literals e Variabili

Literals

I literals sono valori costanti che appaiono direttamente nel codice.


Dichiarazione e assegnazione di variabili

Le variabili sono usate per memorizzare dati che possono essere utilizzati e modificati nel programma.

L'uso di nomi descrittivi per le variabili rende il codice più leggibile e facile da capire.


Tipi di Dati Numerici

Interi, float e complessi

I numeri in Python possono essere di vari tipi:

Esempi di operazioni sui tipi numerici:

x = 5
y = 2.5
z = 1 + 1j

somma = x + y  # 7.5
prodotto = x * y  # 12.5

Conversione di tipi numerici

Python permette di convertire tra diversi tipi numerici usando funzioni built-in.

La conversione dei tipi è utile quando si lavora con input che devono essere trattati come numeri.


Operatori

Operatori aritmetici

Gli operatori aritmetici sono usati per eseguire operazioni matematiche di base.


Questa sezione spiega gli operatori aritmetici di base in Python, inclusi la somma, sottrazione, moltiplicazione, divisione, divisione intera, potenza e modulo, con esempi pratici di come possono essere utilizzati senza introdurre strutture di controllo come if e cicli.


Operatori di confronto

Gli operatori di confronto confrontano due valori e restituiscono un valore booleano (True o False).

Questi operatori sono utilizzati comunemente nei blocchi condizionali.


Operatori logici

Gli operatori logici permettono di combinare più condizioni.

Gli operatori logici sono usati per costruire espressioni condizionali complesse.


Operatori di assegnazione

Gli operatori di assegnazione sono usati per assegnare valori alle variabili.

Questi operatori semplificano le operazioni di aggiornamento delle variabili.


Operatori bitwise

Gli operatori bitwise eseguono operazioni sui bit dei numeri interi.

Questi operatori sono utili per manipolazioni di basso livello.


Input/Output da Console

Operazioni di Input

Funzione input()

La funzione input() permette di leggere dati dall'utente. Restituisce sempre una stringa, quindi spesso è necessario convertirla al tipo di dati appropriato.

L'input dell'utente è fondamentale per interagire con i programmi.


Input/Output da Console

Operazioni di Input

Funzione input()

La funzione input() permette di leggere dati dall'utente. Quando viene chiamata, input() mette in pausa l'esecuzione del programma e attende che l'utente inserisca un dato, terminato dalla pressione del tasto Invio. Il valore inserito dall'utente viene restituito come una stringa.


Operazioni di Output

Funzione print()

La funzione print() è utilizzata per produrre output sulla console. Può accettare uno o più argomenti, separati da virgole, e visualizzarli in sequenza sulla console. La funzione print() aggiunge automaticamente un carattere di nuova riga alla fine dell'output, ma questo comportamento può essere modificato utilizzando il parametro end.


Formattazione delle stringhe

Esistono diversi modi per formattare le stringhe in Python, rendendo l'output più leggibile e strutturato.


Formattazione avanzata con f-strings

Le f-strings offrono molte opzioni avanzate per la formattazione delle stringhe, rendendo semplice il controllo preciso dell'output.


Flusso di Controllo - Blocchi Condizionali e Loop

Istruzione If

Sintassi dell'istruzione if

Le istruzioni condizionali permettono di eseguire diverse sezioni di codice basate su condizioni.


Esempi pratici

Questi blocchi condizionali sono fondamentali per il controllo del flusso di un programma.


Loop

Loop for

I loop for sono usati per iterare su sequenze (liste, stringhe, range).


Loop while

I loop while eseguono una sezione di codice finché una condizione è vera.


Istruzioni di controllo del loop

Queste istruzioni permettono di controllare il flusso all'interno dei loop.


Data Collection - Liste, Tuple, Dizionari, Set e Stringhe

Liste

Le liste sono collezioni ordinate di elementi che possono essere di qualsiasi tipo. Sono mutabili, il che significa che gli elementi possono essere modificati dopo la creazione della lista.

Creazione e manipolazione delle liste


Metodi delle liste

Le liste in Python hanno molti metodi integrati per manipolare i dati:


Liste nidificate e comprensione delle liste


Tuple

Le tuple sono collezioni ordinate e immutabili di elementi. Una volta create, gli elementi di una tupla non possono essere modificati.

Creazione e uso delle tuple


Differenze tra liste e tuple


Set

I set sono collezioni non ordinate e non indicizzate di elementi unici. Sono mutabili, il che significa che gli elementi possono essere aggiunti o rimossi, ma ogni elemento può apparire una sola volta.

Creazione e uso dei set


Metodi dei set


Differenze tra Tuple e Set

Le tuple e i set sono due tipi di collezioni in Python che hanno caratteristiche e usi distinti:

Tuple

Set

Sintesi


Dizionari

I dizionari sono collezioni non ordinate di coppie chiave-valore, dove ogni chiave è unica. Sono mutabili e permettono accesso rapido ai valori basato sulla chiave.

Creazione e uso dei dizionari


Metodi dei dizionari


Stringhe

Le stringhe in Python sono sequenze immutabili di caratteri. Supportano molte operazioni e metodi utili per la manipolazione del testo.

Operazioni base sulle stringhe


Metodi delle stringhe

Le stringhe in Python hanno molti metodi utili per la manipolazione del testo:


Utilizzo della funzione len()

La funzione len() restituisce la lunghezza di una collezione (numero di elementi) o di una stringa (numero di caratteri). Può essere utilizzata con liste, tuple, dizionari, set e stringhe.

In tutti questi esempi, la funzione len() viene utilizzata per determinare il numero di elementi nelle diverse collezioni o il numero di caratteri in una stringa.



Funzioni ed Eccezioni

Funzioni

Le funzioni sono blocchi di codice riutilizzabili che eseguono un'operazione specifica. Permettono di organizzare il codice in modo modulare, facilitando la leggibilità e la manutenzione.

Definizione e chiamata di funzioni


Parametri e argomenti

Le funzioni possono accettare input sotto forma di parametri, che sono variabili elencate tra le parentesi nella definizione della funzione. Gli argomenti sono i valori effettivi che vengono passati quando la funzione viene chiamata.


Parametri variabili

Python consente di passare un numero variabile di argomenti a una funzione utilizzando *args e **kwargs.


Gestione delle Eccezioni

Introduzione alle eccezioni

Le eccezioni sono eventi che interrompono il normale flusso di un programma. Python gestisce le eccezioni usando blocchi try-except.


Sintassi del blocco try-except

Il blocco try-except permette di gestire errori in modo elegante senza interrompere il programma.


Il blocco finally viene eseguito indipendentemente dal fatto che un'eccezione sia stata sollevata o meno. Il blocco else viene eseguito solo se non viene sollevata alcuna eccezione.


Moduli e Pacchetti

I moduli e i pacchetti sono strumenti essenziali in Python che permettono di organizzare il codice in maniera modulare, facilitando il riuso e la gestione delle dipendenze.

Importazione di Moduli

I moduli in Python sono file che contengono definizioni di funzioni, variabili e classi che possono essere riutilizzate in altri file.

Importare moduli built-in

Python viene fornito con molti moduli built-in che offrono funzionalità estese. Puoi importare questi moduli usando la parola chiave import.



Moduli Specifici

Python offre una vasta gamma di moduli built-in che forniscono funzionalità estese. Qui approfondiamo i moduli math, random, platform, e os, elencando le loro funzioni più utilizzate.

Modulo math

Il modulo math fornisce funzioni matematiche standard, tra cui:


Modulo random

Il modulo random è usato per generare numeri casuali e funzioni correlate:


Modulo platform

Il modulo platform fornisce informazioni sul sistema operativo:


Modulo os

Il modulo os fornisce una portabilità del sistema operativo e funzioni per interagire con il filesystem:


Utilizzo dei gestori di pacchetti

pip

pip è il gestore di pacchetti predefinito per Python, utilizzato per installare e gestire i pacchetti Python. È uno strumento potente che semplifica l'installazione di librerie e moduli necessari per i tuoi progetti.


venv

venv è un modulo incluso in Python 3 che permette di creare ambienti virtuali. Un ambiente virtuale è una directory che contiene un'installazione di Python isolata dal sistema globale, permettendo di gestire le dipendenze del progetto senza interferire con altri progetti.


Stringhe - Operazioni Avanzate

Meccanica delle Stringhe

Codifica dei caratteri

Le stringhe in Python supportano vari encodings.


Byte e stringhe

Le stringhe possono essere convertite in byte e viceversa.

stringa = "€"
byte_data = stringa.encode("utf-8")
print(byte_data) # stampa b'\xe2\x82\xac'
stringa_decodificata = byte_data.decode("utf-8")
print(stringa_decodificata) # stampa €


---

### Manipolazioni Avanzate

#### Regex e stringhe

Le espressioni regolari permettono di cercare e manipolare stringhe in modo avanzato.

- **Introduzione alle espressioni regolari:** Le espressioni regolari permettono di cercare e manipolare stringhe in modo avanzato.
- **Uso del modulo `re` per la ricerca e la sostituzione:**
```python
import re
testo = "Il numero è 123-456-7890"
pattern = r'\d{3}-\d{3}-\d{4}'
risultato = re.search(pattern, testo)
print(risultato.group())

Operazioni di slicing e concatenazione


Gestione dei File

La gestione dei file in Python permette di leggere e scrivere dati in file. È utile per salvare dati persistenti, leggere configurazioni o registrare informazioni.

Operazioni di Base su File

Apertura di File

Per aprire un file in Python, usiamo la funzione open(), che restituisce un oggetto file. È importante chiudere sempre il file dopo averlo usato per liberare risorse, cosa che può essere fatta con il metodo close() o usando una dichiarazione with.


Lettura di File

Python offre diverse modalità per leggere i contenuti di un file.


Scrittura di File

Python consente di scrivere contenuti su file, creando nuovi file o modificando file esistenti.


Modalità Avanzate di Apertura di File

Modalità Binaria

Per leggere o scrivere file binari, come immagini o file eseguibili, si usa la modalità binaria ('b').

Gestione degli Errori

Quando si lavora con i file, è importante gestire gli errori che possono verificarsi, come la mancanza del file o permessi insufficienti.


Serializzazione

La serializzazione è il processo di trasformazione dei dati (come oggetti Python) in un formato che può essere facilmente memorizzato e recuperato, come JSON.

JSON: JavaScript Object Notation

JSON è un formato leggero di scambio di dati. È facile da leggere e scrivere per gli umani e facile da analizzare e generare per le macchine.

Utilizzo del modulo json

Python fornisce il modulo json per serializzare (convertire oggetti Python in JSON) e deserializzare (convertire JSON in oggetti Python).

Serializzare Dati in JSON


Deserializzare Dati da JSON


Esempio Completo di Serializzazione e Deserializzazione

Serializzare e scrivere in un file:

import json

dati = {
    "nome": "Alice",
    "eta": 30,
    "città": "Roma"
}

with open('dati.json', 'w') as file:
    json_stringa = json.dumps(dati)
    file.write(json_stringa)
# Scrive i dati come JSON nel file 'dati.json'

Leggere da un file e deserializzare:

import json

with open('dati.json', 'r') as file:
    json_stringa = file.read()
    dati = json.loads(json_stringa)
print(dati)
# Output: {'nome': 'Alice', 'eta': 30, 'città': 'Roma'}

In questo esempio, i dati vengono serializzati in formato JSON e scritti in un file dati.json. Successivamente, i dati vengono letti dal file e deserializzati in un oggetto Python.