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


Informatica e Programmazione Python, Dispense di Fondamenti di informatica

Dispensa relativa al corso di Informatica dell’anno accademico 2020/2021 del corso di Laurea triennale di Scienze Statistiche ed Economiche (Università degli Studi Milano-Bicocca). UNIMIB-SSE

Tipologia: Dispense

2020/2021

In vendita dal 26/11/2022

Mimi.Col
Mimi.Col 🇮🇹

4 documenti

1 / 30

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
INFORMATICA (blended)
Imparare la programmazione (coding) è necessario per gestire un grosso numero di dati. La
programmazione permette di progettare e implementare procedure di elaborazione automatica di
dati e informazioni (o correggere quelli fatti da altre persone) e di imparare ad analizzare i problemi
con un approccio analitico (dunque distinguere la patologia dai sintomi e i problemi principali dai
secondari).!
L’informatica è lo studio sistematico degli algoritmi che descrivono e trasformano l’informazione.!
Algoritmo: un procedimento che, a partire da uno stato iniziale, consente di ottenere in un
tempo finito un risultato atteso eseguendo un insieme di operazioni descritte in maniera completa
e non ambigua. !
Può essere eseguito da un elaboratore (produce un risultato in un tempo finito e non è ambiguo)!
Proprietà fondamentali:
-correttezza: un algoritmo corretto perviene alla soluzione senza difettare di alcun passo
fondamentale (risolve il problema senza saltare nessun passaggio).!
-ecienza: l’algoritmo perviene alla risoluzione del problema nel modo più veloce possibile e/o
usando la minima quantità di risorse, compatibilmente con la sua correttezza.!
Rettangolo—> start/stop!
Parallelogramma—> dati input/dati output!
Rombo—> operazioni!
Costruzione di strumenti che permettono di prendere la descrizione di un algoritmo e tradurla in
linguaggio macchina, dunque viene tradotto in sequenze di 0 e 1 (anché le operazioni siano
eseguibili da un computer)!
Programma sorgente: sequenza di istruzioni espresse attraverso un linguaggio di
programmazione!
Programma eseguibile:!
Per passare da programma sorgente a eseguibile:!
-Compilatore: riceve in ingresso un programma sorgente e genera un eseguibile (traduce in un
unico passaggio, detto processo di compilazione, tutte le istruzioni). Una volta generato
l’eseguibile, esso può essere appunto eseguito senza ulteriori compilazioni.!
-Interprete: riceve in ingresso il programma sorgente, interpreta ed esegue le istruzioni una alla
volta. L’interprete è utile soprattutto per persone alle prime armi.!
-Sottolineatura!
Linguaggio di programmazione:
-di alto livello: più simili al linguaggio naturale, le istruzioni sono astratte ed è indipendente dai
dettagli dell’architettura della macchina!
-di basso livello (es. assembly): le sequenze sono codificate in sequenze di caratteri alfa-
numerici ed è fortemente influenzato dal tipo di processore (computer), dunque dall’architettura
della macchina.!
Sintassi e semantica dei linguaggi:
-Sitassi: l’insieme di regole formali che dettano le modalità per costruire frasi corrette nel
linguaggio stesso.!
-Semantica: l’insieme dei significati da attribuire alle frasi (sintatticamente corrette) costruite nel
linguaggio.!
Dunque da ciò si può intuire che una correttezza semantica implica una correttezza sintattica, ma
non viceversa (infatti una frase scritta correttamente sintatticamente potrebbe non avere un
significato).!
Processo: un’istanza di un programma in esecuzione.!
Processore: la componente hardware che si occupa di eseguire le istruzioni.!
Nei computer moderni possono esserci diversi processi in esecuzione dovuti a più istanze dello
stesso programma, a istanze di diversi programmi o una combinazione delle due.!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
Colombo Micol a.a. 2020/2021
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e

Anteprima parziale del testo

Scarica Informatica e Programmazione Python e più Dispense in PDF di Fondamenti di informatica solo su Docsity!

INFORMATICA (blended)

Imparare la programmazione (coding) è necessario per gestire un grosso numero di dati. La programmazione permette di progettare e implementare procedure di elaborazione automatica di dati e informazioni (o correggere quelli fatti da altre persone) e di imparare ad analizzare i problemi con un approccio analitico (dunque distinguere la patologia dai sintomi e i problemi principali dai secondari). L’informatica è lo studio sistematico degli algoritmi che descrivono e trasformano l’informazione.

Algoritmo: un procedimento che, a partire da uno stato iniziale, consente di ottenere in un

tempo finito un risultato atteso eseguendo un insieme di operazioni descritte in maniera completa e non ambigua. Può essere eseguito da un elaboratore (produce un risultato in un tempo finito e non è ambiguo) Proprietà fondamentali:

- correttezza: un algoritmo corretto perviene alla soluzione senza difettare di alcun passo

fondamentale (risolve il problema senza saltare nessun passaggio).

- efficienza: l’algoritmo perviene alla risoluzione del problema nel modo più veloce possibile e/o

