Torna ai corsi
AI036 Undergraduate

Programmazione in Python: Un'introduzione alla scienza dei computer

Questo è un manuale universitario introduttivo progettato per insegnare i principi fondamentali della scienza dei computer utilizzando Python come linguaggio di programmazione principale. Si concentra sulla risoluzione di problemi, sul design e sulla programmazione attraverso un modello di copertura a spirale e un approccio orientato ai grafici.

4.9
39.0h
793 studenti
0 mi piace
Intelligenza Artificiale
Inizia ad imparare

Panoramica del corso

📚 Riepilogo del contenuto

Questo è un libro di testo introduttivo per università, pensato per insegnare i principi fondamentali della scienza informatica utilizzando Python come linguaggio di programmazione principale. Si concentra sulla risoluzione di problemi, sul design e sulla programmazione attraverso un modello di copertura a spirale e un approccio orientato alle immagini.

Un'introduzione delicata e completa all'arte della scienza informatica attraverso l'ottica di Python.

Autore: John M. Zelle

Ringraziamenti: Guido van Rossum (prefazione), Jim Leisy, e colleghi accademici di Wartburg College e diverse università tra cui Owen Astrachan, Cay Horstmann e Nell Dale.

🎯 Obiettivi didattici

  1. Distinguere tra hardware/software e algoritmi/programmi.
  2. Spiegare come un interprete Python traduce il codice ad alto livello in istruzioni eseguibili tramite bytecode.
  3. Definire e invocare funzioni Python semplici usando parametri e argomenti.
  4. Elencare e descrivere le sei fasi del Processo di Sviluppo del Software.
  5. Applicare le regole sintattiche di Python per creare identificatori validi e espressioni matematiche con la precedenza degli operatori corretta.
  6. Distinguere tra i modelli variabili "Scatola" e "Post-it" e spiegare il processo di valutazione e assegnazione.
  7. Distinguere tra i tipi dati int e float e applicare conversioni di tipo esplicite.
  8. Implementare il modello dell'accumulatore per risolvere problemi matematici come i fattoriali.
  9. Utilizzare la libreria math di Python per risolvere equazioni algebriche, compresa la formula quadratica.
  10. Definire e applicare i concetti fondamentali dell'OO: oggetti, metodi, accessori, mutatori e aliasing.

🔹 Lezione 1: Introduzione alla scienza informatica e nozioni base di Python

Panoramica: Questa lezione introduce la scienza informatica come studio dei processi calcolabili, piuttosto che solo dello studio delle macchine fisiche. Gli studenti esploreranno il concetto della "Macchina Universale", dove il software fornisce la potenza per trasformare l'hardware in qualsiasi strumento immaginabile. La sessione si conclude con una presentazione tecnica delle nozioni di base di Python, inclusi l'esecuzione basata sull'interprete, la definizione di funzioni e la distinzione tra sintassi e semantica.

Risultati dell'apprendimento:

  • Distinguere tra hardware/software e algoritmi/programmi.
  • Spiegare come un interprete Python traduce il codice ad alto livello in istruzioni eseguibili tramite bytecode.
  • Definire e invocare funzioni Python semplici usando parametri e argomenti.

🔹 Lezione 2: Il processo di sviluppo del software e programmi semplici

Panoramica: Questa lezione presenta l'approccio sistematico alla creazione di software attraverso il processo di sviluppo in sei fasi e i concetti fondamentali della programmazione Python. Gli studenti esploreranno la sintassi di base, inclusi identificatori, espressioni e assegnazione, confrontando il modello variabile "Post-it" con i concetti tradizionali. La lezione si conclude con l'implementazione di cicli definiti usando la funzione range() per gestire calcoli ripetuti.

Risultati dell'apprendimento:

  • Elencare e descrivere le sei fasi del Processo di Sviluppo del Software.
  • Applicare le regole sintattiche di Python per creare identificatori validi ed espressioni matematiche con la precedenza degli operatori corretta.
  • Distinguere tra i modelli variabili "Scatola" e "Post-it" e spiegare il processo di valutazione e assegnazione.

🔹 Lezione 3: Rappresentazione dei dati numerici e libreria math

Panoramica: Questa lezione esplora come i computer rappresentano e manipolano i dati numerici, distinguendo tra numeri interi discreti (interi) e approssimazioni di numeri reali (floating-point). Gli studenti impareranno a eseguire calcoli complessi utilizzando gli operatori integrati di Python e la libreria math, comprendendo anche i limiti intrinseci della rappresentazione binaria e della precisione.

Risultati dell'apprendimento:

  • Distinguere tra i tipi dati int e float e applicare conversioni di tipo esplicite.
  • Implementare il modello dell'accumulatore per risolvere problemi matematici come i fattoriali.
  • Utilizzare la libreria math di Python per risolvere equazioni algebriche, compresa la formula quadratica.

