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


Appunti di Computer Science - Python (secondo parziale), Appunti di Elementi di Informatica

Gli appunti includono le spiegazioni fatte in aula dal professore integrati con le slides da lui caricate

Tipologia: Appunti

2020/2021

In vendita dal 13/09/2022

sara_benve
sara_benve 🇮🇹

6 documenti

1 / 28

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
COMPUTER SCIENCE SECONDO PARZIALE
Programmazione = istruire una macchina su come realizzare un certo compito o risolvere un certo
problema il programmatore deve avere una serie di competenze tecniche (conoscere il linguaggio
di programmazione) e non (pensiero computazionale e creativo, problem solving)
Importante è la schematizzazione e definisco input e output (cosa voglio e cosa otterrò), poi definisco
l’algoritmo…
Requisito = descrizione di una funzionalità software che deve essere sviluppata
Modello = rappresentazione di tutte le entità e relazioni tra le entità per ogni requisito
L’algoritmo = processo che permette di risolvere un problema attraverso un numero finito
di semplici passi (es preparazione di una torta) approccio top-down: da problema grande
a problema piccolo
Rappresentazione dei dati di un computer
La CPU e la memoria possono eseguire solo semplici operazioni per gestire i dati in formato
macchina. I dati sono rappresentati mediante Notazione Binaria (0 e 1) = linguaggio macchina
Linguaggio macchina = negli anni ’50 i programmi erano scritti in 0 e 1, le istruzioni erano lunghe
sequenze di bit (numeri binari) che corrispondevano a semplici operazioni.
Il linguaggio di programmazione è un linguaggio formale che permette di specificare delle istruzioni
comprensibili a un calcolatore diversi linguaggi con diverse sintassi, ma eseguono stesse
funzionalità e condividono stesse logiche. I linguaggi di programmazione permettono comunicazione
uomo-macchina.
Programma software = sequenza di istruzioni attraverso la quale un calcolatore esegue
un’elaborazione (es. equazione polinomiale, app mobili, veicoli a guida autonoma, …). Il calcolatore
riceve degli input (da tastiera o file) e restituisce degli output (a monitor, su file, via rete) attraverso
operazioni matematiche, condizionali e cicli problema complesso viene scomposto in semplici che
possono essere eseguite con operazioni base, il programma può andare da poche lines of code
(LOCs) a milioni/miliardi.
I linguaggi di programmazione si sono evoluti partendo da linguaggio macchina (0/1) fino a linguaggi
molto vicini a quello naturale (es. Java, C, Python…) ma anche quelli più complessi devono essere
tradotti in linguaggio macchina per essere compresi, due modi:
Compilazione = traduzione dell’intero programma prima che venga eseguito
Interpretazione = traduzione ed esecuzione immediata di singole istruzioni
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c

Anteprima parziale del testo

Scarica Appunti di Computer Science - Python (secondo parziale) e più Appunti in PDF di Elementi di Informatica solo su Docsity!

COMPUTER SCIENCE – SECONDO PARZIALE

Programmazione = istruire una macchina su come realizzare un certo compito o risolvere un certo problema → il programmatore deve avere una serie di competenze tecniche (conoscere il linguaggio di programmazione) e non (pensiero computazionale e creativo, problem solving) Importante è la schematizzazione e definisco input e output (cosa voglio e cosa otterrò), poi definisco l’algoritmo…

  • Requisito = descrizione di una funzionalità software che deve essere sviluppata
  • Modello = rappresentazione di tutte le entità e relazioni tra le entità per ogni requisito
  • L’algoritmo = processo che permette di risolvere un problema attraverso un numero finito di semplici passi (es preparazione di una torta) → approccio top-down: da problema grande a problema piccolo Rappresentazione dei dati di un computer La CPU e la memoria possono eseguire solo semplici operazioni per gestire i dati in formato macchina. I dati sono rappresentati mediante Notazione Binaria (0 e 1) = linguaggio macchina Linguaggio macchina = negli anni ’50 i programmi erano scritti in 0 e 1, le istruzioni erano lunghe sequenze di bit (numeri binari) che corrispondevano a semplici operazioni. Il linguaggio di programmazione è un linguaggio formale che permette di specificare delle istruzioni comprensibili a un calcolatore → diversi linguaggi con diverse sintassi, ma eseguono stesse funzionalità e condividono stesse logiche. I linguaggi di programmazione permettono comunicazione uomo-macchina. Programma software = sequenza di istruzioni attraverso la quale un calcolatore esegue un’elaborazione (es. equazione polinomiale, app mobili, veicoli a guida autonoma, …). Il calcolatore riceve degli input (da tastiera o file) e restituisce degli output (a monitor, su file, via rete) attraverso operazioni matematiche, condizionali e cicli→ problema complesso viene scomposto in semplici che possono essere eseguite con operazioni base, il programma può andare da poche lines of code ( LOCs ) a milioni/miliardi. I linguaggi di programmazione si sono evoluti partendo da linguaggio macchina (0/1) fino a linguaggi molto vicini a quello naturale (es. Java, C, Python…)→ ma anche quelli più complessi devono essere tradotti in linguaggio macchina per essere compresi, due modi:
  • Compilazione = traduzione dell’intero programma prima che venga eseguito
  • Interpretazione = traduzione ed esecuzione immediata di singole istruzioni