usando la minima quantità di risorse, compatibilmente con la sua correttezza. Rettangolo—> start/stop Parallelogramma—> dati input/dati output Rombo—> operazioni Costruzione di strumenti che permettono di prendere la descrizione di un algoritmo e tradurla in linguaggio macchina, dunque viene tradotto in sequenze di 0 e 1 (affinché le operazioni siano eseguibili da un computer) Programma sorgente : sequenza di istruzioni espresse attraverso un linguaggio di programmazione Programma eseguibile : Per passare da programma sorgente a eseguibile:

- Compilatore: riceve in ingresso un programma sorgente e genera un eseguibile (traduce in un

unico passaggio, detto processo di compilazione, tutte le istruzioni). Una volta generato l’eseguibile, esso può essere appunto eseguito senza ulteriori compilazioni.

- Interprete: riceve in ingresso il programma sorgente, interpreta ed esegue le istruzioni una alla

volta. L’interprete è utile soprattutto per persone alle prime armi.

- Sottolineatura

Linguaggio di programmazione:

- di alto livello: più simili al linguaggio naturale, le istruzioni sono astratte ed è indipendente dai

dettagli dell’architettura della macchina

- di basso livello (es. assembly): le sequenze sono codificate in sequenze di caratteri alfa-

numerici ed è fortemente influenzato dal tipo di processore (computer), dunque dall’architettura della macchina.

Sintassi e semantica dei linguaggi:

- Sitassi : l’insieme di regole formali che dettano le modalità per costruire frasi corrette nel

linguaggio stesso.

- Semantica : l’insieme dei significati da attribuire alle frasi (sintatticamente corrette) costruite nel

linguaggio. Dunque da ciò si può intuire che una correttezza semantica implica una correttezza sintattica, ma non viceversa (infatti una frase scritta correttamente sintatticamente potrebbe non avere un significato). Processo: un’istanza di un programma in esecuzione. Processore: la componente hardware che si occupa di eseguire le istruzioni. Nei computer moderni possono esserci diversi processi in esecuzione dovuti a più istanze dello stesso programma, a istanze di diversi programmi o una combinazione delle due.

LINGUAGGIO PYTHON

  • (^) Linguaggio creato da Guido Van Rossum, ispirato ad una serie televisiva americana
  • Linguaggio molto potente, ma con una curva di apprendimento adatta a principianti e con tutte le funzionalità utili ad esperti
  • (^) Consente di focalizzare maggiormente l’attenzione sul ragionamento e meno sui problemi sintattici Vantaggi:
  • (^) Adatto per risolvere velocemente problemi
  • Si sta diffondendo notevolmente in ambito accademico, economico, finanziario, ecc.. Compromesso: Python usa una terminologia non standard rispetto ad altri linguaggi.

Componenti principali nel linguaggio di programmazione:

  • (^) Variabili
  • Istruzioni (di input e output, di assegnamento (calcoli), condizionali, di iterazione)
  • (^) Librerie—> programmi scritti da altre persone, in modo tale che si possano utilizzare le sue funzionalità senza doverle riscrivere (es. il calcolo della media aritmetica, la radice quadrata..)
  • (^) Script (o programma sorgente)—> file contenente un insieme di istruzioni, la cui esecuzione implica l’esecuzione ordinata di tutte queste istruzioni
  • Riga di comando (detta anche “prompt” o “interactive window”)—> in essa si può scrivere un’istruzione (una sola per ogni riga di comando)

Linguaggio:

#—> commento/promemoria print (.....) —> print (tradotto “stampa”) fa visualizzare il messaggio racchiuso tra le parentesi a video (se il messaggio sono numeri allora non lo metto tra gli apici, se è una stringa si) print(type(“...”))—> mi visualizza a video il tipo di variabile == —> per testare un’uguaglianza (se una è effettivamente uguale ad un’altra, con risposta true or false)

  • Esempio di script: #questo è un commento e non verrà visualizzato print ( ‘Hello world‘) #oppure anche: print ( “Hello world” ) Hello world

Nomi delle variabili:

  • Possono contenere solo lettere, numeri e il simbolo ‘_’ (il resto non è ammesso)
  • (^) Devono sempre iniziare con una lettera
  • Sono accettabili sia le lettere maiuscole sia quelle minuscole Naming convention—> suggerimenti di nomi da dare a delle variabili, al fine di facilitare la comprensione del codice (non è obbligatorio rispettarli) Dichiarazione delle variabili e assegnazione di valore—> per dichiarare una variabile basta effettuare un assegnamento; l’assegnazione di valore si effettua uguagliando la variabile ad un valore

Tipo di variabile:

Int —> numero intero Float —> numero decimale Str —> stringa Bool —> variabile booleana (può assumere solo due valori (es. true o false)) —> condiziona la semantica delle operazioni (es. sommare una stringa e un intero non è possibile)

  • ha la semantica di unione; * ha la semantica di ripetizione, ecc. Le operazioni ammesse (dipendenti dal tipo di variabili): +, -, *, /, **(—>elevamento a potenza)^ —> per variabili di tipo int o float
  • (unione), * (ripetizione), ... —> per variabili di tipo string (quindi parole/stringhe e non numeri)

