Scarica INFORMATICA - Programmazione Python, Architettura dell'elaboratore e più Appunti in PDF di Elementi di Informatica solo su Docsity!
TEORIA
Sistemi di numerazione
Sistemi non posizionali (additivi): egiziano, romano, greco. Sistemi posizionali: babilonese (2 cifre, sessagesimale), inuit, selti, maya (ventesimale), indo-arabo. Esempio di ibridi: cinese. Il nostro sistema è quello indo-arabo : decimale, posizionale {0, 1, 2, 3, …, B – 1} = cifre
B i^ = peso della cifra i-esima, con B=base
Rappresentazione (numeri naturali) su N cifre: 𝑎 (^) 𝑁−1 𝑎 (^) 𝑁−2 … 𝑎 1 𝑎 0 Sistema binario : B = 2, Cifre = {0,1} (spesso 1=chiuso e 0=aperto) BIT = BI nary Digi T La prima cifra è MSB (Most Significant Bit), mentre l’ultima LSB (Least Significant Bit). Come convertire :
- binario→decimale : somma pesata delle cifre binarie → 101 2 = 1 2⋅ 2 + 0 2⋅ 1 + 1 2⋅ 0 = 5 10
- decimale→binario : divisioni successive Convertire basi generiche : es. da base 9 a base 10 → 1839 = 1x9^2 + 8x9^1 + 3x9^0 = 81+72+3 = 156 10 es. da base 10 a base 7 → 156:7 = 22 r=2, 22:7 = 3 r=1, 3:7 = 0 r=3, 156 10 = 312 7 Attraverso il linguaggio binario si possono rappresentare numeri limitati dal numero N di bit disponibili: per numeri naturali a N bit, possono essere create 2 N^ combinazioni (dove il minimo è 0 e il massimo 2N -1, inclusi). 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 Somma in binario :. Sottrazione in binario : Ci sono delle limitazioni per la somma : Overlfow (NaN : not a number) OVERFLOW / -10^38 / OK / 1038 / UNDERFLOW / 10-38^ / OK / 10^38 / OVERFLOW Esso indica l’errore che si verifica in un sistema di calcolo automatico quando il risultato di una operazione non è rappresentabile tramite la medesima codifica e numero di bit degli operandi. Nella somma in binario puro si ha overflow quando si lavora con numero fisso di bit e si ha carry sul MSB (es. con 1byte non posso rappresentare numeri maggiori di 255, servono altri bit) Rappresentazione dei numeri relativi (con segno in binario) :
- Modulo e segno (M&S) : l’MSB sarà 0 = +, 1 = –. Segno=1bit, Modulo=N-1 bit. Gli svantaggi sono il doppio zero (lo zero è rappresentabile come 00=+0 e 10=-0), operazioni complesse. Con N numero di Bit, è rappresentabile l’intervallo [−(2 𝑁−1^ −1), 2 𝑁−1^ −1] (si parla di range simmetrico) (es. 8bit = -127,+127)
- Complemento a 2 : in questa codifica per il numero a N bit, il MSB ha peso negativo, pari a −2 𝑁−^. Mentre gli altri bit hanno peso positivo. Di conseguenza il MSB indica sempre il segno: 0=+ 1= −. Per convertire un numero decimale con segno in CA2:
- se il numero è positivo, CA2=M&S
- se il numero è negativo, si calcola il corrispondente positivo in M&S, si complementa ogni bit (scambio zeri e uni) e si somma 1. es. -12 → |-12| = 01100 M&S + 10011 + 00001 = 10100 CA Per quanto riguarda le operazioni, con operandi aventi segno discorde, non si può mai verificare overflow, mentre, in caso contrario, l’overflow si verifica quando il risultato ha segno discorde daglli operandi; nel caso in cui si verifica un carry sull’ultima cifra, esso non si considera.
Sistema ottale : B = 8, Cifre = {0,…,7} Si rivela utile quando vogliamo scrivere in modo compatto i numeri binari. Conversione binario→ottale : prendendo gruppi di 3 cifre (perché 2^3 =8) Conversione decimale→ottale : come nel binario, solo dividendo per 8 Sistema esadecimale : B = 16, Cifre = {0,…,9,A,…,F} Conversione binario→esadecimale : prendendo gruppi di 4 (perché 2^4 =16) Rappresentazione dei numeri reali : Un numero N è dato da. con M=mantissa, E=esponente es. 10 = 0(S)10000010(E)01000000000000000000000(M) Formato IEEE-754 (rappresentazione standard usata dai nostri computer) : Rappresentazione in virgola mobile ( floating point ) Rappresentazione dei dati non numerici : Il calcolatore è in grado di manipolare solo numeri, per gestire dati non numerici (testi, suoni, immagini,…) va creata una corrispondenza tra oggetti e numeri → a ogni oggetto si assegna un codice univoco. N bit → M = 2 N^ oggetti (es. per rappresentare 16 colori sono necessari 4 bit) Di solito i nostri dispositivi producono immagini a 24 bit, quindi, ogni pixel può assumere 2^24 colori diversi (16 milioni di colori), di questi avremo 8 bit per le intensità del rosso, 8 per il verde e 8 per il blu (da cui deriva RGB in inglese). M oggetti → N = log 2 M Codifica dei caratteri :
- Codice ASCII (American Standard Code for Information Interchange) : usa 8 bit per rappresentare 52 caratteri alfabetici, 10 cifre, segni di interpunzione, caratteri di controllo
- UNICODE esprime tutti i caratteri di tutte le lingue del mondo (più di un milione). Usato per Python
- UTF- È la codifica Unicode più usata : 1byte per caratteri US-ASCII, 2byte per caratteri latini con simboli diacritici, greco, cirillico, armeno, ebraico, arabo, siriano, maldiviano, 3byte per altre lingue comuni, 4byte per caratteri rarissimi Un testo però oltre ai caratteri è fatto anche di font, grandezza, colore, grassetto,…. L’Unicode quindi non basta, ma per fornire queste informazioni bisogna sviluppare un’ulteriore codifica, come ad esempio .doc per i file Word, .pdf per i file finiti ecc. Facciamo quindi distinzione tra due formati di un testo:
- Formattato : sono memorizzate sequenze di byte che definiscono l’aspetto del testo
- Non formattato : sono memorizzati solo i caratteri che compongono il testo Per quanto riguarda i dati multimediali come audio, video ecc, le codifiche sono molto più articolat.
Ogni elaboratore contiene un elemento di temporizzazione detto clock , che genera un riferimento temporale
comune per tutti gli elementi costituenti il sistema di elaborazione. Lo esprimiamo con la frequenza e lo misuriamo in Hz (s-1) in modo da misurare il numero di cicli nell’unità di tempo (il secondo). Un ciclo-macchina è l’intervallo di tempo in cui viene svolta una operazione elementare ed è un multiplo intero del periodo del clock. L’esecuzione di un’istruzione richiede un numero intero di cicli-macchina, variabile a seconda dell’istruzione. Quindi più il processore ha una frequenza maggiore, più ravvicinati saranno i cicli e più velocemente verranno eseguite le operazioni. Memoria Memorizza i dati e le istruzioni necessarie all’elaboratore per operare. Caratteristiche:
- Indirizzamento: la memoria è organizzata in celle (minima unità accessibile direttamente). Ad ogni cella di memoria è associato un indirizzo (numerico) per identificarla univocamente;
- Parallelismo: ogni cella di memoria contiene una quantità fissa di bit (word) identica per tutte le celle di una certa unità di memoria, accessibile con un’unica istruzione, è un multiplo del byte, tipicamente la dimensione della cella di memoria coincide con quella dei registri per consistenza e semplicità;
- Accesso (sequenziale o casuale)
- Struttura gerarchica: ad oggi non esiste una memoria perfetta. Per rendere il calcolatore efficiente, si posizionano le memorie più veloci e volatili più vicino al processore e le memorie più lente e non volatili lontano. Memoria = {rom, ram, flesh, dischi, registri, nastri, cache} Memoria centrale = RAM (Random Access Memory, volatile, non permanente). ROM (Read Only Memory) Memoria di massa = contiene i dati che vogliamo immagazzinare (Hard disk, Cd, floppy…) Confronto tra memorie Le interconnessioni (bus) La connessione punto-punto non è pratica, perché il numero di connessioni aumenterebbe con il quadrato del numero di unità da connettere. Viene quindi utilizzata un’unica linea di connessione per connettere tutti i componenti, che sono fisicamente agganciati a questa linea. Vengono chiamati bus, che hanno:
- Vantaggi: costi ridotti, estendibilità (aggiunta di nuovi dispositivi semplificata), standardizzabilità (regole per la comunicazione da parte di dispositivi diversi)
- Svantaggi: lentezza, poiché se già il canale contiene un’operazione, per mandarne un’altra bisogna aspettare che si liberi il canale; sovraccarico del processore, che fa da master sul controllo del bus. L’ampiezza di un bus corrisponde al numero di bit di cui è costituito un singolo dato (ogni filo ha un bit); la frequenza corrisponde al numero di dati trasportati al secondo. Se il bus è mal dimensionato, potrebbe essere un collo di bottiglia. Un singolo bus è suddiviso in tre “sotto bus”, detti:
- Dbus (di dati): girano i dati veri e propri
- Abus (degli indirizzi): indirizzo del dato che mi serve. La dim è il n di celle di memoria indirizzabili
- Cbus (di controllo): quale operazione e da chi deve essere fatta. La dim è la dim di una cella di memoria Caratteristiche di un bus sono :
- Trasporto di un solo dato per volta
- Frequenza, ossia i numeri di dati trasportati al secondo
- Ampiezza, il numero di bit di cui è costituito il singolo dato
PYTHON
Introduzione alla Programmazione Un calcolatore elettronico è composto da due parti:
- Hardware : la componente fisica, ossia dispositivi elettronici e parti meccaniche, magnetiche ed ottiche (interfacce), CPU, dispositivi di memoria (interna (RAM) e secondaria (hard disk, dischi flash, CD/DVD)
- Software : la parte «intangibile», consiste di:
- Programmi: le «istruzioni» implementate in un qualche linguaggio (es. microsoft, giochi, driver) per l’hardware. Indicano al computer una sequenza di passi per completare un compito. Per eseguire un programma, questo deve essere portato in memoria, dove la CPU lo possa leggere, e eseguire un’istruzione per volta. La CPU legge i dati (compreso l’input utente), li modifica e li riscrive nuovamente in memoria, sullo schermo, o sulla memoria di massa.
- Dati: le informazioni su cui lavorano i programmi, il software gestisce i dati usati dalle istruzioni La programmazione è l’atto di progettare ed implementare i programmi software. Programmare = scrivere un file sorgente che descrive la (una delle) soluzione al problema considerato. Serve ottenere una forma mentis per il problema solving = Analizzare un problema e decomporlo, Descrivere la soluzione in modo non ambiguo, Analizzare ed esplicitare i passi del ragionamento. Linguaggi
- Linguaggio ad alto livello (C, C++, JavaScript, Python, …), indipendenti dall’hardware
- Linguaggi ‘assembler’ (Intel Core), molto dipendenti dall’hardware. Specifici per un microprocessore Algoritmo = sequenza di istruzioni non ambigue, eseguibili, che terminino, per raggiungere un obiettivo. es. scegliere un’auto tra due possibili :
- determinare gli input e gli output
- dati iniziali
- da calcolare (con sotto-calcoli)
- scelta finale → dopo aver progettato l’algoritmo, testare ( debug ) il programma Istruzioni
- pseudo-istruzioni (direttive all’interprete, #)
- istruzioni elementari (es. interazioni coi dispositivi I/O, accesso o modifica dati)
- istruzioni di controllo di flusso (controllo di sequenze di istruzioni elementari) Flow Chart (diagramma di flusso) Struttura delle decisioni e delle attività principali Elementi principali :
DECISIONI
Input() inserisce una stringa, int(input()) inserisce un numero Output formattato :
- Concatenazione di stringhe
- f-string → queste stringhe formattate possono contenere campi sostituibili {} es. print(f ‘The area of a circle of radius ‘str{r}’ is str{area}’)
- l’operatore di formattazione % es. print(‘The area of a circle of radius %f is%f’ %(r,area))
- il metodo .format() es. print(‘The area of a circle of radius {r} is {area}’.format(r=r, a=area)) If Permette al programma di fare cose diverse in base al valore dei dati che sta elaborando. Il blocco di istruzioni specifica le istruzioni da eseguire se la condizione è vera (if) o saltate se la condizione è falsa (else). È un compound statement (istruzioni composte, che si sviluppano su più di una riga, e consistono di header (intestazione) e blocco di istruzioni). Possono anche essere annidati in altri blocchi di istruzioni. elif Appena una delle condizioni di test è vera, il relativo blocco di istruzioni viene eseguito. Se nessun test ha successo, viene eseguito l’ else finale. Operatori relazionali maggiore maggiore o uguale minore minore o uguale uguale diverso
= < <= = = != Per confrontare due stringhe alfabeticamente si usa un operatore relazionale: string1 < string Pass Nello sviluppo del codice, può risultare conveniente scrivere prima lo «scheletro» della logica di funzionamento, per poi «riempire» le istruzioni in un secondo momento, pass è un’istruzione ‘speciale’, che non fa nulla, ma permette la scrittura sintatticamente corretta (in fase di sviluppo), per poi essere sostituita dal codice. Variabili booleane bool è un tipo di dato in python, Una variabile Booleana può solo essere True o False. Sono spesso usate come flag (indicatore). Per esse valgono le proprietà commutativa, associativa, distributiva.
- and (è utile, ad esempio, nel controllare se un valore cade in un certo intervallo) - or (una sola delle condizioni deve essere Vera affinché la condizione multipla sia Vera) - not (utile se bisogna invertire una variabile booleana o il risultato di un confronto) In / not in Per sapere se una stringa contiene al suo interno una certa sottostringa. Exit es. si è inserito un valore non accettabile nell’input → exit(“valore non accettabile”)
CICLI
I cicli sono utilizzati per ripetere diverse volte lo STESSO blocco di istruzioni. Ogni ciclo richiede : inizializzazione (preparare le variabili per iniziare il ciclo), condizione (per capire se, ad ogni iterazione, il ciclo deve essere eseguito o no), aggiornamento (modificare qualche variabile all’interno del ciclo, in modo che prima o poi le iterazioni terminino). While Ripete le istruzioni, con valori diversi delle variabili, finché una condizione rimane Vera. (ciclo sull’indice) Devo aggiornare la variabile!!! se no il ciclo è infinito. Un ciclo while controllato da un contatore conta il numero delle ripetizioni effettuate, si ferma quando sono state completate un numero finito di iterazioni. Un ciclo while controllato da un evento, il numero di iterazioni non è noto in anticipo, la condizione prima o poi diventa falsa Quando non si sa quanti elementi ci sono un una lista, si può utilizzare un carattere o un valore speciale per identificare l’ultimo della lista. Questo si chiama valore sentinella , e non fa parte della lista. es. salary=0.0 ; while salary >= 0 : … Posso metterla all’esterno e all’interno Posso usare una variabile booleana per controllare un ciclo Break / Continue Per interrompere anticipatamente un ciclo For… in Serve a iterare su tutti i valori di un contenitore (stringa, lista, file, range..), uno alla volta (ciclo sul valore), o a creare un ciclo controllato da un contatore di interi. Il contenitore range (range(a,b) : a è incluso, b escluso) enumerate() trasforma un contenitore in una lista di tuple (sequenza di coppie) :
FUNZIONI
Una funzione è una sequenza di istruzioni a cui viene dato un nome. Si invoca (o chiama) una funzione per eseguire le sue istruzioni, e il risultato è restituito dove è stata invocata. Può essere inserita in un’espressione. Gli input della funzione sono gli argomenti. Si può avere anche una funzione senza argomenti. Alcune funzioni predefinite sono abs(), min(), max(), len(), input(), slice(), range(), sorted(), … es. def cubeVolume(sideLenght): volume = sideLenght ** 3 return volume result1 = cubeVolume ( 2 ) Non modificare le variabili parametro! Per evitare confusioni, va introdotta una variabile diversa. → L’output è il valore restituito (return x). Alcune funzioni non restituiscono alcun valore. Return termina la funzione e passa il valore di ritorno alla funzione che l’ha invocata. Per restituire più valori si utilizza una tupla (return(x,y)) Posso usare più return, o uno solo in questo modo : Se ci si dimentica di un return Python può restituire None : Main Tuttte le istruzioni del programma si devono trovare all’interno di funzioni, indicandone una come punto di partenza dell’esecuzione. Si sceglie per convenzione ‘main’, e serve un’istruzione che invochi la funzione main. es. togliere i due valori più piccoli Implementazione di una funzione :
- Descrivere cosa deve fare la funzione
- Indicare una lista degli input della funzione (parametri variabili)
- Determinare i tipi delle variabili parametro e del valore restituito Le variabili possono essere locali (nella funzione) o globali (fuori dalla funzione)
- Scrivere lo pseudocodice per ottenere il risultato voluto (espressioni, diramazioni, loop,..)
- Implementare il corpo della funzione
- Gestire le eccezioni !!!!!!!!
LISTE E TABELLE
Una lista (/sequenza/array/vettore) è una struttura dati versatile e dinamica, che contiene un numero variabile di elementi, di qualunque tipo, a cui si può avere accesso tramite la loro posizione ( indice ). Sia le liste che le stringhe sono sequenze e l’operatore [ ] viene usato per accedere ad un elemento di esse. Le liste possono contenere ogni tipo di elemento, sono mutabili. Accedere a un elemento della lista: print(values[5]) Sostituire un elemento della lista: values[5] = 87 Se il programma tenta di accedere ad una lista attraverso un indice fuori dal range consentito, il programma genererà un’ eccezione durante l’esecuzione.
Creare una copia della lista, una nuova lista con gli stessi elementi nello stesso ordine: list( values )
Accedere all’ultimo elemento posso usare indici negativi: last = values[ -1 ] oppure last = values[len(values)-1]
Aggiungere elementi: friends=[x,y,z] → friends .append( “Bob” )
Inserire un elemento: friends .insert( 2, “Cindy” )
Rimuovere un elemento: friends. remove (“Bob”)
Trovare un elemento: in
Conoscere la posizione di un elemento: friends .index( “Emily” )
Rimuovere un elemento: friends .pop( “Bob” )
Concatenare liste : myfriends + yourfriends (crea una nuova lista)
Aggiungere in coda a una lista il contenuto di un’altra : myfriends .extend( yourfriends ) (modifica la stessa)
Replicare : values = [1,2,3] * 4 → [1,2,3,1,2,3,1,2,3,1,2,3] Verificare l’ uguaglianza o disuguaglianza tra liste: list1 == list2 o !=
Sommare gli elementi della lista:. sum( x )
Sommare o moltiplicare tutti gli elementi per un numero: list + num ; list * num Valore massimo o minimo :. max ([1,12,4])→12 ;. min ([‘Fred’,’Ann’,’Sue’])→’Ann’
Ordinare una lista:. sort( x ). Ordinare al contrario :. sort(reverse=true)
Creare una copia ordinata di una lista:. sorted( x ). Copia ordinata al contrario : .sorted( values, reverse=True)
Estrarre porzioni di una lista: temperatures[6 : 9] (il primo è incluso, l’ultimo escluso). lista[start : stop : step ]
[6:10]=[3,2] accorcio la lista ; [6:8]=[3,3,3,3,3] allungo la lista ; [6:8] cancello la porzione ; [ : ]=[ ] cancello tutti
Unire gli elementi di una lista usando una stringa come separatore: separator_string .join( list )
Separare gli elementi di una lista: words = line .split() (es. ‘1,2,3’.split(‘,’) → [‘1’,’2’,’3’] )
Scambiare elementi: è necessario prima salvarne prima uno in un’altra variabile, per non sovrascriverlo Assegnazioni multiple : (a,b)=(3,4) è equivalente a a=3 e b=
Tuple
Una tupla è una versione immutabile di una lista. È un contenitore ordinato e immutabile. Triple = (5,10, 15) Si possono assegnare variabili multiple in una sola operazione. (ora, minuti, secondi)=(12, 32, 45) Sono utili per lo scambio delle variabili. (lista[0],lista[2])=(lista[2], lista[0]) Utili per restituire più valori da una funzione. return (x,y,z)
FILE
Per specificare che il file è Unicode (e quindi non va aperto con l’encoding del sistema operativo, ma con UTF-8), aggiungere un argomento: encoding='utf-8' nella funzione open Per evitare di dimenticarsi di chiudere il file si può usare with Leggere un file :
- 1 carattere = infile.read(1)
- N caratteri = infile.read(N)
- parole di una frase = line.rsplit(“.,?!”) (r elimina le eventuali punteggiature). Modi di suddividere una stringa →
- una riga = infile.readline()
- l’intero file = infile.readlines() / read() Modo di suddividere un file in righe → text.split(\n)
- read(1) legge il prossimo carattere Scrivere su un file :
- outfile .write( “hello\n” ). Occorre aggiungere il carattere di fine linea per poter passare alla linea successiva
- outfile .writelines() scrive contemporaneamente più righe Eliminare gli a capo : es. ho la riga con la parola spam\n → line. rstrip() → spam es. leggere il file “estremi.dat” contenente coppie di numeri, e creare il file “differenze.dat” con le loro differenze → infile = open(“estremi.dat”, “r”) outfile = open(“differenze.dat”, “w”) for line in infile: numeri = line.split() diff = int(numeri[0] – int(numeri[1]) outfile.write( f’{diff}\n’ ) infile.close() outfile.close()
Elaborare file in formato CSV (comma separated values) In caso di file separati da virgola si usa il modulo csv della libreria standard
- reader() restituisce un oggetto specializzato nella lettura del file, che posso iterare →
- writer() restituisce un oggetto specializzato nella scrittura del file → csvWriter.writerow([“Jhon Smith”, 1607, “Senior”, 328]) Gestione delle eccezioni meccanismo flessibile per passare il controllo dall’errore a un gestore che lo sappia trattare ! Sollevare un’eccezione appena viene rivelato un problema. Gestirla solo quando il problema può essere risolto. RILEVARE ERRORI
- Il programma deve controllare se sono verificate tutte le condizioni per permettere la normale prosecuzione
- Altrimenti il programma solleva un’eccezione
- Istruzione : raise ‘solleva’ un’eccezione
- Vi sono diversi tipi di eccezioni (ValueError, IOError, …) in funzione della causa
- All’eccezione può essere assegnato un messaggio descrittivo del problema Tipi di errore GESTIRE ERRORI (TRY … EXCEPT)
- Se usiamo delle funzioni che possono generare eccezioni, dobbiamo definire del codice per gestirle
- Il blocco try contiene una o più istruzioni che potrebbero causare un’eccezione
- Una o più clausole except contengono il gestore per ciascun tipo di eccezione
- Se l’eccezione non viene gestita, ciò causerà l’interruzione del programma
STRUTTURE DATI COMPLESSE – insiemi e dizionari
INSIEME (set) { }
= contenitore mutabile non ordinato di elementi univoci immutabili.
Gli elementi non sono memorizzati in alcun ordine particolare e non vi si può accedere per posizione. Le operazioni permesse sono quelle matematiche. Invece che fare è molto più efficace fare !!! Insieme = { ‘Luigi’, ‘Bob’, ‘Anna’ } Elementi che può contenere → numeri, stringhe, tuple, oggetti. Non liste, dizionari, file. Per creare un insieme vuoto : set().! {} non crea un insieme vuoto ma un dizionario vuoto.! Si può usare set() per convertire una sequenza qualsiasi in lista. Aggiungere elementi :. add() Rimuovere elementi : .discard() / remove() Svuotare l’insieme : clear() issubset() restituisce True o False sulla base del fatto che un insieme sia sottoinsieme di un altro. Unione di due insiemi : evens .union( odds ). Intersezione di due insiemi: evens .intersection( odds ). Differenza tra due insiemi : evens .difference( odds ). es. voglio contare le parole uniche (distinte tra loro) in un testo → leggo una parola per volta e la aggiungo in un insieme con add (add impedirà di aggiungere parole già inserite). La dim dell’insieme sarà il risultato. Costruirò una funzione per «pulire» le parole (ignorare le maiuscole,..) prima di aggiungerle all’insieme.
DIZIONARIO { }
= contenitore mutabile di coppie chiave-valore, utilizzabile come array associativo (es. es. cognome – nome) o come record dati (es. matricola – nome, cognome, data, corso). Le chiavi sono uniche, ma un valore può essere associato a diverse chiavi. La chiave può essere stringa, numero. Il valore può essere qualsiasi. Creare un dizionario vuoto : {} Duplicare un dizionario : dict() Accedere ai valori : dict [ ‘key’ ]. (non è un contenitore sequenziale, non si accede con la posizione) Come scorciatoia, si può usare il metodo get per accedere, che permette di specificare anche un valore di default: nel caso in cui non ci sia una chiave corrispondente, viene restituito il valore di default è equivalente a Aggiungere un elemento : contacts [ ‘John’ ] = 46328 Il dizionario memorizza le chiavi nell’ordine di inserimento. Eliminare un elemento (valore e chiave) : contacts .pop() Iterare sugli elementi (chiave + valore) : .items() Estrarre record da un file → oppure lista.append(record)
DictReader del modulo csv Quando leggiamo un file in formato CSV, possiamo leggere le righe con l’ausilio di
- csv.reader, che restituisce i campi di una riga sotto forma di lista
- csv .DictReader , che restituisce i campi di una riga sotto forma di dizionario Ordinare una lista di dizionari → sort() non funziona. Bisogna fornire una chiave di ordinamento (studenti.sort(key=…)) Il caso più utile è itemgetter() che implementa una chiave di ordinamento per selezionare il campo di interesse. Anche se la lista contiene liste o tuple : in questo caso l’argomento di itemgetter è l’indice della posizione rispetto cui ordinare STRUTTURE DATI COMPLESSE Combinazioni di liste, insiemi, dizionari, tuple. MODULI Dividere il programma in più parti. Programmi grandi possono contenere centinaia di funzioni che diventano difficili da gestire. Distribuire le funzioni su più file sorgenti e raggruppare insieme le funzioni correlate permette di facilitare il test ed il debug. I programmi Python di grandi dimensioni tipicamente consistono di un modulo principale (driver module = main o la prima istruzione eseguibile) ed uno o più moduli supplementari (funzioni di supporto, costanti, variabili, …).
Tips per scrivere il programma :
cosa fa il programma
- definisci le costanti date (in maiuscolo)
- input dall’utente
- dividi in funzioni!
tipi di print
- print ( number, ‘is a duplicate’)
- print ( “%d is a duplicate”, %(number) ) (%s per stringhe, %f per float, %d per interi)
- print ( f ”{number} is a duplicate.” )