Phyton Linguaggio di programmazione di alto livello interpretato, interattivo e orientato agli oggetti, è stato ideato nel 1989 e rilasciato nel 1991 con l’obiettivo di correggere i difetti presenti negli altri linguaggi e prenderne i punti di forza → è linguaggio open source e viene costantemente migliorato dalla community di sviluppatori e ampliato con moltissime librerie. Principalmente si usa per lo sviluppo web, l’analisi dei dati e lo scripting ma anche in contesti di machine learning, computer vision (e.g. face detection), robotica, sviluppo di giochi, analisi pagine web, e sviluppo di GUI → Python può essere usato per creare prototipi di applicazioni, che poi possono essere ri-sviluppati professionalmente tramite l’uso di linguaggi più complessi o specifici IDLE (Integrated Development…) è l’ambiente di programmazione di Python che include due componenti:

  • la shell (o interprete, o console), che si usa in modalità interattiva (o “a riga di comando”)
  • l’editor che si usa in modalità script Operatori matematici Nelle espressioni matematiche vengono eseguite prima le operazioni racchiuse tra parentesi e successivamente viene applicato prima l’operatore con la precedenza più alta e precisamente:
  • Elevamento a potenza
  • Moltiplicazione e divisione
  • Addizione e sottrazione PEMDAS (Parentesi, Elevamento a potenza, Moltiplicazione, Divisione, Addizione, Sottrazione)→ i numeri in Python vengono espressi con notazione anglosassone Funzioni built-in = sono funzioni predefinite, esistenti nell’installazione standard, le prime che vediamo sono: help, print, format, input → nomef(arg1,arg2, …) Funzione help = serve per capire l’intera sintassi, es. help(print) ci informa sulla sintassi della funzione print.

Le variabili = concetto fondamentale in tutti i linguaggi.

  • È un nome che rappresenta un valore nella memoria del computer
  • Per creare una variabile e fare in modo che faccia riferimento a un dato si utilizza un’istruzione di assegnazione
  • Il segno = prende il nome di operatore di assegnazione Il nome della variabile è sempre a sinistra e a destra ho il nome che gli assegno (numero o stringa). Posso riassegnare un altro valore alla variabile (variabili possono referenziare diversi valori) = assegnazione → riassegnazione (= operazione di sostituzione di un valore con un altro). Per aggiornare (=riassegnare) una variabile è fondamentale inizializzarla (cioè assegnarla) → es. scrivo varx=10, varx=varx + 10 e quindi la variabile aggiornata sarà 20 I nomi delle variabili:
  • devono essere brevi e significativi
  • devono iniziare con una lettera o con il carattere underscore (_), a cui far
  • seguire lettere, numeri o underscore
  • non possono contenere spazi o caratteri speciali, per esempio @, &, $, €, §
  • non possono essere costituiti da keyword riservate di Python, per esempio: true, not, or, return, while, and, if o nomi di funzioni
  • È preferibile non usare caratteri accentati N.B. Python è un linguaggio case-sensitive , che distingue tra nomi di variabili composti da caratteri minuscoli e maiuscoli Python permette l’assegnazione multipla di variabili (detta anche spacchettamento o unpacking), che permette di agire su più variabili direttamente sulla stessa riga di codice (es. a,b,z =1,2,3) Le variabili assumono grande utilità quando vengono utilizzate come argomenti di funzioni→ in questo caso, il nome della variabile non va racchiuso tra virgolette, altrimenti viene interpretato come una semplice stringa Tipi di dati Nel momento in cui si assegna un dato valore a una variabile, essa viene tipizzata, ovvero assume un certo tipo di dati a seconda del valore assegnato
  • Il tipo di dati determina il comportamento di alcune operazioni, mentre altre possono essere svolte solo su valori di un tipo di dati specifico
  • Per conoscere a quale tipo di dato appartiene un valore è possibile utilizzare la funzione type