Istruzioni input e output

Alcuni simboli per inframezzare testo con variabili : %d —> segnaposto della variabile di tipo intero %f —> per variabili il cui contenuto è di tipo float %s —> per variabili il cui contenuto è di tipo stringa \n —> segno speciale (non viene stampato e viene interpretato come ‘a capo’) Python 2 È possibile acquisire dati dalla tastiera; dunque offre la possibilità per input da tastiera. Input Raw_input La funzione raw_input() riconosce il valore come stringa. _Esempio di utilizzo dell’istruzione raw_input(): Frase = raw_input(“Digita qualcosa: ”) #es: digito: abc Print(‘Hai scritto: ‘+frase)

a video visualizzo:

Digita qualcosa: abc #input Hai scritto: abc #output_ L’istruzione input() invece cerca di individuare il tipo di dato inserito, sulla base di ciò che l’utente scrive a tastiera _Esempio: a=input(“Digita qualcosa: “) #digito: 5 Print(type(a))

a video visualizzo:

Digita qualcosa: 5 <type ‘int’>_ —>tuttavia input() crea dei ‘problemi’ perché Py si aspetta generalmente un valore numerico, dunque per inserire una stringa è necessario ‘aiutarlo’ racchiudendo il valore tra apici

Print di una collezione di valori:

Tupla: insieme di valori racchiusi tra () e separati da , (virgola) —> quindi posso inserire più variabili e anche stringhe _Esempio: a=5 ; b=9 # il ; permette di avere più istruzioni in una riga Print(a, “e’ inferiore a”, b)

a video visualizzo:

5 e’ inferiore a 9_

Commenti:

Simbolo: # —> per commentare una riga o come promemoria Attraverso l’uso di #, è possibile anche capire l’errore presente in una riga. Infatti, scrivendo davanti alla riga il simbolo #, sotto è possibile riscriverla passo dopo passo capendo in quale punto si trova l’errore.

Stringhe su più righe:

Simbolo: “”“ (oppure ‘’‘) —> comando di apertura (e/o chiusura) per una stringa Con il comando “”“ è possibile trasformare le righe da commentare in una stringa che si estende su più righe Es: a=“”“ Istruzione 1 ... Istruzione n “”“ Es 2 : “”“ Istruzione 1 ... Istruzione n “”“ Non occorre assegnare la stringa ad una variabile [Es 2 ] (quindi potrei togliere a= e lasciare solo “”“).

Operatore modulo:

Simbolo: % Operazione: calcola il resto della divisione intera tra due numeri _Es: print 5%

a video visualizzo:

2_ Questo simbolo ha anche il significato di ‘segnaposto’. Dunque:

  • (^) Se applicato ad una stringa e una struttura dati (detta tupla, ovvero insieme di valori racchiusi tra parentesi) assume significato di segnaposto.
  • Se applicato a operandi solo numerici, viene interpretato come calcolo del resto.

I SISTEMI OPERATIVI Hardware : insieme delle componenti fisiche, non modificabili, di un sistema di elaborazione dati (computer) (es. processore, alimentatori, unità di memoria (es Hard Disk, memoria RAM), monitor, tastiera, mouse, porte USB, ...). Software : indica le componenti logiche del computer e si divide in:

  • (^) Software applicativo : dedicato a soddisfare specifiche esigenze dell’utente (es. Posta Elettronica, Word Processor,...).
  • Software di sistema (o di base) : si basa sulla gestione delle risorse dell’elaboratore / gestisce le risorse hardware di sistema. Esso si divide in due categorie:
    • Sistema operativo: si occupa della gestione dell’hardware e delle risorse condivise del computer (es. per PC Windows, Mac OS, Linux; per gli smartphone IOS, Android, Windows)
    • Applicazioni di sistema : programmi, simili ai software applicativi, che si occupano di aiutare il sistema operativo (contribuiscono allo svolgimento delle sue attività). Non soddisfano direttamente le esigenze dell’utente, bensì supportano le altre applicazioni. Ad esempio si occupano della gestione delle reti WiFi (WiFi Manager). —> Il Software applicativo utilizza l’Hardware, mentre quello di sistema fa da mediazione tra il Software applicativo e l’Hardware stesso.
  • Infrastruttura Hardware : Hardware utilizzato per elaborare le informazioni

Storia

Epoca dei software monolitici Venivano sviluppati programmi che governavano tutti gli aspetti del computer, dalla gestione delle periferiche (monitor, keyboard, mouse,...) alla logica applicativa. Dunque non vi era distinzione tra il software applicativo e di sistema. Alcuni problemi: i software dovevano essere sviluppati da zero e per cambiare una componente hardware, era necessario modificare il software. Ma poi...

Separazione tra sistema operativo e software applicativo

