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


Algoritmi e Complessità Computazionale, Sintesi del corso di Bioinformatica

Una panoramica sugli algoritmi e sulla complessità computazionale, con particolare focus sugli algoritmi di allineamento delle sequenze biologiche e sugli algoritmi di ispirazione biologica come il machine learning. Vengono discusse le proprietà fondamentali degli algoritmi, la differenza tra linguaggi di programmazione e linguaggi naturali, l'analisi della complessità computazionale, il funzionamento degli algoritmi di allineamento globale e locale, e alcuni esempi di algoritmi di ispirazione biologica come le reti neurali, le support vector machine e gli alberi di decisione. Inoltre, il documento include una breve introduzione alla sintassi e ai simboli di python per la programmazione. Complessivamente, il documento offre una solida base teorica e pratica sugli algoritmi e la loro implementazione informatica, con particolare attenzione alle applicazioni in ambito biologico e bioinformatico.

Tipologia: Sintesi del corso

2021/2022

Caricato il 31/07/2024

lyplax
lyplax 🇮🇹

1 documento

1 / 21

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
FONDAMENTI DI BIOINFORMATICA
Anno I, Semestre I
ALGORITMO
Insieme ordinato di istruzioni eseguibili e non ambigue,
che definiscono un processo che termina” ( es. Protocollo sperimentale)
Input Algoritmo Output Es. Problema di somma:
(dati) (risultato) 2, 2 2 + 2 4
Possono esistere più algoritmi per risolvere uno stesso problema
L’algoritmo deve essere in grado di risolvere il problema qualsiasi siano i dati
Proprietà fondamentali degli algoritmi N.B. Se un algoritmo non le soddisfa, è una
“procedura”, ed è impossibile a livello informatico
1. Sequenzialità La sequenza delle istruzioni è specifica e non casuale per ogni algoritmo
2. Eseguibilità Le istruzioni devono poter essere eseguite
3. Determinatezza Le istruzioni devono essere univocamente determinate, cioè non avere
alternativa di interpretazione
4. Terminazione L’algoritmo deve essere composto da un n. finito di istruzioni
[N.B. non si sta parlando di tempo di calcolo]
5. Input e output Bisogna conoscerne la natura e comprendere nell'algoritmo i casi
6. specificati particolari di input (es. divisione per zero)
PROGRAMMA
Algoritmo espresso in un linguaggio di programmazione di alto livello”
Linguaggio di programmazione Linguaggio formale, univocamente interpretabile
(vs naturale, soggetto a interpretazione)
Ogni linguaggio di programmazione ha una sintassi ben definita
Uno stesso algoritmo può essere implementato con linguaggi di programm. diversi
Rappresentazione di un programma
È indipendente dalla sintassi specifica di un linguaggio di programmazione
Deve essere comprensibile eleggibile
Rappresentazione grafica Flow chart
Rappresentazione scritta Pseudocodice, linguaggio intuitivo che descrive le istruzioni di
un algoritmo, a metà tra linguaggio formale e naturale
1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15

Anteprima parziale del testo

Scarica Algoritmi e Complessità Computazionale e più Sintesi del corso in PDF di Bioinformatica solo su Docsity!

FONDAMENTI DI BIOINFORMATICA

Anno I, Semestre I

ALGORITMO

Insieme ordinato di istruzioni eseguibili e non ambigue, che definiscono un processo che termina” ( → es. Protocollo sperimentale) InputAlgoritmoOutput Es. Problema di somma: (dati) (risultato) 2, 2 → 2 + 2 → 4 → Possono esistere più algoritmi per risolvere uno stesso problema → L’algoritmo deve essere in grado di risolvere il problema qualsiasi siano i dati Proprietà fondamentali degli algoritmi N.B. Se un algoritmo non le soddisfa, è una “procedura”, ed è impossibile a livello informatico

  1. Sequenzialità La sequenza delle istruzioni è specifica e non casuale per ogni algoritmo
  2. Eseguibilità Le istruzioni devono poter essere eseguite
  3. Determinatezza Le istruzioni devono essere univocamente determinate, cioè non avere alternativa di interpretazione
  4. Terminazione L’algoritmo deve essere composto da un n. finito di istruzioni [N.B. non si sta parlando di tempo di calcolo]
  5. Input e output Bisogna conoscerne la natura e comprendere nell'algoritmo i casi 6. specificati particolari di input (es. divisione per zero)