Tre tipi di funzioni per i dati Dopo che a una variabile è stato assegnato un dato di un determinato tipo, è possibile riassegnarle un dato di un altro tipo. La tipizzazione in Python è dinamica → se ho assegnato a una variabile ad es. la funzione print(102/2), come type esce ‘NoneType’ perché la funzione print non restituisce niente

  • Funzione int = converte una stringa in un numero intero
  • Funzione float = converte in numero a virgola mobile
  • Funzione str = converte in stringa NB= se la conversione è impossibile, va in errore. Es.: int ('Python'), la funzione int non arrotonda la parte decimale, ma la tronca La funzione print serve a mostrare qualcosa ma non lo memorizza, se voglio memorizzarlo gli assegno una variabile Funzione input = chiede all’utente l’inserimento di un dato (un input, appunto), una volta che l’utente ha digitato un valore e premuto il tasto Invio, legge il dato immesso da tastiera e restituisce questo dato al programma come stringa = può servire per assegnare un valore a una variabile Conversione da input = se vogliamo che input restituisca un dato di tipo diverso dobbiamo usare la funzione di conversione Formattazione dei numeri = la funzione format permette di formattare i numeri, restituendo una stringa. Ha due argomenti: il numero da formattare e lo specificatore di formato: format (value, 'format_spec') Esempi:

format(10000/7, '.2f') '1428.57' format(10000/7, ',.2f') '1,428.57'

Vi sono diversi tipi di strutture decisionali:

  • Struttura decisionale semplice (o esecuzione condizionale o ad alternativa singola)
  • Esecuzione alternativa (o ad alternativa doppia)
  • Condizioni in serie Le strutture decisionali vengono implementate nel codice per mezzo di istruzioni condizionali. In Python le istruzioni condizionali sono if, else ed elif. In Python, per scrivere una struttura decisionale si usa l’istruzione if. Nel caso di una struttura ad alternativa singola, la sintassi sarà → indentatura = istruzioni spostate verso destra Se la condizione è falsa, il blocco di istruzioni viene saltato e il programma prosegue Espressioni booleane
  • Le condizioni dell’istruzione if vengono implementate per mezzo di espressioni booleane, ovvero espressioni che possono essere vere o false
  • Utilizzano gli operatori di confronto (<, > ecc.) e restituiscono True se sono vere, altrimenti False
  • True e False sono valori speciali di tipo bool, e vanno scritti con l’iniziale maiuscola. NON sono delle stringhe! Operatori di confronto

NB = l’uguale (=) si usa per assegnare una variabile non per dire che qualcosa è uguale a qualcos’altro (==) Esempio Istruzioni if-else L’istruzione if-else permette di scrivere una struttura decisionale ad alternativa doppia, che prevede due possibili percorsi di esecuzione (ramificazioni), a seconda che la condizione sia vera o falsa. La forma generale dell’istruzione if-else è la seguente: Esempio

no parentesi nelle istruzioni if, elif… Istruzione if con in Il test della funzione if può effettuare il confronto anche con un elenco di valori o con un intervallo → per utilizzare una lista di valori è necessaria la parola chiave in Per utilizzare un intervallo di valori è necessaria la funzione range. Sintassi: range(start, stop [, step])****. La funzione range restituisce un oggetto che produce una sequenza di numeri interi, compresi tra il valore minimo start (incluso) e il valore massimo stop (escluso), con incrementi corrispondenti a step Quando start viene omesso, il valore minimo predefinito è 0 Quando step viene specificato indica l’incremento o decremento Esempio Costrutti iterativi Si dice iterazione (o “giro”) la capacità di eseguire ripetutamente uno stesso blocco di istruzioni: proprietà fondamentale dei linguaggi di programmazione, che viene implementata attraverso costrutti chiamati cicli (loop) Esistono due categorie di cicli: quelli controllati da una condizione e quelli controllati da un contatore. In maniera simile a molti altri linguaggi, i costrutti iterativi principali in Python sono i cicli while e for → esegui questo blocco di istruzioni ogni volta che si avvera una condizione oppure fino a quando non te lo dico io (contatore) Ciclo while = l’istruzione while permette di creare un ciclo controllato da una condizione

