Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Guida completa alla programmazione in Python: dalle basi agli algoritmi avanzati, Appunti di Programmazione e controllo

Una panoramica completa della programmazione in python, spaziando dai concetti fondamentali come variabili e tipi di dati, fino a strutture dati avanzate come liste, matrici, insiemi e dizionari. Approfondisce l'uso delle funzioni, sia ricorsive che non, e introduce i moduli personalizzati. Particolare attenzione è dedicata alla programmazione orientata agli oggetti, con esempi pratici di classi, ereditarietà e metodi speciali. Vengono inoltre presentati algoritmi di ordinamento e tecniche di analisi della complessità, rendendo il documento una risorsa utile per chiunque voglia imparare o approfondire la programmazione in python. Il documento include anche esercizi pratici e esempi di codice per facilitare l'apprendimento.

Tipologia: Appunti

2024/2025

Caricato il 12/06/2025

phatosiani
phatosiani 🇮🇹

1 documento

1 / 78

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Loading [MathJax]/jax/output/CommonHTML/jax.js
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e

Anteprima parziale del testo

Scarica Guida completa alla programmazione in Python: dalle basi agli algoritmi avanzati e più Appunti in PDF di Programmazione e controllo solo su Docsity!

Loading [MathJax]/jax/output/CommonHTML/jax.js

RIASSUNTO PROGRAMMAZIONE

Capitolo 1: Primi Programmi con Python

Introduzione a Python

Python è un linguaggio di programmazione introdotto nel 1991 da Guido van Rossum,

progettato per essere leggibile, semplice e potente. È ampiamente utilizzato grazie alla sua

sintassi chiara e alle sue capacità di supportare vari paradigmi di programmazione, come la

programmazione procedurale, orientata agli oggetti e funzionale.

Caratteristiche principali di Python:

Open source e multipiattaforma (supporta Windows, Linux, MacOS, etc.). Include una vasta libreria standard per compiti comuni, come gestione file, operazioni matematiche, elaborazione dati e altro. Supporta un ambiente interattivo per test e sviluppo veloce.

Ambienti di sviluppo

Python può essere eseguito in diversi ambienti di sviluppo. Uno dei più utilizzati è Google

Colab , che permette di eseguire codice Python direttamente nel browser. Colab è utile per

iniziare a programmare senza dover installare nulla sul proprio computer.

Guida passo passo per usare Google Colab:

  1. Visita il sito: Google Colab.
  2. Crea un nuovo notebook selezionando "File" > "Nuovo Blocco Note".
  3. Scrivi il tuo codice nelle celle e premi il tasto "Esegui" ( ).
  4. Puoi salvare i tuoi file su Google Drive e condividerli facilmente.

La funzione print

La funzione print è una delle più basilari e utili in Python, usata per stampare messaggi e

risultati. Ecco alcuni esempi:

Stampare una stringa

print("Ciao mondo!")

Loading [MathJax]/jax/output/CommonHTML/jax.js

  • Sottrazione 5 - 3 → 2
  • Moltiplicazione 5 * 3 → 15

/ Divisione 5 / 3 → 1.666...

// Divisione intera 5 // 3 → 1

** Potenza 5 ** 3 → 125

% Modulo (resto della divisione) 5 % 3 → 2

Esempio di calcoli

a = 10 b = 3

print("Addizione:", a + b) # 13 print("Divisione intera:", a // b) # 3 print("Potenza:", a ** b) # 1000

Esercizi introduttivi

Ecco alcuni semplici esercizi per iniziare a programmare in Python:

  1. Stampare un messaggio: Scrivere un programma che stampi "Ciao, mondo!" utilizzando la funzione print().

Soluzione

print("Ciao, mondo!")

  1. Calcolo del perimetro e dell'area di un rettangolo: Dati base e altezza, calcolare perimetro e area.

Soluzione

base = 5 altezza = 3 perimetro = 2 * (base + altezza) area = base * altezza print("Perimetro:", perimetro) print("Area:", area)

  1. Scambio di valori tra due variabili: Scrivere un programma che scambi i valori di due variabili.

Soluzione

a = 10 b = 20

Scambio

temp = a a = b b = temp