PROGRAMMA

Algoritmo espresso in un linguaggio di programmazione di alto livello” Linguaggio di programmazione → Linguaggio formale , univocamente interpretabile (vs naturale , soggetto a interpretazione) ▪ Ogni linguaggio di programmazione ha una sintassi ben definita ▪ Uno stesso algoritmo può essere implementato con linguaggi di programm. diversi

Rappresentazione di un programma

▪ È indipendente dalla sintassi specifica di un linguaggio di programmazione ▪ Deve essere comprensibile e leggibile Rappresentazione graficaFlow chart Rappresentazione scrittaPseudocodice , linguaggio intuitivo che descrive le istruzioni di un algoritmo, a metà tra linguaggio formale e naturale

PROGRAMMAZIONE STRUTTURATA (1970)

Paradigma di programmazione (= metodologia) usato per la stesura di programmi” → Basato su tre strutture di controllo fondamentali

  1. Sequenza Le istruzioni di un programma sono eseguite nell’ordine esatto in cui compaiono Leggi input Istruzione Scrivi risultato
  2. Selezione Permette di scegliere tra opzioni mutualmente esclusive in base ad una condizione IF condizione THEN istruzione 1 ELSE istruzione 2
  3. Iterazione Permette di ripetere l’esecuzione di un blocco di istruzioni per un certo numero di volte o in base al valore di una condizione. Esistono tre schemi iterativi: a) Iterazione FOR Per eseguire un’istruzione per un numero di volte conosciuto a priori. FOR (n. di volte) DO istruzione es. Somma dei primi n numeri interi (con n > 0) es. Calcolo di 𝑛 con n, m > 0 e interi 𝑚 Leggi n Leggi n, m Somma ← 0 Mult ← 1 FOR (i ← 1 to n) DO FOR (i ← 1 to m) DO Somma ← somma + i Mult ← mult • n i ← i + 1 i ← i + 1 Scrivi somma Scrivi Mult

COMPLESSITÀ COMPUTAZIONALE

Un algoritmo è tanto più efficiente quanto più sfrutta al meglio le risorse del computer:

  • Spazio di memoria
  • Tempo di calcolo [ non aumentabile!] N.B. tempo di calcolo ≠tempo fisico tempo di calcolo ≃n. di istruzioni (→ Non dipende dal computer/dall’implementazione, ma solo dall’efficienza dell’algoritmo) Complessità computazionale: carattere di un algoritmo che analizza il numero di operazioni necessarie a risolvere un determinato problema in funzione del numero di dati da trattare. → Quanto cresce il numero di istruzioni al crescere della dimensione dell’input? Calcolo della complessità computazionale: analisi del comportamento asintotico Complessità Scrittura Esempio Efficienza COSTANTE O(1)^ Formula di Gauss Efficiente LINEARE O( )𝑛^ MEAS Efficiente LOGARITMICA O(^ 𝑛𝑙𝑜𝑔(𝑛))^ Efficiente POLINOMIALE (^) O( 𝑛𝑘)^ OrdinaCD 2 ≤ 𝑘 < 3→ efficiente per dimensioni medie dell’input, tempi fisici di calcolo ragionevoli 𝑘 ≥ 3 → tempi fisici di calcolo: proibitivi ESPONENZIALE (^) O( 𝑎𝑛)^ / Inefficiente: i tempi fisici di calcolo sono proibitivi anche per input di dimensioni piccole Classificazione di problemi di decisione (= problema con risposta sì/no)
  1. Problemi P (Polynomial) “Problemi di decisione che possono essere risolti con una macchina di Turing deterministica* in un tempo di calcolo polinomiale rispetto alla dimensione dell’input” → Risolvibili con un computer (= una macchina deterministica)
  2. Problemi NP (Non deterministic Polynomial) “Problemi di decisione che possono essere risolti con una macchina di Turing non deterministica* in un tempo di calcolo polinomiale rispetto alla dimensione dell’input ~ oppure ~ le cui soluzioni possono essere verificate in un tempo di calcolo polinomiale” → Un algoritmo non deterministico di complessità polinomiale se trasformato in un algoritmo deterministico avrà complessità esponenziale