Lezione 12 Obbiettivi = Imparare a creare funzioni personalizzate e gestire le eccezioni Le funzioni in Python In Python esistono molte funzioni immediatamente disponibili, chiamate funzioni built-in come per esempio print, input, str, int e float → molte altre funzioni sono disponibili nei moduli della libreria standard di Python, come math e random , o nelle librerie aggiuntive di terze parti. Oltre a queste funzioni è possibile anche creare funzioni personalizzate per svolgere compiti e operazioni in base alle proprie esigenze L = Una funzione è un gruppo di istruzioni a cui viene assegnato un nome che, all’interno di un programma, svolge un compito specifico

  • Le funzioni possono svolgere compiti di qualsiasi tipo: eseguire un calcolo, svolgere un’azione, creare un oggetto, aggiornare valori ecc.
  • Oltre a svolgere calcoli o compiere azioni, le funzioni sono importanti perché favoriscono la creazione di un programma modulare Creare funzioni personalizzate : una funzione ha due componenti:
  • Intestazione
  • Corpo L’intestazione : ogni componente dell’intestazione delle funzioni ha un compito preciso Il corpo delle funzioni contiene un elenco di istruzioni (chiamato blocco):
  • tutte le istruzioni e l’istruzione return devono essere indentate
  • termina con l’istruzione return quando è necessario che la funzione restituisca un valore all’istruzione che la ha chiamata. Senza istruzione return il risultato della funzione non viene memorizzato La definizione di una funzione permette a Python di capire quale operazione deve svolgere, ma non la esegue→ ogni volta che vogliamo eseguire una funzione è necessario chiamarla utilizzando la sintassi: nome_funzione() Se sono stati specificati dei parametri nella definizione, è necessario scrivere il loro valore tra le parentesi tonde: una funzione può essere chiamata nella shell di Python, da un programma o da un’altra funzione Esempi: Se io definisco una variabile all’interno della definizione di una funzione e poi lo scrivo nello shell non lo trova Gli argomenti delle funzioni
  • Spesso abbiamo bisogno di passare alle funzioni degli argomenti, cioè degli input di cui hanno bisogno per svolgere il proprio compito. In questi casi è necessario specificarlo nella definizione della funzione per mezzo dei parametri
  • I parametri : spiegano a Python che alla funzione, quando sarà chiamata, dovranno essere passati dei dati e consentono di specificare come devono essere utilizzati i dati per eseguire le operazioni previste dalla funzione
  • I parametri sono specificati tra le parentesi tonde dopo il nome della funzione, separati da virgole Parametri obbligatori e opzionali I parametri possono essere obbligatori o opzionali: quando si definisce una funzione, è necessario specificare sempre prima tutti i parametri obbligatori, poi quelli opzionali
  • Per ciascun parametro opzionale deve essere indicato anche il valore predefinito che dovrà assumere se non dovesse essere specificato nella chiamata della funzione

Variabili locali e globali

  • Una variabile globale può essere raggiunta da qualsiasi istruzione di un programma
  • Una variabile locale è accessibile solo all’interno del suo ambito ( scope ), cioè nella parte del programma in cui è stata definita, come per esempio una funzione
  • Nelle funzioni possiamo creare delle variabili locali per facilitare i calcoli, memorizzare temporaneamente un valore, rendere più leggibile il codice La stringa di documentazione (docstring) Quando si crea una funzione è possibile inserire qualche riga di spiegazione o commento definendo una stringa di documentazione ( docstring ) → la stringa di documentazione consiste in una stringa di testo su una o più righe racchiuse tra triple virgolette, come prima istruzione subito dopo l’intestazione nella definizione di una funzione Il contenuto della stringa di documentazione è visibile quando si legge il codice, quando si utilizza la funzione help oppure nel call tip Funzioni con cicli ed espressioni condizionali