print("Dopo lo scambio: a =", a, ", b =", b)

Input dall'utente

Python consente di leggere input dall'utente utilizzando la funzione input(). Esempio:

Richiedere l'età dell'utente

eta = int(input("Inserisci la tua età: ")) print("La tua età è:", eta)

Nota: input() restituisce sempre una stringa. Per convertire in un tipo diverso (ad esempio

int o float ), bisogna usare le funzioni di casting.

Capitolo 2: Liste, Cicli e Matrici

Liste in Python

Le liste sono una delle strutture dati più comuni in Python. Possono contenere elementi di tipi

diversi e la loro lunghezza può variare dinamicamente.

Operazioni di base sulle liste

Di seguito sono riportate alcune operazioni comuni sulle liste:

Creazione di una lista: Una lista può essere creata racchiudendo gli elementi tra parentesi quadre ( [] ). Aggiungere elementi: Usa il metodo append() per aggiungere un elemento alla fine della lista. Rimuovere elementi: Usa il metodo remove() per eliminare il primo elemento che corrisponde a un valore specifico.

Elementi dall'indice 1 (incluso) al 3 (escluso)

print(lista[1:3]) # Output: [20, 30]

Elementi dall'inizio al 3 (escluso)

print(lista[:3]) # Output: [10, 20, 30]

Elementi dall'indice 2 alla fine

print(lista[2:]) # Output: [30, 40, 50]

Lista inversa

print(lista[::-1]) # Output: [50, 40, 30, 20, 10]

Liste nidificate

Le liste possono contenere altre liste, creando così strutture nidificate utili per rappresentare

matrici o tabelle:

Lista nidificata

matrice = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]

Accesso agli elementi

print("Elemento nella prima riga, seconda colonna:", matrice[0][1]) # Output: 2

Cicli in Python

I cicli sono fondamentali per iterare su elementi di una sequenza o ripetere operazioni. I

principali tipi di cicli in Python sono:

Ciclo for : Itera attraverso ogni elemento di una sequenza. Ciclo while : Ripete un blocco di codice finché una condizione è vera.

Esempio: Ciclo for

Iterare su una lista

numeri = [1, 2, 3, 4, 5] for numero in numeri: print("Numero:", numero)

Esempio: Ciclo while

Usare un ciclo while

contatore = 5 while contatore > 0: print("Contatore:", contatore) contatore -= 1

Matrici in Python

Le matrici in Python possono essere rappresentate utilizzando liste di liste. Ogni sotto-lista

rappresenta una riga della matrice. Questo approccio è utile per creare e manipolare tabelle

di dati.

Creazione di una matrice

Una matrice può essere creata come segue:

Creazione di una matrice 3x

matrice = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]

Accesso agli elementi

print("Elemento in [0][0]:", matrice[0][0]) # Output: 1 print("Elemento in [2][1]:", matrice[2][1]) # Output: 8

Operazioni sulle matrici

Calcolo del numero di righe: len(matrice). Calcolo del numero di colonne: len(matrice[0]). Iterazione attraverso tutti gli elementi della matrice con cicli annidati.

Iterare attraverso una matrice

for riga in matrice: for elemento in riga: print(elemento, end=" ")

Capitolo 3: Funzioni

Introduzione alle funzioni

Le funzioni in Python sono blocchi di codice riutilizzabili che eseguono un'operazione

specifica. Una funzione viene definita usando la parola chiave def , seguita dal nome della

funzione, eventuali parametri tra parentesi e due punti.

Sintassi di base

def nome_funzione(parametro1, parametro2):

Corpo della funzione

risultato = parametro1 + parametro return risultato

Chiamata della funzione

somma = nome_funzione(5, 10) print("La somma è:", somma)

Struttura di una funzione

Ogni funzione in Python è composta da:

Nome: Identifica la funzione. Parametri: Valori di input che la funzione può utilizzare. Corpo: Contiene il codice che esegue l'operazione. Return: Restituisce il risultato della funzione (opzionale).

Esempio completo

def saluta(nome): """Restituisce un messaggio di saluto.""" return f"Ciao, {nome}!"

messaggio = saluta("Marco") print(messaggio)