2b. Problemi NP-completi Problemi per i quali non sono ancora stati trovati algoritmi efficienti ma non c’è certezza che tali algoritmi non esistano: se venisse fornita una soluzione, si potrebbe verificare in un tempo di calcolo polinomiale. → es. percorso di Hamilton *[Una macchina di Turing è una macchina ideale o un modello di calcolo che manipola dati potenzialmente infiniti secondo regole precise. In una macchina di Turing deterministica , l'insieme di regole prescrive al massimo una azione da eseguire per ogni data situazione , mentre in una macchina di Turing non deterministica le regole di governo specificano più di una possibile azione in determinate situazioni: lo stato successivo non è completamente determinato dallo stato attuale.]

BANCHE DATI BIOLOGICHE

Le banche dati biologiche sono archivi elettronici ben strutturati per memorizzare , classificare e reperire grandi quantità di dati nel tempo. Contengono informazioni derivanti da analisi in vivo, in vitro e in silico , e dalla letteratura scientifica. ▪ Banche dati primarie → banche dati contenenti sequenze di acidi nucleici (DNA, RNA)

  • Ogni entry contiene poche informazioni sulla sequenza (es. specie da cui è derivata, classificazione tassonomica, esoni/introni, etc.)
  • L’informazione contenuta nelle banche dati primarie è spesso ridondante e non curata - A ogni sequenza inserita viene assegnato un accession number , un numero identificativo univoco che non varia anche se la entry subisce successive modifiche Consorzio “International Nucleotide Sequence Database” N.B. contengono tutte
  1. DNA DataBank of Japan ( DDBJ - Giappone) gli stessi dati grazie a
  2. European Molecular Biology Laboratory ( EMBL - Europa) sincronizzazione ogni
  3. GenBank ( NCBI - USA) 24 h, per la sicurezza massima nella preservazione dei dati ▪ Banche dati secondarie → banche dati che servono per aggiornare e classificare i dati delle banche dati primarie, con:
  • la correzione di eventuali errori
  • l’inclusione di informazioni aggiuntive dalla letteratura scientifica o da altre banche dati Esempi di banche dati secondarie
  • RefSeq , Reference Sequences
  • UniProt , Universal Proteins resource
  • PDB , Protein Data Bank

Calcolo di allineamenti multipli

L’allineamento multiplo è un problema NP-completo : per confrontare più sequenze contemporaneamente si utilizzano tecniche euristiche. Se si applicasse l’algoritmo di Needleman-Wunsch esso avrebbe complessità computazionale esponenziale 𝑂(𝑛 con 𝑘 ) 𝑘 ≥ 3

Ricerche di allineamenti simili in banche dati

Per le ricerche in banche dati si utilizzano metodi euristici : l’uso dell’algoritmo di allineamento comporterebbe tempi fisici di calcolo proibitivi , in quanto bisogna confrontare la propria sequenza con molti milioni di sequenze memorizzate. → es. BLAST ( Basic Local Alignment Search Tool ): tecnica euristica per effettuare allineamenti locali fra sequenze di nucleotidi (es. blastn) o amminoacidi (es. blastp)

  1. Data la sequenza query, viene formato un elenco di sue sottosequenze di lunghezza W
  2. Per ogni sottosequenza di lunghezza W, viene creata una lista di W-mer ( = sequenze affini) → fra queste vengono selezionate solo quelle che superano una soglia di affinità
  3. Dalla banca dati vengono poi selezionate le hit → sequenze che contengono almeno una porzione di lunghezza W uguale o molto simile a uno dei W-mer. L’allineamento verrà calcolato solo sulle sequenze che contengono le hit , tutte le altre sequenze presenti nella banca dati vengono scartate
  4. Partendo dalla corrispondenza fra W- mer e hit, l’allineamento si estende a monte e a valle degli hit senza inserire gap → allineamenti locali
  5. L’allineamento si estende tenendo conto di due parametri: - Parametro X , soglia massima di perdita di punteggio dell’allineamento: se l’allungamento inserisce coppie che portano la somiglianza sotto il valore X, allora l’ allungamento viene interrotto - Parametro S , soglia minima di punteggio che deve avere un HSP significativo : se una sequenza nella banca dati non contiene HSP (High Scoring Pairment) con punteggio superiore a S, non verrà inclusa fra le sequenze simili alla query. Per ogni sequenza simile alla sequenza query riportata da BLAST sono presenti questi dati:
  • La descrizione della sequenza e l’ Accession Number
  • L’ allineamento locale
  • Il punteggio dell’allineamento (ottenuto con il sistema di punteggio impostato)
  • La query coverage , la percentuale di residui della query inclusa
  • La percentuale di identità , il numero di residui della query conservati
  • L’ e-value , il numero di allineamenti probabili con punteggio uguale o maggiore di S È un valore che stima la probabilità che l’allineamento ottenuto sia dovuto al caso. Tanto è più piccolo di 1, tanto migliore sarà l’allineamento.

ASSEMBLAGGIO di GENOMI

L’ assemblaggio di un genoma è la ricostruzione della sua sequenza intera. Avviene in due step:

  1. Sequenziamento ⟶ si sequenziano piccoli frammenti del genoma, ottenendo i read
  2. Assemblaggio ⟶ si trova l’ordine con cui concatenare i read. N.B. Un esempio di database per la navigazione di genomi è UCSC Genome Browser , che si appoggia a banche dati come RefSeq. Come leggere un trascritto Esoni Frammenti spessi = regioni codificanti Frammenti sottili = regioni non codificanti Introni Frecce da sx a dx [] = filamento 5’3’ ( + ) Frecce da dx a sx [] = filamento 3’5’ ( )

STEP 1: SEQUENZIAMENTO dei frammenti

a) Generare frammenti tronchi che dall’estremità 5’ si estendono ciascuno fino al primo, al secondo, al terzo, ecc. fino all’ultimo nucleotide dello stesso tipo presente nella sequenza. b) Separare i frammenti tronchi tramite elettroforesi su gel, e identificare le posizioni in cui si trovano tutti i nucleotidi del tipo preso in esame. c) Ripetere le operazioni per gli altri tre tipi di nucleotidi.