🔹 Lezione 4: Grafica orientata agli oggetti e interfacce utente interattive

Panoramica: Questa lezione accompagna gli studenti dal programming basato su testo a Interfacce Utente Grafiche (GUI) utilizzando un approccio Orientato agli Oggetti (OO). Gli studenti impareranno a manipolare oggetti grafici (punti, linee, forme), gestire sistemi di coordinate e creare programmi interattivi che rispondono ai clic del mouse, ai colpi di tastiera e alle inserzioni di testo.

Risultati dell'apprendimento:

  • Definire e applicare i concetti fondamentali dell'OO: oggetti, metodi, accessori, mutatori e aliasing.
  • Creare e visualizzare oggetti grafici come Punti, Linee, Cerchi, Rettangoli, Ovale e Poligoni.
  • Implementare trasformazioni di coordinate e elementi interattivi (mouse/tastiera/caselle di input) per creare GUI funzionali.

🔹 Lezione 5: Sequenze: stringhe, liste e I/O file

Panoramica: Questa lezione esplora come la scienza informatica rappresenta e manipola sequenze di dati, concentrando l'attenzione specificamente su stringhe e liste. Gli studenti impareranno i meccanismi di indicizzazione e slicing, la differenza critica tra oggetti mutabili e immutabili e come interfacciarsi con dati esterni tramite elaborazione di file. Inoltre, la lezione tratta la codifica dei dati tramite Unicode e i principi fondamentali della crittografia usando cifrari semplici.

Risultati dell'apprendimento:

  • Eseguire manipolazioni avanzate di stringhe e liste usando indicizzazione, slicing e metodi incorporati (split, join, upper, lower).
  • Progettare e implementare algoritmi di codifica/decodifica e cifrari crittografici (Cesare e Sostituzione).
  • Sviluppare programmi batch che aprono, leggono, elaborano e chiudono file di dati esterni.

🔹 Lezione 6: Definizione di funzioni e ambito delle variabili