Come avviene l’interazione tra i due? Il sistema operativo gestisce un’interfaccia che permette ai programmi applicativi di interagire con l’hardware senza dover gestire tutte le sue complessità. Il sistema operativo permette quindi di semplificare l’accesso all’hardware fornendo un’interfaccia, la quale non è altro che uno strumento che permette una mediazione tra software applicativo e il sistema operativo. Interfaccia : punto di contatto/di scambio di informazioni tra due componenti (hardware o software). Il concetto di interfaccia è utilizzato diverse volt a vari livelli all’interno del sistema operativo. Il sistema operativo per interagire con un componente hardware utilizza un Driver Driver : software utilizzato per gestire un componente hardware [Il Driver di periferiche è un esempio di interfaccia]. Esempio: Dopo aver attaccato la chiavetta ad un computer, il driver si occupa di gestire l’interazione con la periferica (pen drive) e il sistema operativo, il quale mostrerà poi il contenuto della chiavetta) Ogni hardware ha uno specifico driver specifico. Ogni driver ha un’interfaccia software in comune, perciò il sistema operativo sa che esiste una versione standard per interagire con il driver. In questo modo è possibile separare la gestione dell’hardware (che spetta al driver) rispetto a quella che è l’interazione di tutta la parte rimanente del sistema operativo con l’hardware (nel caso dell’esempio: il pen drive). Quest’ultima interazione avviene attraverso l’interfaccia. Lo stesso meccanismo viene utilizzato per gestire altre periferiche del computer, come ad esempio la tastiera, i mouse, le stampanti, ecc...

Alti aspetti legati ai file: oltre al contenuto, sono associate delle informazioni, dette metadati. Tra questi possiamo trovare la data e l’ orario di creazione o ultima modifica , il proprietario/creatore del file e i permessi di accesso al file. —> le stesse informazioni possono essere associate anche alle directory. —> nei sistemi Windows, l’estensione del file da informazioni su quale applicazione può aprire il file. Cambiando l’estensione, cambia anche l’applicazione associata al file. User Interface Due possibili tipologie di interfacce di interazione tra l’utente e il computer: GUI (Graphic User Interface): —> interfaccia utente grafica (interazione basata su finestre e pulsanti) CLI (Command Line Interface) : —> interfaccia a riga di comando (interazione basata su comandi digitati a tastiera) Shell (—>programma per interagire con il computer) : strumento di interpretazione con il computer e il sistema operativo basato su un paradigma CLI, utile per svolgere attività ripetitive o complesse. [Se ad esempio volessi eliminare 100 file, con l’interfaccia Graphic User Interface devo trascinare nel cestino 100 file, con l’interfaccia Command Line Interface basta un comando]. —> Attraverso una Shell è possibile gestire anche grossi dataset (in quanto la gestione può essere effettuata da server molto grandi, ai quali ci si connette via Shell in remoto). In una Shell è molto importante il concetto di directory ricorrente e il percorso relativo (sono infatti alcune delle informazioni che puoi trovare tramite questa).

Come aprire una Shell [Windows]:

Menù start - in cerca digitare ‘cmd’ - la Shell si apre

Alcuni comandi che si possono utilizzare da Shell [Windows]:

  • (^) ‘lettera disco’:\’nome directory di cui voglio avere le informazioni’
  • (^) dir —> mi indica il contenuto delle directory
  • copy —> copiare file in una directory [copy ’nome file da copiare’ ’directory di destinazione’]
  • (^) del —> eliminare un file
  • (^) python —> richiama l’interprete Python [ python ’nome file che contiene lo script da eseguire’]
  • idle —> ambiente che permette di editare ed eseguire i file python (apre lo script e ti permette eventualmente di modificarlo. Per vedere a video quello nuovo, mandare i esecuzione con il comando python). Bash : Shell dei sistemi Unix

Alcuni comandi che si possono utilizzare da Bash [Unix]:

  • pwd —> indica la directory di lavoro corrente
  • (^) ls —> per vedere il contenuto della directory (file al suo interno) [ ls ‘percorso rel. o ass.’ ]
  • (^) ls-lh —> se voglio avere maggiori informazioni sul file contenuto nella directory
  • mkdir old —> creare una cartella word (una nuova directory)
  • (^) cp —> copiare file [ cp ‘nome da copiare’ ‘directory di destinazione’ ]
  • (^) python —> richiama l’interprete Python [ python ’nome file che contiene lo script da eseguire’ oppure anziché il percorso relativo uso quello assoluto (scrivo tutte le directory e alla fine il file); quindi: python ‘percorso assoluto’]
  • (^) idle —> ambiente che permette di editare ed eseguire i file python (apre lo script e ti permette eventualmente di modificarlo. Per vedere a video quello nuovo, mandare i esecuzione con il comando python).