Le eccezioni

  • Un’eccezione ( exception ) è un evento scatenato da un errore di varia natura
  • Se prevediamo che si possa verificare un'eccezione, in Python è possibile scrivere del codice per gestirla (exception handling)
  • Quando un’eccezione non è gestita (unhandled exception) causa un errore e l’uscita dal blocco di istruzioni in cui si verifica o dal programma Tipologie di errore
  • Errori di sintassi = indicano che c’è un errore nella scrittura del codice
  • Errori di runtime
  • Errori semantici Errori di sintassi = Python mostra nella shell un messaggio di errore (messaggio di traceback) e indica il punto del codice dove si trova l’errore, ma non specifica come correggerlo. Il messaggio di errore di solito inizia con SyntaxError Errori di runtime = Gli errori di runtime indicano che c’è un errore nel codice, anche se la sintassi è corretta→ Python mostra un messaggio di errore (solo nella shell) e indica il codice che genera l’errore e ne specifica la causa (es. ZeroDivisionError e NameError ) Errori semantici = avvengono quando il programma viene eseguito senza produrre messaggi di errore, ma i risultati non sono quelli corretti (sono incoerenti o imprevisti). Derivano da un’errata progettazione del codice (sono chiamati anche errori di logica)→ difficili da individuare: richiedono una rilettura passo a passo del codice, o l’uso di strumenti di debugging più sofisticati ( Debugger) Gestione eccezioni Python mette a disposizione alcune istruzioni per gestire gli errori, cioè prevenirli, istruendo il programma su cosa fare nel caso in cui si dovessero verificare. L’istruzione più comune è try… except che consente di specificare come devono essere gestiti gli errori. È possibile specificare cosa deve fare il programma per tutte le tipologie di errore o solo per alcune Esempio Debugging = consiste nella ricerca e nella rimozione degli errori del codice, avviene attraverso un processo di rilettura del codice, ricerca degli errori, modifica del codice e nuova esecuzione del programma → esistono strumenti appositi come il Debugger (fino a qui prova in itinere)

Operatori e funzioni delle sequenze Indicizzazione (indexing) La posizione di ogni elemento all’interno di una sequenza è identificata da un numero intero (da 0), chiamato indice→ l’indicizzazione (indexing) consente di accedere ai singoli elementi di una sequenza, utilizzando la seguente sintassi: sequenza[indice] : se scrivo come indice un numero non incluso nella sequenza (cioè ad es. 5 ma la sequenza va fino a 4, esce IndexError ) L’indice del primo elemento a sinistra è pari a 0, mentre l’indice dell’ultimo elemento della sequenza è pari al numero di elementi della sequenza meno 1 → è possibile utilizzare indici con valori negativi: in questo caso il conteggio parte dalla fine della sequenza Lo slicing Un segmento o porzione di sequenza è chiamato slice: lo slicing consente di selezionare più di un elemento di una sequenza utilizzando la sintassi: sequenza[indice_iniziale:indice_finale:step]. L'operazione restituisce tutti gli elementi della sequenza tra quello con indice_iniziale (compreso) e quello con indice_finale (escluso). Step è opzionale e indica quali indici successivi selezionare dopo il primo L Esempi di slicing Quando indice_iniziale è omesso lo slicing seleziona gli elementi a partire dal primo ; quando indice_finale è omesso lo slicing seleziona gli elementi fino all’ultimo. Omettendo entrambi viene selezionata l’intera sequenza → si consideri la stringa 'Computer viruses are an urban legend' memorizzata nella variabile quote. Ecco qualche esempio di slicing: Metodi Stringhe, liste e tuple hanno delle funzioni speciali, chiamate metodi

  • La sintassi delle funzioni prevede che la sequenza o il nome della variabile in cui è memorizzata sia uno degli argomenti della funzione
  • La sintassi dei metodi prevede che sia sempre specificato anche il nome della sequenza, utilizzando la seguente sintassi: oggetto.metodo(argomenti) Metodi delle stringhe Metodi delle liste Pop è un problema perché se usato dentro al ciclo può portare a errori Metodi delle tuple I metodi delle tuple sono pochi perché le tuple sono immutabili, spesso è utile convertire la tupla in una lista, lavorare sugli elementi della lista e convertire nuovamente in una tupla Dizionari
  • In Python un dizionario è un oggetto che contiene una collezione di dati o elementi
  • Gli elementi sono composti da due parti: una chiave e un valore. Le chiavi sono univoche e possono essere qualsiasi tipo di dato immutabile. I valori possono essere qualsiasi tipo di dato mutabile o immutabile
  • Per creare un dizionario è necessario scrivere tra parentesi graffe { } gli elementi separati da virgole (,). Ogni elemento è costituito da una chiave seguita da due punti (:) e da un valore
  • In alternativa è possibile utilizzare la funzione dict , che crea un nuovo dizionario privo di elementi