Tipi di tecniche di sequenziamento

▪ TECNICHE DI PRIMA GENERAZIONE

Metodo chimico (Gilbert-Maxam) Vantaggio: lettura accurata

  1. Sfrutta la PCR per generare un numero molto alto di copie della molecola da sequenziare, ogni copia viene marcata all’estremità 5’ con un atomo di fosforo radioattivo
  2. Specifiche reazioni chimiche modificano una delle quattro basi e il taglio del frammento avviene in corrispondenza delle modificazioni
  3. Per determinare la posizione di ciascuna base, si usa l’ elettroforesi su gel andando a rilevare solo i frammenti tronchi radioattivi
    1. La stessa procedura è ripetuta in provette separate per le altre tre basi
  1. Grazie alla complementarietà fra adattatori e oligonucleotidi, viene effettuato un processo di amplificazione a ponte ( bridge amplification ), che genera i cosiddetti « cluster clonali » di ogni frammento (ogni cluster è costituito da circa un milione di copie)
  2. Il sequenziamento dei frammenti è basato su un processo di sintesi del DNA tramite l’uso di deossinucleotidi marcati con fluorofori di colori diversi, che generano un segnale di fluorescenza ▪ TECNICHE DI TERZA GENERAZIONE Vantaggi -Effettuano il sequenziamento del DNA a singola molecola: non richiedono amplificazione clonale
  • Generano read di lunghezza significativamente maggiore Piattaforme - Pacific Bioscience (PacBio) [Tasso di errore: 15-20%] Con strumenti ottici monitora in tempo reale l’ attività di una DNA polimerasi impegnata nell’allungamento di una catena di DNA
  • Oxford Nanopore Technology (ONT) [Tasso di errore: 20%] Il sequenziamento viene effettuato misurando l’ alterazione di corrente che si verifica quando la molecola di DNA attraversa un nanoporo proteico

STEP 2: ASSEMBLAGGIO del genoma

Obiettivo Concatenare le read per formare contig , sequenze contigue di dimensioni maggiori idealmente corrispondenti a diverse porzioni del genoma. → L’assemblaggio del genoma è un problema NP-hard Difficoltà • Lunghezza limitata e imprecisioni delle read

  • Sequenze ripetitive nel genoma: read simili fra loro, ma provenienti da zone diverse del genoma Fasi del problema di assemblaggio del genoma 1. Overlap L’identificazione della somiglianza fra coppie di read con algoritmi di allineamento. 2. Layout La ricostruzione dell’ ordine corretto delle read. [N.B. due read ad alta somiglianza probabilmente provengono dallo stesso tratto del genoma] 3. Consensus La generazione della sequenza consensus , la sequenza più probabile dei frammenti ricostruiti in fase di layout mediante la sovrapposizione delle read ordinate.

ALGORITMI DI ISPIRAZIONE BIOLOGICA