Tipi di funzioni

Python supporta vari tipi di funzioni:

Funzioni predefinite: Fornite dalla libreria standard (es. print() , len() ). Funzioni definite dall'utente: Create dal programmatore. Funzioni anonime (lambda): Funzioni usa e getta definite in una sola riga.

Esempio di funzione lambda

Funzione lambda per calcolare il quadrato di un numero

quadrato = lambda x: x** print(quadrato(5)) # Output: 25

Ambito delle variabili

L'ambito di una variabile si riferisce alla porzione del programma in cui la variabile è

accessibile:

Variabili locali: Definite all'interno di una funzione e visibili solo all'interno di essa. Variabili globali: Definite al di fuori di tutte le funzioni e accessibili ovunque nel programma.

Esempio di variabili locali e globali

x = 10 # Variabile globale

def esempio(): x = 5 # Variabile locale print("Variabile locale:", x)

esempio() print("Variabile globale:", x)

Esercizi sulle funzioni

  1. Scrivere una funzione che calcoli l'area di un rettangolo.

Soluzione

def area_rettangolo(base, altezza): return base * altezza

def somma_n(n): if n == 0: # Caso base return 0 else: return n + somma_n(n - 1) # Chiamata ricorsiva

print(somma_n(10)) # Output: 55

  1. Serie di Fibonacci: Scrivere una funzione ricorsiva che calcoli l'N-esimo numero della serie di Fibonacci.

Soluzione

def fibonacci(n): if n == 0: # Caso base return 0 elif n == 1: return 1 else: return fibonacci(n - 1) + fibonacci(n - 2) # Chiamata ricorsiva

print(fibonacci(7)) # Output: 13

Capitolo 4: Ricorsione

Introduzione alla ricorsione

La ricorsione è una tecnica potente che permette di risolvere problemi complessi

suddividendoli in sottoproblemi più semplici. Si basa sull'idea che una funzione possa

chiamare sé stessa, risolvendo un piccolo pezzo del problema a ogni passo.

Vantaggi della ricorsione

Riduce la complessità del codice per problemi ripetitivi o basati su alberi. Permette di scrivere soluzioni concise per problemi come il percorso in un labirinto, algoritmi su grafi e altro.

Concetti chiave

Per utilizzare la ricorsione in modo efficace, è importante tenere a mente i seguenti concetti:

Caso base: Condizione che termina la ricorsione. Riduzione del problema: Ogni chiamata ricorsiva deve avvicinarsi al caso base.

Stack delle chiamate: Ogni chiamata ricorsiva viene memorizzata nello stack finché non si raggiunge il caso base.

Esempi di ricorsione

Calcolo del massimo comune divisore (MCD)

Utilizzando l'algoritmo di Euclide, il MCD di due numeri può essere calcolato in modo

ricorsivo.

def mcd(a, b): if b == 0: # Caso base return a else: return mcd(b, a % b) # Chiamata ricorsiva

print(mcd(48, 18)) # Output: 6

Verifica di una parola palindroma

Scrivere una funzione ricorsiva che verifichi se una parola è palindroma.

def is_palindroma(parola): if len(parola) <= 1: # Caso base return True elif parola[0] != parola[-1]: # Se i caratteri iniziali e finali non corrispondono return False else: return is_palindroma(parola[1:-1]) # Chiamata ricorsiva

print(is_palindroma("anna")) # Output: True print(is_palindroma("python")) # Output: False

Quando evitare la ricorsione

La ricorsione non è sempre la soluzione migliore. Può portare a errori di memoria o

inefficienza per problemi con un alto numero di chiamate ricorsive. In questi casi, è preferibile

utilizzare un approccio iterativo.

Esempio: Fattoriale iterativo

def ricerca_binaria(lista, elemento, inizio, fine): if inizio > fine: # Caso base: elemento non trovato return - else: medio = (inizio + fine) // 2 if lista[medio] == elemento: # Caso base: elemento trovato return medio elif lista[medio] > elemento: return ricerca_binaria(lista, elemento, inizio, medio - 1)

Cerca nella metà sinistra

else: return ricerca_binaria(lista, elemento, medio + 1, fine)