COME SI PROGRAMMA IN PYTHON Esistono 3 forme di interazione con l’interprete:

  • La linea di comando—>utile per testare piccole porzioni di codice e utilizzare l’interprete Python come una calcolatrice avanzata
  • Con codice sorgente—>utile per programmi più complessi. Infatti mi permette di scrivere porzioni di codice maggiori
  • Da notebook—>una buona via di mezzo che mi permette di visualizzare anche grafici Queste hanno caratteristiche differenti che le rendono utili in campi diversi. In ciascuna di esse l’interprete eseguirà un comando alla volta e segnalando eventuali errori.

Come funzionano a seconda di quello con cui voglio interagire:

Linea di comando

  1. Avvio dell’interprete dei comandi: ‘ python
  2. Introduzione dell’istruzione
  3. Output
  4. Introduzione dell’istruzione
  5. Output
  6. ...(istruzioni una alla volta) Quando si lavora da linea di comando, si interagisce con il Prompt , ovvero lo spazio dedicato alla scrittura delle varie istruzioni. È possibile uscire dell’interprete con il comando ‘exit()’ oppure con ctrl+D [versione più avanzata dell’interprete: ‘IPython’ che permette di accedere all’aiuto in linea, di richiamare istruzioni già precedentemente utilizzate ed è completamente automatico in alcune istruzioni del linguaggio.] Codice di sorgente
  7. Scrittura del file sorgente—> tramite un editor di testo (come ad esempio idle o atom ), creo e salvo con un nome ( es. sorgente.py ) il file contenente delle istruzioni. Dunque scrivo il nome dell’editor che voglio utilizzare + il nome del mio file (es. atom sorgente.py ). Successivamente si aprirà lo spazio dedicato alla scrittura delle istruzioni e una volta terminato si può eseguire il programma (punto 2).
  8. Esecuzione del programma—> tramite linea di comando, digito ‘python +nome file’ ( python sorgente.py ) e il calcolatore eseguirà in sequenza le istruzioni all’interno del programma. Notebook
  9. Si può lanciare dalla linea di comando attraverso l’istruzione ‘jupyter-notebook’.
  10. Successivamente si aprirà una pagina all’interno del nostro browser web e da qui si potrà iniziare ad editare il codice (punto 3).
  11. Creo il file e inizio ad inserire le istruzioni. Con shift+invio si possono separare i vari input/istruzioni Essendo un applicativo web, è necessario interromperlo con le seguenti funzioni: kernel - shoutdown e successivamente logout
  12. Per chiudere il programma nella linea di comando: Ctrl+C due volte Il metodo più conveniente per scrivere programmi più complessi è utilizzare un file sorgente. Per farlo nel modo più pulito e ordinata possibile è utile scrivere in modo ordinato le istruzioni, gestendo nel miglior modo gli spazi. Ad esempio se si vogliono importare delle librerie, è utile dedicare l’inizio del file all’importazione di quest’ultime.

LOGICA BOOLEANA La logica booleana permette di formalizzare dei criteri di scelta che possono poi essere applicati agli strumenti di elaborazione automatica delle informazioni e inoltre superare l’ambiguità del linguaggio naturale. Attraverso questa, si fa infatti uso di tecniche algebriche che vengono utilizzate per elaborare delle espressioni logiche. Espressione booleana: espressione che può assumere solo valore vero o falso ( True o False ). Si tratta di una combinazione ben formata di:

  • (^) Operandi (variabili e costanti)
  • (^) Operatori ( AND , OR , NOT , XOR , —> [implicazione], <—> [doppia implicazione] )
  • (^) Parentesi
  • (^) ...

Operandi:

Le variabili possono assumere solo due valori: True (vero, oppure 1) o False (falso, oppure 0). [es: ciclo if è un’espressione booleana]

Operatori:

e le rispettive tavole di verità:

—> Gli operatori AND e OR (detto anche ‘OR inclusivo’) si applicano a due variabili, mentre l’operatore NOT solo ad una. Inoltre l’operatore AND è anche detto operatore di moltiplicazione ; OR è detto operatore somma. L’operatore AND ha la precedenza su OR (moltiplicazione ha la precedenza sulla somma). —> L’operatore XOR (detto anche ‘OR esclusivo’) è vero quando o A o B sono veri, ma discordi (quindi uno deve essere vero e l’altro falso). L’operatore della doppia implicazione (<—>) è vero quando A e B sono concordi (quindi entrambi veri o entrambi falsi). L’operatore dell’implicazione singola (—>) è falso solo quando A è vero e B è falso [paragonabile alla verifica di un teorema: il teorema è falso quando l’ipotesi è vera e la tesi è falsa]. Alcune proprietà degli operatori booleani: Proprietà di De Morgan:

ISTRUZIONI CONDIZIONALI Istruzioni in linguaggio Python e corrispondenza in flow chart (rispettivamente a sx e a dx in entrambi gli esempi) A seguito della condizione if... : (deve sempre terminare con : per far capire dove termina la condizione) vi sarà obbligatoriamente il blocco di istruzioni indentato (di 4 spazi più a dx). Questo primo blocco potrebbe essere seguito (perché non sempre è necessario) da un altro blocco di istruzioni (inizializzato con else : , incolonnato alla condizione if) anch’esso indentato. —> Il valore booleano della condizione determina quale dei due blocchi verrà eseguito (se si verifica verrà eseguito il primo bocco di istruzioni; in caso contrario il secondo). Le due alternative, dette ramificazioni, rappresentano flussi alternativi di esecuzione; perciò, per distinguerli, Python usa l’indentazione. Dunque, grazie a questa, si riconosce a quale delle ramificazioni appartiene un’istruzione. —> temporaneamente, se non si sa subito che blocco di istruzioni scrivere dopo l’if, si potrebbe mettere ‘pass’ così che non venga segnalato errore. Condizioni annidate: un’espressione condizionale inserita nel corpo di un’altra espressione condizionale (dunque nel ramo true e/o false sarà presente un’altra espressione condizionale). Istruzioni alternative a più vie: sono presenti più espressioni condizionate, le quali risulteranno quindi annidate. In questo caso può avvenire una semplificazione delle condizioni attraverso l’utilizzo dell’abbreviazione di ‘else if’, ovvero ‘ elif ’ (se ci sono più condizioni). In un blocco di questo tipo l’istruzione ‘else’ è facoltativa; se presente, deve essere l’ultima dell’elenco e rappresenta l’azione da eseguire nel caso in cui nessuna delle condizioni precedenti è stata soddisfatta.

Operatori a confronto:

Per effettuare un confronto tra due valori viene utilizzato il simbolo ==. Come risposta verrà prodotto un risultato di tipo boolenano (quindi si ricaveranno i valori booleani di Python, ovvero True o False).

Operatori logici:

Verranno utilizzati gli operatori, già presentati precedentemente, delle espressioni booleane, ad esempio le istruzioni AND, OR o NOT.

STRUTTURE DATI Una struttura dati è un modo per memorizzare, organizzare i dati e semplificarne l’accesso e la modifica. Esse possono essere classificate per:

  • (^) l’ aggregazione dell’informazione
  • (^) la plasticità dell’informazione nel tempo —> da come varie nel tempo
  • (^) l’ omogeneità dell’informazione

Aggregazione:

Le strutture dati possono essere divise in semplici , se atomiche e divisibili (quindi si ha un unico elemento impossibile da sperare in più unità), e complesse , se gli elementi semplici vengono aggregati tra loro. Tipologia di aggregazione: Le aggregazioni complesse prendono il nome di insieme se gli elementi sono organizzati in maniera disordinata; sequenza se sono organizzati in maniera ordinata; mappa se gli elementi sono organizzati secondo un riferimento fisso.

Plasticità:

Le strutture dati, secondo la loro plasticità, possono essere suddivise in statiche se gli elementi che le compongono sono organizzati e hanno dimensioni fisse (dunque sono immutabili); al contrario saranno dinamiche se gli elementi avranno un’organizzazione interna e delle dimensioni variabili (dunque saranno mutabili).

Omogeneità:

Le strutture dati, infine, presentano un’ulteriore suddivisione in base alla loro omogeneità. Saranno dunque omogenee nel caso in cui siano composte da elementi atomici aventi lo stesso tipo primitivo; oppure eterogenee nel caso in cui siano composte da elementi atomici aventi diverso tipo primitivo.

Metodi:

Un’altra caratteristiche che si può associare alle strutture dati è l’esistenza dei metodi. Alcune strutture dati, specialmente quelle complesse, hanno associato a ciascuna tipologia dei metodi (ovvero delle funzioni predefinite) che possono essere applicati alle loro istanze. Ciò è utile nel caso in cui ci siano funzioni di utilizzo frequente, rendendo più semplice la programmazione. Esempio: —> metodo upper, per rendere tutte le lettere maiuscole: Print unaStringa.upper()

Tipo primitivo:

La struttura dati più semplice è quella scalare (ad esempio una variabile; essa infatti ha un nome e un contenuto). A questa variabile scalare viene associato il tipo primitivo del contenuto della variabile, il quale può essere numerico o logico. Per accedere alla tipologia di una struttura dati, si può interrogare la nostra istanza con la funzione type() , ottenendo in risposta il tipo primitivo associato a quella struttura dati.

STRINGHE:

Le stringhe sono delle strutture dati complesse, quindi aggregano più elementi (una parola è un insieme di caratteri); possiedono un nome e aggregano più stringhe di un elemento (insieme di più parole, le quali sono il risultato di un’aggregazione di caratteri) organizzate sequenzialmente (infatti è possibile utilizzare un ordinamento, numerando da 0 fino a n-1, dove n è il numero di caratteri che compongono la stringa). Dunque: la stringa è una struttura dati complessa di tipo sequenza , statica ed omogenea. La stringa è una struttura dati immutabile ; ciò sta a significare che non è possibile cambiare un carattere che la compone (non posso cambiare una lettera di una parola/insieme di parole). Una stringa viene dichiarata delimitandola con i seguenti caratteri: ‘ ’ oppure “ ”. Esempio__Considerando la seguente stringa: a=“corso di informatica”