Gli algoritmi di ispirazione biologica sono tecniche euristiche sfruttate per trovare soluzioni non esatte, ma soddisfacenti, a problemi NP-hard come il folding proteico o il docking molecolare , per i quali non è possibile trovare la soluzione esatta con un algoritmo classico. Prevedere il folding proteico senza ricorrere a metodi sperimentali ⟶ [es. cristallografia a oppure prevedere come avviene il docking molecolare significa raggi X, risonanza risolvere un problema di ottimizzazione : la struttura nativa, o il magnetica nucleare complesso enzima-ligando, è quello che minimizza il valore (NMR), microscopia dell’energia libera associata alla struttura. crio-elettronica] Un problema di ottimizzazione ha generalmente un numero molto alto o infinito di soluzioni: ogni potenziale soluzione può essere caratterizzata da un valore che rappresenta la sua qualità, definito sulla base di una funzione di fitness. Fra tutte le potenziali soluzioni, si vuole trovare la soluzione ottima , cioè quella che ha valore di minimo/massimo globale nella funzione di fitness. Esempi di algoritmi di ispirazione biologica

  1. Ant colony Optimization
  2. Particle Swarm Optimization
  3. Algoritmi genetici Invece di testare tutte le soluzioni possibili, si lavora su un numero ridotto di soluzioni che sono fatte evolvere per trovare soluzioni che siano migliori delle precedenti, sfruttando meccanismi simili alla:
  • Selezione naturale → vengono selezionate le soluzioni migliori (es. tournament selection)
  • Riproduzione sessuata → si combinano tra di loro le soluzioni migliori ottenendo delle soluzioni “figlie”, derivate dal crossover delle due soluzioni di partenza, e si possono modificare piccole parti di una soluzione con una mutazione.

MACHINE LEARNING

Il machine learning è una branca dell’ intelligenza artificiale ( = insieme di tecniche che tentano di programmare i computer in modo che essi ragionino e agiscano come esseri umani ) che comprende algoritmi che programmano un computer in modo che esso possa apprendere in maniera automatizzata , fornendo loro “esempi guida”, cioè informazioni derivate da osservazioni della realtà, che il computer deve saper generalizzare in modo da saper interpretare correttamente dati che l’algoritmo non ha mai elaborato in passato. N.B. “Apprendere” è un problema di ottimizzazione , la cui soluzione è il modello che restituisce l’errore minimo: la “qualità” dei modelli è valutata su una funzione obiettivo o loss

Una strategia per ottimizzare i risultati è la k-fold cross-validation , ovvero la divisione del dataset in K subsets : si addestrano e si valutano un numero k di modelli, utilizzando come training set tutti i K subsets meno uno, che sarà il validation set. Dalla combinazione delle valutazioni dei vari modelli durante le validazioni si ottiene una stima della capacità di predizione del modello.

Categorie di algoritmi ML

  1. Reinforcement learning , utile per problemi in cui le azioni future dipendono dalle risposte restituite ed è necessario prevedere le azioni (es. navigazione robotica)
  2. Algoritmi supervisionati (es. Reti neurali, cfr ↓) L’apprendimento avviene fornendo dati “esempio” associati a risposte (es. categorie, valori numerici), in modo che l’algoritmo impari dagli esempi a prevedere la risposta corretta quando gli vengano forniti dati nuovi. È utile per problemi di: - Classificazione , previsione di una categoria (es. sistemi diagnostici) - Regressione , previsione di un numero (es. previsioni di sviluppo demografico)
  3. Algoritmi non supervisionati Vengono forniti dati grezzi non categorizzati al computer, che trova delle features nei dati secondo cui creare delle categorie , utili per ottenere informazioni sul significato dei dati analizzati. Serve per risolvere problemi di: - Clustering , divisione in classi simili (es. marketing specifico) - Associazione , identificazione di sequenze ripetute nei dati - Dimension reduction , identificazione di dipendenze nei dati - Anomaly detection , identificazione di anomalie (es. presenza di hacker)

Neural networks e Deep learning