Cerca nella metà destra

Esempio di utilizzo

numeri = [1, 3, 5, 7, 9, 11] posizione = ricerca_binaria(numeri, 7, 0, len(numeri) - 1) if posizione != -1: print(f"Elemento trovato all'indice {posizione}") else: print("Elemento non trovato")

Ricorsione e gestione di alberi

La ricorsione è particolarmente utile per lavorare con strutture dati ad albero, come gli alberi

binari. Ad esempio, possiamo utilizzare la ricorsione per calcolare l'altezza di un albero

binario.

class Nodo: def init(self, valore): self.valore = valore self.sinistra = None self.destra = None

def altezza_albero(nodo): if nodo is None: # Caso base: albero vuoto return 0 else: altezza_sinistra = altezza_albero(nodo.sinistra) altezza_destra = altezza_albero(nodo.destra) return 1 + max(altezza_sinistra, altezza_destra)

Creazione di un albero binario

radice = Nodo(1) radice.sinistra = Nodo(2) radice.destra = Nodo(3) radice.sinistra.sinistra = Nodo(4) radice.sinistra.destra = Nodo(5)

print("Altezza dell'albero:", altezza_albero(radice)) # Output: 3

Capitolo 5: Esercizi e Approfondimenti

Esercizi sulle liste

Calcolo del massimo in una lista

Scrivere una funzione per trovare il massimo valore in una lista di numeri.

def massimo(lista): max_val = lista[0] for numero in lista: if numero > max_val: max_val = numero return max_val

Esempio

numeri = [4, 7, 2, 9, 5] print("Il massimo è:", massimo(numeri)) # Output: 9

Contare elementi duplicati consecutivi

Scrivere un programma che conti il numero di elementi duplicati consecutivi in una lista.

def conta_duplicati_consecutivi(lista): conta = 0 for i in range(1, len(lista)): if lista[i] == lista[i - 1]: conta += 1 return conta

Esempio

numeri = [1, 1, 2, 2, 2, 3, 4, 4]

Calcolare la somma dei divisori

Scrivere una funzione che calcoli la somma dei divisori di un numero intero.

def somma_divisori(n): somma = 0 for i in range(1, n + 1): if n % i == 0: somma += i return somma

Esempio

print(somma_divisori(12)) # Output: 28 (1 + 2 + 3 + 4 + 6 + 12)

Esercizi avanzati

Generazione di una matrice identità

Scrivere una funzione che generi una matrice identità di dimensione NxN.

def matrice_identita(n): matrice = [] for i in range(n): riga = [0] * n riga[i] = 1 matrice.append(riga) return matrice

Esempio

identita = matrice_identita(4) for riga in identita: print(riga)

Output:

[1, 0, 0, 0]

[0, 1, 0, 0]

[0, 0, 1, 0]

[0, 0, 0, 1]

Capitolo 6: Funzioni ricorsive, moduli e

generazione casuale

Introduzione alle funzioni ricorsive

Le funzioni ricorsive sono una parte essenziale della programmazione in Python. Esse

consentono a una funzione di chiamare sé stessa per risolvere problemi ripetuti o strutturati,

riducendo così la necessità di cicli complessi. Sono particolarmente utili in contesti come il

calcolo delle sequenze, l'elaborazione di strutture ad albero e la risoluzione di algoritmi

divide-et-impera.

Concetti chiave della ricorsione

Caso base: La condizione che termina la ricorsione per evitare loop infiniti. Chiamata ricorsiva: La funzione richiama sé stessa per risolvere una parte più piccola del problema.

Esempio: Calcolo del fattoriale

def fattoriale(n): if n == 0: # Caso base return 1 return n * fattoriale(n - 1) # Chiamata ricorsiva

print(fattoriale(5)) # Output: 120

Esercizi di ricorsione

Conteggio degli elementi in una lista

Scrivere una funzione ricorsiva che prenda in input una lista e un elemento x , restituendo il

numero di volte che x appare nella lista.

def conta_occ(lista, x): if not lista: # Caso base: lista vuota return 0 if lista[0] == x: return 1 + conta_occ(lista[1:], x) else: return conta_occ(lista[1:], x)