Capitolo 1 Introduzione 1.1 Due concetti fondamentali: algoritmi ed elaborazione 1.1.1 Algoritmi 1.1.2 Elaborazione delle informazioni ESERCIZI 1.1 1.2 La struttura di un moderno elaboratore 1.2.1 Hardware di un calcolatore 1.2.2 Software di un calcolatore ESERCIZI 1.2 1.3 La lunga storia dei sistemi di calcolo 1.3.1 Prima dei calcolatori elettronici digitali 1.3.2 Persone usate come computer (1940-1945) 1.3.3 I primi calcolatori elettronici digitali (1940-1950) 1.3.4 I primi linguaggi di programmazione (1950-1965) 1.3.5 Circuiti integrati, interazione, time-sharing e ingegneria del software (1965-1975) 1.3.6 Personal computer e reti (1975-1990) 1.3.7 Consultazione, comunicazione e commercio elettronico (1990-2000) 1.3.8 Applicazioni in mobilità ed elaborazione diffusa (dal 2000 ad oggi) 1.4 Introduzione alla programmazione in Python 1.4.1 Eseguire codice nella shell interattiva 1.4.2 Dati: input, elaborazione, output 1.4.3 Scrivere, salvare ed eseguire un programma 1.4.4 Dietro le quinte: come funziona Python ESERCIZI 1.3 1.4.5 Individuare e correggere gli errori di sintassi Riepilogo Domande di riepilogo Esercizi di programmazione Esercizio di debugging Capitolo 2 Sviluppo del software, espressioni e tipi di dati 2.1 Il processo di sviluppo del software ESERCIZI 2.1 CASO DI STUDIO 2.1 Calcolo delle tasse sul reddito 2.2 Stringhe, assegnamenti e commenti 2.2.1 Tipi di dati 2.2.2 Letterali di tipo stringa 2.2.3 Sequenze di escape 2.2.4 Concatenazione di stringhe 2.2.5 Variabili e assegnazione 2.2.6 Commenti dei programmi e docstring ESERCIZI 2.2 2.3 Tipi di dati numerici e insiemi di caratteri 2.3.1 Numeri interi 2.3.2 Numeri in virgola mobile 2.3.3 Insiemi di caratteri ESERCIZI 2.3 2.4 Espressioni 2.4.1 Espressioni aritmetiche 2.4.2 Aritmetica con tipi misti e conversioni di tipo ESERCIZI 2.4 2.5 Usare funzioni e moduli 2.5.1 Invocare funzioni: argomenti ricevuti e valori restituiti 2.5.2 Il modulo math 2.5.3 Il modulo principale 2.5.4 L’impaginazione e la struttura di un programma 2.5.5 L’esecuzione di uno script dal prompt dei comandi ESERCIZI 2.5 Riepilogo Domande di riepilogo Esercizi di programmazione Esercizio di debugging Capitolo 3 Istruzioni di iterazione e selezione 3.1 Iterazione definita: il ciclo for 3.1.1 Esecuzione di un enunciato per un numero predeterminato di volte 3.1.2 Ciclo controllato da contatore 3.1.3 Assegnazione abbreviata 3.1.4 Errori nei cicli: l’errore per scarto di uno 3.1.5 Scansione del contenuto di una sequenza di dati 3.1.6 Indicazione del passo nell’intervallo 3.1.7 Cicli che contano a ritroso ESERCIZI 3.1 3.2 Comporre il testo da visualizzare ESERCIZI 3.2 CASO DI STUDIO 3.1 Un rendiconto d’investimento 3.3 Selezione: enunciati if e if-else 3.3.1 Il tipo booleano: espressioni booleane e confronti 3.3.2 Enunciati if-else 3.3.3 Enunciati di selezione a una sola via 3.3.4 Enunciati if a molte vie 3.3.5 Operatori logici ed espressioni booleane complesse 3.3.6 Valutazione in cortocircuito 3.3.7 Collaudo di enunciati di selezione ESERCIZI 3.3 3.4 Iterazione condizionale: il ciclo while 3.4.1 La struttura e il comportamento di un ciclo while 3.4.2 Ciclo while a contatore 3.4.3 Il ciclo while True e l’enunciato break 3.4.4 Numeri casuali 3.4.5 Logica dei cicli: errori e collaudo ESERCIZI 3.4 CASO DI STUDIO 3.2 Approssimazione della radice quadrata Programmazione robusta Riepilogo Domande di riepilogo Esercizi di programmazione Esercizio di debugging Capitolo 4 Stringhe e file di testo 4.1 Accesso a caratteri e sottostringhe all’interno di stringhe 4.1.1 La struttura delle stringhe 4.1.2 L’operatore indice 4.1.3 Estrarre sottostringhe 4.1.4 Verificare la presenza di una sottostringa con in ESERCIZI 4.1 4.2 Crittografia dei dati ESERCIZI 4.2 4.3 Stringhe e sistemi numerici 4.3.1 Il sistema posizionale per la rappresentazione dei numeri 4.3.2 Conversione da sistema binario a decimale 4.3.3 Conversione da sistema decimale a binario 4.3.4 Scorciatoie per convertire numeri 4.3.5 Numeri ottali ed esadecimali ESERCIZI 4.3 4.4 Metodi per l’elaborazione di stringhe ESERCIZI 4.4 4.5 File di testo 4.5.1 I file di testo e il loro formato 4.5.2 Scrivere testo in un file 4.5.3 Scrivere numeri in un file 4.5.4 Leggere testo da un file 4.5.5 Leggere numeri da un file 4.5.6 Manipolare file e cartelle di un disco ESERCIZI 4.5 CASO DI STUDIO 4.1 Analisi di un testo Programmazione robusta Riepilogo Domande di riepilogo Esercizi di programmazione Esercizio di debugging Capitolo 5 Liste e dizionari 5.1 Liste 5.1.1 Letterali di tipo lista e operatori elementari 5.1.2 Sostituzione di un elemento in una lista 5.1.3 Metodi di lista per inserimento e rimozione di elementi 5.1.4 Ricerche in una lista 5.1.5 Ordinamento di una lista 5.1.6 Metodi modificatori e il valore None 5.1.7 Effetti collaterali e alias 5.1.8 Uguaglianza: oggetti identici e oggetti equivalenti 5.1.9 Esempio: trovare la mediana di un insieme di numeri 5.1.10 Tuple ESERCIZI 5.1 5.2 Definizione di funzioni semplici 5.2.1 Sintassi per la definizione di funzioni semplici 5.2.2 Parametri e argomenti 5.2.3 L’enunciato return 5.2.4 Funzioni booleane 5.2.5 Definizione di una funzione main ESERCIZI 5.2 CASO DI STUDIO 5.1 Generazione di frasi 5.3 Dizionari 5.3.1 Valori letterali di tipo dizionario 5.3.2 Aggiunta di chiavi e sostituzione di valori 5.3.3 Ispezione di valori 5.3.4 Eliminazione di chiavi 5.3.5 Ispezione dell’intero contenuto di un dizionario 5.3.6 Esempio: conversione da esadecimale a binario 5.3.7 Esempio: trovare la moda di un elenco di valori ESERCIZI 5.3 CASO DI STUDIO 5.2 Psicoterapia non direttiva Programmazione robusta Riepilogo Domande di riepilogo Esercizi di programmazione Esercizio di debugging Capitolo 6 Progettare con le funzioni 6.1 Un rapido riassunto: cosa sono le funzioni e come operano 6.1.1 Funzioni come meccanismo di astrazione 6.1.2 Usare funzioni per eliminare la ridondanza 6.1.3 Usare funzioni per nascondere la complessità 6.1.4 Usare funzioni per metodi generali con variazioni sistematiche 6.1.5 Usare funzioni per suddividere i compiti ESERCIZI 6.1 6.2 Soluzione di problemi con la progettazione top-down 6.2.1 Il progetto del programma di analisi del testo 6.2.2 Il progetto del programma generatore di frasi 6.2.3 Il progetto del programma simulatore di terapeuta ESERCIZI 6.2 CASO DI STUDIO 6.1 Riconoscimento di frasi 6.3 Gestione dello spazio dei nomi di un programma 6.3.1 Variabili di modulo, parametri e variabili temporanee 6.3.2 Ambito di visibilità 6.3.3 Durata 6.3.4 Argomenti predefiniti e facoltativi ESERCIZI 6.3 Programmazione robusta Riepilogo Domande di riepilogo Esercizi di programmazione Esercizio di debugging Capitolo 7 Progettare con la ricorsione 7.1 Progettazione di funzioni ricorsive 7.1.1 Definizione di una funzione ricorsiva 7.1.2 Algoritmi ricorsivi 7.1.3 Analisi del funzionamento di una funzione ricorsiva 7.1.4 Definizioni ricorsive e funzioni ricorsive 7.1.5 Ricorsione nelle strutture sintattiche 7.1.6 Ricorsione infinita 7.1.7 Costi e benefici della ricorsione ESERCIZI 7.1 CASO DI STUDIO 7.1: Informazioni su un file system 7.2 Funzioni di ordine superiore 7.2.1 Le funzioni come dati 7.2.2 Mappatura 7.2.3 Filtraggio 7.2.4 Riduzione 7.2.5 Creare funzioni anonime usando lambda 7.2.6 Creare tabelle di salti ESERCIZI 7.2 Programmazione robusta Riepilogo Domande di riepilogo Esercizi di programmazione Esercizio di debugging Capitolo 8 Elaborazione d’immagini e grafica 8.1 Grafica semplificata 8.1.1 Panoramica della Turtle graphics 8.1.2 Operazioni della Turtle graphics 8.1.3 Preparazione del file turtle.cfg ed esecuzione in IDLE 8.1.4 Creazione di oggetti e il modulo turtle 8.1.5 Disegno di forme bidimensionali 8.1.6 Ispezione degli attributi di un oggetto 8.1.7 Modifiche allo schermo di una tartaruga 8.1.8 Una passeggiata casuale 8.1.9 Colori nel sistema RGB 8.1.10 Esempio: colorazione casuale di uno schema radiale ESERCIZI 8.1 CASO DI STUDIO 8.1: Schemi ricorsivi nei frattali 8.2 Elaborazione d’immagini 8.2.1 Informazioni analogiche e digitali 8.2.2 Campionamento e digitalizzazione delle immagini 8.2.3 Formati per i file contenenti immagini 8.2.4 Operazioni di manipolazione di immagini 8.2.5 Proprietà delle immagini 8.2.6 Il modulo images 8.2.7 Uno schema iterativo per scandire una griglia 8.2.8 Ancora sulle tuple 8.2.9 Convertire un’immagine in bianco e nero 8.2.10 Convertire un’immagine in toni di grigio 8.2.11 Copiare un’immagine 8.2.12 Sfuocare un’immagine 8.2.13 Individuare i contorni in un’immagine 8.2.14 Ridurre le dimensioni di un’immagine ESERCIZI 8.2 Programmazione robusta Riepilogo Domande di riepilogo Esercizi di programmazione Esercizio di debugging Capitolo 9 Interfacce grafiche per l’utente 9.1 Il comportamento di GUI e terminali 9.1.1 Versione basata su terminale 9.1.2 Versione basata su GUI 9.1.3 Programmazione guidata da eventi ESERCIZI 9.1 9.2 Scrivere semplici programmi basati su GUI 9.2.1 Un semplice programma “Hello World!” 9.2.2 Uno schema per tutti i programmi con GUI 9.2.3 La sintassi delle definizioni di classi e metodi 9.2.4 Ereditarietà e sottoclassi come meccanismi di astrazione ESERCIZI 9.2 9.3 Finestre e loro componenti 9.3.1 Finestre e loro attributi 9.3.2 Disposizione dei componenti nella finestra 9.3.3 Tipi di componenti e loro attributi 9.3.4 Visualizzare immagini ESERCIZI 9.3 9.4 Pulsanti di comando e risposte agli eventi ESERCIZI 9.4 9.5 Campi con voci: input e output 9.5.1 Campi di testo 9.5.2 Campi per dati numerici interi o in virgola mobile ESERCIZI 9.5 9.6 Definizione e utilizzo di variabili di esemplare ESERCIZI 9.6 CASO DI STUDIO 9.1: Di nuovo sui numeri da indovinare Programmazione robusta 9.7 Altre risorse utili per una GUI 9.7.1 Cornici annidate per organizzare componenti 9.7.2 Zone di testo con più righe 9.7.3 Finestre di dialogo per la selezione di file 9.7.4 Acquisire dati con un riquadro di richiesta 9.7.5 Caselle di selezione 9.7.6 Pulsanti radio 9.7.7 Eventi relativi alla tastiera 9.7.8 Lavorare con i colori 9.7.9 Un selettore di colori Riepilogo Domande di riepilogo Esercizi di programmazione Esercizio di debugging Capitolo 10 Progettare con le classi 10.1 Oggetti e classi in dettaglio 10.1.1 Un primo esempio: la classe Student 10.1.2 Stringhe di documentazione (docstring) 10.1.3 Definizioni di metodi 10.1.4 Il metodo init e le variabili di esemplare 10.1.5 Il metodo str 10.1.6 Metodi di ispezione e metodi modificatori 10.1.7 Il periodo di vita degli oggetti 10.1.8 Regole pratiche per la definizione di classi semplici ESERCIZI 10.1 CASO DI STUDIO 10.1: Il gioco dei dadi (game of craps) 10.2 Esempi di modelli di dati 10.2.1 Numeri razionali 10.2.2 Aritmetica razionale e sovraccarico di operatori 10.2.3 Metodi di confronto 10.2.4 Uguaglianza e il metodo eq 10.2.5 Il metodo repr per visualizzare un oggetto in IDLE 10.2.6 Conti bancari di risparmio e variabili di classe 10.2.7 Conti bancari e banca 10.2.8 Usare pickle per l’archiviazione permanente di oggetti 10.2.9 Acquisizione di oggetti e uso di try-except 10.2.10 Giocare a carte ESERCIZI 10.2 CASO DI STUDIO 10.2: Sportello bancario automatizzato 10.3 Progetto di una nuova struttura: griglia bidimensionale 10.3.1 L’interfaccia della classe Grid 10.3.2 L’implementazione di Grid: variabili di esemplare 10.3.3 L’implementazione di Grid: ricerca e indici ESERCIZI 10.3 CASO DI STUDIO 10.3: Cifratura a blocchi 10.4 Ereditarietà e polimorfismo 10.4.1 Modelli e gerarchie di ereditarietà 10.4.2 Esempio 1: un conto bancario vincolato 10.4.3 Esempio 2: giocatore e mazziere nel Blackjack 10.4.4 Metodi polimorfici 10.4.5 Costi e benefici della programmazione orientata agli oggetti ESERCIZI 10.4 Programmazione robusta Riepilogo Domande di riepilogo Esercizi di programmazione Esercizio di debugging Capitolo 11 Analisi e visualizzazione di dati 11.1 Alcune funzioni basilari per analizzare un insieme di dati 11.1.1 Calcolare il valore massimo, minimo e medio 11.1.2 Calcolare il valore mediano 11.1.3 Calcolare la moda e le mode 11.1.4 Calcolare la deviazione standard 11.1.5 Usare la libreria NumPy ESERCIZI 11.1 CASO DI STUDIO 11.1: Analisi dei punteggi di studenti 11.2 Visualizzazione di un insieme di dati 11.2.1 Diagrammi a torta 11.2.2 Diagrammi a barre 11.2.3 Grafici di dispersione 11.2.4 Grafici a segmenti 11.2.5 Istogrammi ESERCIZI 11.2 11.3 Elaborare insiemi di dati più complessi 11.3.1 Creare un insieme di dati con pandas 11.3.2 Visualizzare dati con pandas e matplotlib.pyplot 11.3.3 Accedere a colonne e righe in un data frame 11.3.4 Creare un data frame a partire da un file CSV 11.3.5 Ripulire i dati in un data frame 11.3.6 Ispezionare altri attributi di un data frame ESERCIZI 11.3 CASO DI STUDIO 11.2: Analisi di statistiche di pallacanestro Programmazione robusta Riepilogo del capitolo Domande di riepilogo Esercizi di programmazione Capitolo 12 Programmazione di rete, multithreading e client/server 12.1 Thread e processi 12.1.1 Thread 12.1.2 Thread dormienti (sleeping) 12.1.3 Produttore, consumatore e sincronizzazione ESERCIZI 12.1 12.2 Il problema dei lettori e degli scrittori 12.2.1 Utilizzo della classe SharedCell 12.2.2 Implementazione dell’interfaccia della classe SharedCell 12.2.3 Implementazione dei metodi ausiliari della classe SharedCell 12.2.4 Collaudo della classe SharedCell usando un contatore 12.2.5 Definizione di una classe thread-safe ESERCIZI 12.2 12.3 Reti, client e server 12.3.1 Indirizzi IP 12.3.2 Porte, server e client 12.3.3 I socket e un client day/time 12.3.4 Un server day/time 12.3.5 Uno script per una chat bidirezionale 12.3.6 Gestione di più client contemporanei ESERCIZI 12.3 CASO DI STUDIO 12.1: Gestione di una conversazione medico/pazienti Programmazione robusta Riepilogo Domande di riepilogo Esercizi di programmazione Esercizio di debugging Capitolo 13 Ricerca, ordinamento e analisi di complessità 13.1 Misurare l’efficienza degli algoritmi 13.1.1 Misurare il tempo d’esecuzione di un algoritmo 13.1.2 Contare le istruzioni ESERCIZI 13.1 13.2 Analisi di complessità 13.2.1 Ordini di complessità 13.2.2 Notazione O-grande 13.2.3 Il ruolo della costante di proporzionalità 13.2.4 Misurare la memoria impegnata da un algoritmo ESERCIZI 13.2 13.3 Algoritmi di ricerca 13.3.1 Ricerca del valore minimo 13.3.2 Ricerca sequenziale in una lista 13.3.3 Prestazioni nel caso ottimo, pessimo e medio 13.3.4 Ricerca binaria in una lista ESERCIZI 13.3 13.4 Algoritmi di ordinamento elementari 13.4.1 Ordinamento per selezione 13.4.2 Ordinamento a bolle 13.4.3 Ordinamento per inserimento 13.4.4 Ancora sulle prestazioni nel caso ottimo, pessimo e medio ESERCIZI 13.4 13.5 Ordinare più velocemente 13.5.1 Quicksort 13.5.2 Mergesort ESERCIZI 13.5 13.6 Un algoritmo esponenziale: la ricorsione di Fibonacci 13.7 Un algoritmo lineare per Fibonacci CASO DI STUDIO 13.1: Un analizzatore del profilo di algoritmi Riepilogo Domande di riepilogo Esercizi di programmazione Appendice A.1 Risorse per programmare in Python A.1.1 Installazione di Python su un computer A.1.2 Shell, IDLE e altri IDE A.2 Le librerie images e breezypythongui A.3 La API per l’elaborazione d’immagini A.4 Transizione da Python a Java e C++ Glossario Indice analitico |