Una rete neurale è un algoritmo di ML formato da layer di neuroni (unità minime di calcolo) interconnessi , i quali collaborano per risolvere un problema di classificazione (con l’uso del supervised learning ). Il neurone riceve degli input x noti da altri neuroni, a ciascuno dei quali è associato un weight w non noto : il neurone calcola quindi un output , applicando una funzione di attivazione alla sommatoria pesata degli input. I weights dipendono dall’importanza dell’input associato, e sono appresi dalla rete neurale tramite esempi di input-output : inoltre, durante il training, l’output finale ( label ) è confrontato con il label effettivo per calcolare un valore di errore loss , che viene propagato all’indietro attraverso la rete neurale per perfezionare i weights ( backpropagation , apprendere dagli errori) in modo da minimizzare la funzione obiettivo. I neuroni sono distribuiti su più layer :

  • Layer di input , i cui neuroni ricevono semplicemente gli input, senza che avvengano calcoli.
  • Layer interni o hidden , i cui neuroni ricevono le informazioni dai layer precedenti e le elaborano, calcolando un output che trasferiscono ai layer successivi.
  • Layer di output , i cui neuroni ricevono le informazioni e calcolano l’output finale. Una rete neurale con molteplici layer interni è detta rete neurale profonda : essa estrae in modo indipendente features di alto livello per i dati in input, riuscendo ad elaborare dati grezzi particolarmente complessi.

Support Vector Machine (SVM)

Le SVM sono metodi di machine learning supervisionato per problemi di regressione e classificazione. L’obiettivo di una SVM è determinare un iperpiano in uno spazio a n dimensioni (con n = n. di feature) che permette di separare al meglio due classi di dati, rappresentabili come punti nello spazio a n dimensioni. L’iperpiano deve avere la massima distanza dai punti delle due classi: per trovare l’iperpiano ottimale, si usano i support vector , che sono i dati delle due classi più vicini all’iperpiano stesso.

Alberi di decisione

Gli alberi di decisione sono metodi di machine learning supervisionato per problemi di regressione e classificazione. Consistono in una sequenza di verifica di condizioni , e possono essere rappresentati graficamente tramite una struttura ad albero: ▪ Radice Il livello più alto dell’albero ▪ Foglie I livelli più bassi: corrispondono alle decisioni ▪ Rami Le condizioni testate passando da foglia a foglia (sì/no)

Machine learning con Python

Scikit-learn ( sklearn ) è la principale libreria per fare machine learning in Python.

\n \t Sequenze di escape : introducono rispettivamente un ritorno a capo e un tab in output. ==/!=/<> /<=/>= Espressioni booleane che restituiscono come valori di tipo True e False and or not in Operatori logici che possono lavorare su espressioni booleane.

  • and restituisce True solo se tutte le espressioni sono vere.
  • or restituisce True se almeno una delle espressioni è vera.
  • not restituisce True se il dato è falso e False se l’espressione è vera.
  • in verifica la presenza di un elemento in una lista.

Funzioni e operazioni generali di Python

print() (^) Funzione di stampa. type() (^) Restituisce la categoria di un dato. int() float() str() Converte l’argomento in un dato della categoria desiderata. import <> import <> as from <> import Importa moduli aggiuntivi → es. import math help() (^) Restituisce informazioni sull’argomento. dir() (^) Restituisce l’elenco delle funzioni di un modulo. def <>(): #implementazione Definisce una nuova funzione: se termina con return <>, è una funzione produttiva , altrimenti è detta funzione vuota. input() (^) Lettura di una stringa inserita dall’utente alla console durante l’esecuzione: ha per argomento la stringa che l’utente visualizza prima di inserire l’input. lambda x,y: x*y (^) Crea una funzione lambda , una funzione anonima implementata direttamente nella chiamata stessa di un’altra funzione: essa viene eseguita una volta, e poi “dimenticata”.

Contenitori: liste, tuple, insiemi, dizionari