- (^) Chiedendo: a[4] Otterremo in risposta: ‘o’ (perché la o è il carattere che si trova nella posizione 4) - (^) Nel caso in cui si chieda un indice negativo: a[-1] —> in risposta: ‘a’ [a è l’ultimo carattere che compone la stringa] - (^) Se voglio interrogare la struttura dati per sapere quanto è lunga—>uso la funzione: len(a) [dunque nel caso dell’esempio avremo in risposta: 20] - (^) Slicing : mi permette di separare, e quindi visualizzare, una parte dei caratteri che compongono una stringa. ( i : sono utilizzati per indicare a quale carattere bisogna fermarsi —> « fermati fino al carattere 4 » diventerebbe: a[:4] ) [esempio: a[:5] —> in risposta: ‘corso’ ; a[9:] —> ‘informatica’ ; a[-6:-3] —> ‘mat’ ; a[-3:] Numero prima dei : —> dove voglio partire Numero dopo i : —> fino a dove voglio arrivare Se il secondo numero è seguito da altri : e un terzo numero —> questo indicherà ogni quanto estrarre un elemento [Per farmi mostrare un elemento ogni 2: a[::2] —> in risposta: ‘crod nomtc’] Stringhe e ciclo while: È possibile visitare (e visualizzare a video) tutti gli elementi di una stringa attraverso il ciclo while. Operatore di concatenazione: È possibile estendere le stringhe tramite l’operatore di concatenazione +. (La stringa non viene mutata al suo interno, bensì viene aggiunto un nuovo oggetto). Alcuni metodi per utilizzare le stringhe:

  • (^) upper() —> restituisce la stringa in maiuscolo
  • (^) find(stringToFind) —> restituisce l’indice del carattere cercato della stringa o -1 se non viene trovato
  • (^) count(subStr) —> restituisce il conteggio della sotto-stringa all’interno della stringa principale
  • (^) split([sep]) —> frammenta la stringa restituendola come una lista di più stringhe separate dall’elemento separatore (al posto di sep)
  • (^) strip([chars]) —> spoglia la stringa dei caratteri che vengono passati come parametro (al posto di char)
  • (^) ... (per saperne altri è possibile consultare il sito https://docs.python.org/2.7/library/stdtypes.html#string-methods) Esempi:

LISTE:

Le liste sono delle strutture dati complesse e aggregano più oggetti, i quali sono organizzati in maniera sequenziale (infatti è possibile utilizzare un ordinamento, numerando gli elementi da 0 fino a n-1, dove n è il numero di caratteri che compongono la lista). Esse sono inoltre le strutture dati più comunemente utilizzate in Python. Dunque: la lista è una struttura dati complessa di tipo sequenza , dinamica ed eterogenea. La lista è una struttura dati mutabile ; ciò sta a significare che è possibile cambiare gli elementi che la compongono [**]. Una lista viene dichiarata con i seguenti caratteri: [ ,] Esempio__Considerando la seguente lista: l=[7, 3.0+5, ‘pippo’, 2+1j] —>dove l è il nome; [ ] i delimitatori; ciò che contengono sono gli elementi e la , è il separatore

- (^) Chiedendo: print l[3] Otterrò in risposta: (2+1j) (perché 2+1j è l’elemento in posizione 3) - (^) Nel caso in cui si chieda un indice negativo: l[-2] —> in risposta: ‘pippo’ [penultimo elemento della lista] - (^) Se voglio interrogare la struttura dati per sapere quanto è lunga—>uso la funzione: len(l) [dunque nel caso dell’esempio avremo in risposta: 4 ; ovvero il numero degli elementi della lista] - (^) La lista è una struttura dati mutabile. [**esempio: >>> l[2] = ‘nuova’ ; >>>print l —> a video: [7, 8.0, ‘nuova’, (2+1j)] ] - (^) Slicing : mi permette di separare, e quindi visualizzare, una parte degli elementi di una lista. ( i : sono utilizzati per indicare a quale elemento bisogna fermarsi —> «fermati fino all’elemento in posizione 2» diventerebbe: l[:2] ) [esempio: l[:2] —> in risposta: [7, 8.0] ; l[2:] —> [‘pippo’, (2+1j)] ; l[1:3] —> [8.0, ‘pippo’] ] Numero prima dei : —> dove voglio partire Numero dopo i : —> fino a dove voglio arrivare Liste e ciclo while: È possibile visitare (e visualizzare a video) tutti gli elementi di una lista attraverso il ciclo while. Operatore di concatenazione: È possibile estendere le liste tramite l’operatore di concatenazione +. (La lista non viene mutata al suo interno, bensì viene aggiunto un nuovo oggetto). Alcuni metodi per utilizzare le liste:

  • (^) append(x) —> aggiunge l’elemento x in coda alla lista
  • (^) extend(lista2) —> aggiunge la lista2 in coda alla (prima) lista
  • (^) del lista[ i ] —> elimina l’elemento i-esimo dalla lista
  • (^) sort( ) —> ordina la lista
  • (^) ... (per saperne altri è possibile consultare il sito https://docs.python.org/2.7/library/stdtypes.html#mutable-sequence-types ) Esempi: Copia di liste: Nel caso in cui si voglia copiare una lista per crearne un’altra identica da manipolare è possibile utilizzare il comando list(). Questa funzione è necessaria perché se avessi posto unicamente la seconda lista = alla prima, nel caso in cui in seguito avessi apportato delle modifiche ad una delle due, esse sarebbero state fatte anche sull’altra lista.

DIZIONARI:

I dizionari sono delle strutture dati complesse e aggregano più oggetti, i quali sono identificabili tramite una chiave, in una mappa (infatti è possibile utilizzare un ordinamento, numerando le chiavi da 1 fino a n, dove n è il numero di chiavi che compongono il dizionario). Dunque: il dizionario è una struttura dati complessa di tipo mappa , dinamica ed eterogenea , i cui elementi vengono identificati tramite una chiave. Il dizionario è una struttura dati mutabile ; ciò sta a significare che è possibile cambiare gli elementi che lo compongono [**]. Un dizionario viene dichiarato con i seguenti caratteri: {‘chiave’:valore ,} Esempio__Considerando il seguente dizionario: diz = { ‘a’: 7, ‘b’: 3.0+5, ‘c’: ‘pippo’, ‘d’: 2+1j } dove diz è il nome; { } i delimitatori; ciò che contengono sono le coppie ‘chiave’ : valore e la , è il separatore delle coppie

- (^) Non è possibile chiedere con un valore numerico una sola coppia di chiave:valore, in quanto si tratta di un insieme di valori. Dunque si potrà chiedere solo una chiave, ricevendo come risposta il rispettivo valore. - (^) [esempi: >>>print diz —> in risposta: { ‘a’: 7, ‘b’: 8.0, ‘c’: ‘pippo’, ‘d’: 2+1j } ; >>>print diz[‘b’] —> 8.0 ] - (^) Se voglio interrogare la struttura dati per sapere quanto è lunga—>uso la funzione: len(diz) [dunque nel caso dell’esempio avremo in risposta: 4 ; ovvero il numero delle coppie chiave:valore del dizionario] - (^) Il dizionario è una struttura dati mutabile. - (^) [**esempio: >>> diz[‘c’] = ‘nuovo’ ; >>>print diz —> a video: { ‘a’: 7, ‘b’: 8.0, ‘c’: ‘nuovo’, ‘d’: (2+1j) } Metodi per utilizzare i dizionari:

  • (^) keys( ) —> restituisce la lista delle chiavi contenute nel dizionario
  • (^) values( ) —> restituisce la lista dei valori contenuti nel dizionario Esempi:

È possibile costruire un iteratore per eseguire un numero prefissato di iterazioni tramite il comando range(). Comando range(): Esempio : Mi stampa le posizioni (il corrispondente numero) della lista “lista”. Dunque “iterabile” corrisponde ad una lista contenente le posizioni della lista “lista” [questo perché ho utilizzato il comando range sulla lunghezza della lista —> range(len(lista)) ]. L’elemento “indice” viene riconosciuto come il nome degli elementi all’interno della lista “iterabile”. Quindi con il comando print stampo gli elementi (indicati con “indice”) della lista “iterabile” e gli elementi (corrispondenti a ciascun elemento “indice”) della lista “lista”. Infatti il primo “indice” (primo elemento della lista “iterabile”) , ovvero 0, è legato all’elemento in posizione 0 della lista “lista”, ovvero “uno”, [questo dall’istruzione iterabile = range(len(lista)) ]; dunque ecco il perché dell’istruzione lista[indice].

LISTE BIDIMENSIONALI:

Una lista bidimensionale può essere considerata una lista di liste organizzate sequenzialmente. Una lista di liste viene indicata con: [ [ ], ..., [ ] ] Le liste bidimensionali sono vantaggiose al fine di organizzare al meglio, e nel modo più comprensibile, le informazioni; dunque sono comode e ordinate. Le liste di liste permettono di automatizzare il processo tramite gli indici : Essi mi aiuteranno a capire se mi sto riferendo alla riga (lista) o alla colonna (elemento n-esimo di ciascuna lista). Infatti supponendo di avere una lista di liste denominata M M[0] corrisponderà alla prima lista all’interno della grande lista M M[0][0] corrisponderà al primo elemento della prima lista contenuta nella grande lista M Nel caso in cui si volesse fare : La somma per ogni colonna di ciascuna riga (somma elementi di ciascuna lista): sommaRiga=M[0][0] + M[0][1] + ... + M[0][n-1] Ovvero: Ma avendo più righe: Faccio quindi prima la somma di ogni riga e poi sommo i risultati. La somma per ogni riga di ciascuna colonna: sommaColonna=M[0][0] + M[1][0] + ... + M[n-1][0] Ovvero: Ma avendo più colonne (per ciascuna lista ho più elementi): Faccio quindi prima la somma di ogni colonna e poi sommo i risultati.