Panoramica: Questa lezione esplora il passaggio dalla scrittura di script monolitici alla creazione di programmi modulari tramite funzioni. Copre la sintassi per definire e chiamare funzioni, il meccanismo di passaggio di informazioni tramite parametri formali e reali, e come le funzioni comunicano i risultati indietro tramite valori di ritorno (inclusi valori multipli e l'oggetto None). Gli studenti impareranno anche l'ambito delle variabili — in particolare la differenza tra variabili locali e globali — e come le funzioni possano modificare parametri mutabili per influenzare lo stato del programma.

Risultati dell'apprendimento:

  • Dimostrare come definire e invocare funzioni per ridurre la duplicazione di codice e migliorare la struttura del programma.
  • Distinguere tra parametri formali e reali e spiegare il corrispondenza posizionale.
  • Implementare funzioni che restituiscono un singolo valore, più valori o predefinitamente l'oggetto None.

🔹 Lezione 7: Strutture di decisione e gestione delle eccezioni

Panoramica: Questa lezione introduce le strutture di decisione, che permettono ai programmi di eseguire sequenze di istruzioni diverse in base a condizioni specifiche. Gli studenti impareranno a formare espressioni booleane usando operatori relazionali, implementare decisioni semplici, doppie e multiple, e usare il nesting per logiche complesse. La lezione copre anche l'esecuzione modulare con la variabile __name__ e la gestione robusta degli errori tramite gestione delle eccezioni.

Risultati dell'apprendimento:

  • Implementare strutture di decisione semplici, doppie e multiple usando if, else e elif.
  • Costruire ed eseguire espressioni booleane usando operatori relazionali e ordinamento lessicografico per stringhe.
  • Applicare il pattern try-except per gestire errori in fase di esecuzione e prevenire arresti anomali del programma.

🔹 Lezione 8: Cicli indefiniti e logica booleana

Panoramica: Questa lezione passa dai cicli definiti ("contati") ai cicli indefiniti, che vengono eseguiti in base a condizioni invece che a una sequenza fissa. Gli studenti padroneggeranno l'istruzione while e vari schemi di progettazione per il trattamento dei dati, inclusi cicli interattivi, cicli sentinella e cicli basati su file. Inoltre, la lezione copre la logica booleana, fornendo gli strumenti algebrici necessari per costruire e semplificare strutture decisionali complesse nel codice.

Risultati dell'apprendimento:

  • Progettare e implementare cicli indefiniti usando l'istruzione while di Python.
  • Applicare schemi comuni di ciclo, inclusi cicli interattivi, cicli sentinella e il modello di lettura primaria.
  • Semplificare condizioni logiche complesse usando l’algebra booleana e le leggi di DeMorgan.

🔹 Lezione 9: Simulazione, progettazione e raffinamento progressivo

Panoramica: Questa lezione esplora il processo sistematico di sviluppo di programmi informatici complessi tramite progettazione top-down e raffinamento progressivo. Gli studenti impareranno a decomporre problemi complessi in "pezzi" gestibili usando astrazione e modularizzazione, a visualizzare gerarchie di programmi tramite diagrammi di struttura, e a implementare simulazioni usando tecniche Monte Carlo. Il curriculum include anche strategie di sviluppo iterativo come prototipazione e sviluppo a spirale, insieme a metodi di testing robusti come il testing unitario.

Risultati dell'apprendimento:

  • Decomporre un problema complesso in sottoproblemi più piccoli e risolvibili usando la progettazione top-down.
  • Costruire e interpretare diagrammi di struttura che illustrano il flusso di dati (parametri e valori di ritorno) tra moduli.
  • Applicare tecniche di simulazione Monte Carlo per modellare eventi probabilistici usando la libreria random di Python.

🔹 Lezione 10: Definizione di classi e programmazione basata su eventi

Panoramica: Questa lezione passa da un design procedurale basato su funzioni a un design basato su oggetti utilizzando classi Python. Gli studenti impareranno a incapsulare dati (variabili di istanza) e comportamenti (metodi) all'interno di un'unica entità, creare widget interattivi per l'interfaccia utente grafica (GUI), e gestire il flusso del programma tramite programmazione basata su eventi e loop di animazione sincronizzati.

Risultati dell'apprendimento:

  • Distinguere tra design basato su funzioni e design basato su oggetti.
  • Definire classi Python personalizzate usando costruttori (__init__), variabili di istanza e il parametro self.
  • Implementare incapsulamento e documentazione usando docstrings.

🔹 Lezione 11: Raccolte di dati: liste avanzate e dizionari

Panoramica: Questa lezione esplora tecniche avanzate di raccolta di dati in Python, concentrandosi sulla versatilità delle liste e dei dizionari. Gli studenti impareranno a distinguere le liste dalle tradizionali array, a eseguire operazioni complesse sulle liste come slicing e ordinamento di record, e a applicare mappature non sequenziali tramite dizionari. Il modulo si conclude con l'applicazione di queste strutture all'analisi statistica e a algoritmi classici come il Crivello di Eratostene.

Risultati dell'apprendimento:

  • Confrontare le liste dinamiche di Python con array fissi e omogenei.
  • Eseguire manipolazioni avanzate delle liste, incluse il slicing, eliminazione selettiva e ordinamento personalizzato di record oggetto.
  • Implementare algoritmi statistici (Media, Mediana, Deviazione Standard) e design tabellari usando raccolte.

🔹 Lezione 12: Principi di progettazione orientata agli oggetti (OOD)

Panoramica: Questa lezione esplora il passaggio dalla progettazione funzionale top-down alla progettazione orientata agli oggetti (OOD), un approccio centrato sui dati in cui i sistemi sono descritti come una collezione di "scatole nere" interagenti (oggetti). Gli studenti impareranno a identificare oggetti e metodi candidati, a implementare simulazioni multiclasse come Racquetball e Dice Poker, e a applicare i tre pilastri dell'OOP: Incapsulamento, Polimorfismo e Ereditarietà. La lezione culmina nella gestione di interazioni complesse con l'interfaccia utente grafica (GUI) tramite ereditarietà e sovrascrittura di metodi.

Risultati dell'apprendimento:

  • Identificare classi e metodi potenziali da un enunciato del problema analizzando sostantivi e verbi.
  • Implementare una simulazione complessa a più oggetti usando classi strutturate (es. Player, Game, Stats).
  • Distinguere e applicare i concetti fondamentali di incapsulamento, polimorfismo e ereditarietà.

🔹 Lezione 13: Progettazione di algoritmi, ricorsione e efficienza

Panoramica: Questa lezione esplora le tecniche fondamentali usate per risolvere problemi computazionali in modo efficiente. Copre strategie di ricerca, i meccanismi della risoluzione ricorsiva dei problemi (casi base e passi ricorsivi), e un confronto tra algoritmi di ordinamento come Selection Sort e Merge Sort per capire come il design dell'algoritmo influisce sulle prestazioni.

Risultati dell'apprendimento:

  • Confrontare e implementare strategie di ricerca lineare e binaria.
  • Progettare funzioni ricorsive usando casi base e passi ricorsivi per problemi come il rovesciamento di stringhe e l'esponenziazione veloce.
  • Analizzare i compromessi di prestazione tra ricorsione e iterazione e tra diversi algoritmi di ordinamento (n^2 vs. n \log n).