<> = [] oppure list() Crea una lista : per accedere ad un elemento della lista, ne si scrive il nome seguito da [] con all’interno l’ indice dell’elemento. [N.B. in Python gli indici positivi partono da zero , e quelli negativi da -1.] Le liste sono mutabili , concatenabili (+), ripetibili più volte (*). Per estrarre una porzione di lista si usa l’operatore [n:]/[:n]/[m:n]con l’elemento di indice n escluso. Per clonare l’intera lista si può usare [:] oppure deepcopy() dal modulo copy. Le sequenze di DNA in Python si rappresentano come liste: una stringa infatti è letta da Python come lista di caratteri. .append() .extend() Aggiungono rispettivamente un elemento e una lista in coda alla lista. .sort() (^) Dispone gli elementi della lista in ordine crescente. del <>[] (^) Rimuove un elemento o un intervallo dalla lista specificandone l’ indice. .index() (^) Restituisce l’indice in cui si trova un elemento. min(), max() (^) Restituiscono rispettivamente il valore minimo e massimo di una lista. sum() (^) Restituisce la somma degli elementi numerici di una lista. range(m) range(m,n) range(m,n,p) Crea una lista di numeri naturali. range(m)crea una lista da 0 a m-1, range(m,n)da m a n-1, range(m,n,p)da m a n-1 procedendo per intervalli di p numeri. .find() (^) Ricerca una sotto-stringa in una stringa e ne riporta la prima occorrenza. .split(x) (^) Scompone una stringa in una lista di sotto-stringhe, dividendola con il carattere separatore x. map(f, A) (^) Restituisce un iteratore , nella quale la funzione f è stata applicata ad ogni elemento della lista A. filter(f, A) (^) Restituisce un iteratore composto dai soli elementi di A per i quali la funzione f restituisce il valore True. reduce(f(a, b), A) (^) Applica una funzione f che accetta due elementi e restituisce un valore su ogni elemento della lista, e accumulando i risultati parziali restituisce un valore in output. [N.B. definita nel modulo functools] <> = () oppure tuple() Crea una tupla. Le tuple sono sequenze di valori immutabili , ed è possibile assegnarne gli elementi a più variabili mediante unpacking. set([]) (^) Crea un insieme usando dei valori di partenza. Gli insiemi sono contenitori non ordinati , che non ammettono ripetizioni. Gli insiemi supportano le operazioni della teoria degli insiemi:

while : print() Schema iterativo while if : break else: Istruzione per interrompere uno schema iterativo. if continue else: Istruzione per saltare un’iterazione all’interno di uno schema iterativo.

Esempi di implementazioni di Python

def Fibonacci(n): if n==0: return 0 if n==1: return 1 return Fibonacci(n-1)+Fibonacci(n-2) for i in range(11): print(i, Fibonacci(i)) A = [i+1 for i in range(11)] B = [i for i in A if i%2==0] → List comprehension C = {x*2 for i in range(-10,11) if abs(i)>1} → Set comprehension print(A, B, C) from functools import reduce mult = reduce(lambda x,y: xy, [1,2,3,4,5]) → Funzione lambda print(mult)

Programmazione orientata agli oggetti OOP

Nella OOP è possibile specificare delle classi , tipi personalizzati di dato : la classe è la descrizione astratta di un concetto (es. cane ), e contiene al suo interno un insieme di oggetti , le istanze della classe. Ogni classe può avere degli attributi , le caratteristiche della classe (es. razza, colore del pelo, peso ), e dei metodi , le operazioni che quella classe può eseguire (es. scodinzolare(), correre(), abbaiare() ). Ad ogni oggetto parte di una classe corrispondono dei valori specifici degli attributi; usando la OOP è possibile programmare facendo interagire oggetti tra di loro. [N.B. In Python si chiama un oggetto con nome_classe(nome_oggetto)] Il costruttore è la prima funzionalità che viene eseguita alla creazione di un oggetto concreto. Nel costruttore si può inserire tutto il codice che “mette in moto” l’oggetto. ▪ Il costruttore si definisce con la funzione def init(): ▪ Il costruttore può ricevere argomenti: il primo argomento è sempre chiamato self. Nel costruttore si possono definire gli attributi della classe: si assegnano all’oggetto usato in quel momento gli attributi come variabili. es. class P def init(self): self.x = print(P.x) I metodi sono funzioni da implementare con def: il primo argomento è sempre self. es. def init(self, x=0, y=0): self.x = x; self.y = y def lunghezza(self) : return (self.x2 + self.y2)**(1/2)

Meccanismo di gestione dei file

1. Richiesta di accesso al file open() Dopo aver specificato la modalità di accesso, il Sistema Operativo verifica se il file esiste oppure no, e se può essere aperto con la modalità richiesta. 2. Operazioni N.B. se il programma ottiene l’accesso, nessun altro programma può accedere al file Lettura → con .readlines() si ottiene una lista delle linee del testo (str) Scrittura → con open(<>, “ w ”): .write(“str\n”) si scrive all’interno di un file vuoto Appendere con open(<>, “ a ”): .write(“str\n”) si scrive all’interno di un file esistente 3. Rilascio del file : gli altri programmi possono di nuovo accedere al file.