Esercizi svolti

Esercizi preparati da Matteo Abrate e Carlo Vallati

Gli esercizi sono presentati in ordine di svolgimento in aula.

Introduzione alle classi

Slides

Prima lezione

Es1

Utilizzando la console interattiva:

I Creare due tuple che rappresentino i seguenti elenchi di nomi e tuple cognomi:

  • nomi: Numa, Tullo, Anco
  • cognomi: Pompilio, Ostilio, Marzio

II Ottenere da esse una lista in cui ogni elemento è un dizionario list che rappresenta un personaggio (Numa Pompilio, Tullo Ostilio, dict ecc.). Nomi e cognomi vanno accoppiati in base all'ordine con cui sono elencati. In ogni dizionario, i nomi devono essere rappresentati tramite la chiave 'nome' e i cognomi tramite la chiave 'cognome'.

Es2

Utilizzando la console interattiva:

I Creare un dizionario che contenga come chiavi nome e cognome, inserendo i propri dati come valori.

II Aggiungere matricola.

III Aggiungere esami, provando ad immaginare che tipi di dato usare per rappresentare sia nome che voto degli esami.

Es3

Scrivere un programma che:

I Crei una lista di coppie (stringa, intero), utilizzando tuple. Ad esempio: ('hello', 3), ('world', 2), ('!', 1).

II Per ogni elemento della lista, stampi la stringa ripetuta un numero di volte pari al valore dell'intero.

III Ripetere l'esercizio utilizzando dizionari al posto di tuple (usare le seguenti chiavi: parola, volte).

Es4

Calcolare la somma dei primi 500 numeri naturali (da 0 incluso a 500 escluso).

Es5

I Scrivere un programma che, data la stringa 'abcdefghi', la analizzi e stampi a video: Lettera 1: a
Lettera 2: b
...
E così via.

II Modificare poi il programma in modo da leggere la stringa da tastiera.

Es6

Scrivere un programma che stampi la lunghezza di una stringa fornita dall'utente, e ripeta questo processo finchè l'utente non inserisce la stringa 'exit'.

Seconda lezione

Es8

Scrivere un programma che:

I Prenda una stringa in input da tastiera, rappresentante un singolo nucleotide (A, C, G oppure T).

II Stampi a video una stringa rappresentante il nucleotide complementare.

Assicurarsi che il programma funzioni correttamente sia con input maiuscolo che minuscolo.

Es9

I Riprendere l'esercizio 8, e risolverlo definendo una funzione complementare(), che ritorni il nucleotide complementare a quello passato come argomento: >>> complementare ('C')
'G'

II Modificare l'esercizio in modo da gestire il caso in cui sia inserito un nucleotide non valido tramite l'uso delle eccezioni. In particolare si modifichi la funzione complementare in modo da lanciare un eccezione generica Exception in caso di nucleo- tide non valido. Tale eccezione deve essere catturata e gestita dal programma principale tramite la stampa a video di un messaggio di errore.

Es10

I Modificare ulteriormente il programma dell'esercizio 9 (punto

I) in modo da aggiungere una funzione filamento_opposto(), che utilizzi la funzione complementare() per ritornare il filamento opposto a quello passato come argomento: >>> filamento_opposto ('CTAATGT ')
'GATTACA '

II Modificare la soluzione in modo da usare la funzione map al posto della funzione filamento_opposto() definita al punto precedente. La funzione complementare potra' essere sfruttata dalla funzione map.

III Aggiungere una funzione reverse_complement(), che ritorni il reverse complement del filamento passato come argomento alla funzione: >>> reverse_complement ('CTAATGT')
'ACATTAG'

IV Modificare il programma in maniera tale da importare il modulo random e usarlo per generare un filamento casuale da dare in pasto alla funzione reverse_complement. Si consiglia di usare la funzione choice() del modulo random che ritorna un elemento casuale tra gli elementi di una sequenza data in ingresso.

Terza lezione

Es11

Scrivere un programma che legga un intero righe e un intero colonne da tastiera e stampi a schermo: X X X X X
X X X X X
X X X X X
L'esempio riporta l'output richiesto per righe = 3 e colonne = 5. Per andare a capo, dare l'istruzione print senza argomenti: print Per stampare senza andare a capo, aggiungere una virgola in fondo alla riga con l'istruzione print: print print 'foo ',

Es12

Scrivere un programma che legga un intero n da tastiera e stampi a schermo un triangolo di numeri come nell'esempio (nel quale n = 4): 1
1 2
1 2 3
1 2 3 4

Es14

I Scrivere un programma che definisca la funzione dh(s,t), che implementi il calcolo della distanza di Hamming tra due stringhe s e t.

II Aggiungere la funzione dhplus(s,t), che generalizzi dh(s,t) al caso di stringhe di diversa lunghezza. Visto che molte generalizzazioni della distanza di Hamming sono possibili e' richiesta l'implementazione di questo primo modo: estendere la stringa di lunghezza minore con una serie di caratteri non validi (ad esempio '-') in modo da ottenere stringhe di lunghezza uguale.

III Aggiungere una funzione dhplus2(s,t) che implementa un modo diverso per generalizzare la distanza di Hamming: prolungare le due stringhe con caratteri non validi fino ad una lunghezza pari alla somma delle due, iterare sulla lunghezza delle stringhe prolungate ogni volta ruotando una stringa spostando un carattere dal fondo alla testa e calcolare la distanza di Hamming, ritornare come valore della distanza di Hamming il minimo valore tra quelli calcolati. prova.......
.....provola
prova.......
a.....provol
prova.......
la.....provo
prova.......
ola.....prov

Quarta lezione

Es15

Scrivere un programma che:

I Utilizza la list comprehension per creare la lista dei primi dieci cubi: [0 ,1 ,8 ,27 ... ]

II Utilizza la funzione filter per ottenere una nuova lista con solo numeri pari.

III Utilizza la funzione map per ottenere una nuova lista che contenga gli elementi della precedente moltiplicati per 3.

IV Utilizza lo slice operator per ottenere una nuova lista senza il primo elemento.

V Utilizza la funzione reduce per ottenere il prodotto degli elementi.

Es16

Scrivere un programma che:

I Dati due vettori, crei la matrice del prodotto V1 * V2T. Ideare una struttura dati appropriata per implementare la matrice.

II Completare il programma con una stampa della matrice riga per riga: [6, 7, 8 ... ]
[12 , 14, 16 ... ]
...

III Aggiungere una funzione stampa_matrice(mat), che migliori la stampa: >>> stampa_matrice (mat )
6 7 8 9 10
12 14 16 18 20
18 21 24 27 30
...
Per fare in modo che i numeri siano stampati allineati, usare per ogni numero il costrutto di string formatting come riportato: print '%3i' % num

Es17

Aggiungere al programma precedente una funzione square(val,n), che ritorni una matrice quadrata di dimensione n con il valore val in ogni cella e utilizzare la funzione stampa_matrice(mat) per stampare nella console interattiva una matrice 6x6 con il valore 0 in ogni cella. 0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0

Es24

Scrivere un programma che calcoli il fattoriale di un numero dato in input dall'utente. Il programma dovra fare uso di funzioni ricorsive. ricorsive

Scrivere una funzione ricorsiva che calcolicalcoli la somma degli elementi di un vettore dato in ingresso.

Es18

Aggiungere al programma dell'esercizio 17 una funzione spirale(n),che ritorni una matrice a spirale oraria: >>> stampa_matrice ( spirale (4))
0 1 2 3
11 12 13 4
10 15 14 5
9 8 7 6
La matrice riporta i numeri da 0 a n2 escluso seguendo un andamento a spirale in senso orario. Si consiglia di fare uso della funzione square(val,n) già definita per preparare una matrice a valori non validi (ad esempio -1), nella quale inserire successivamente i numeri corretti.

Quinta lezione

Es 20

Scrivere un programma che:

Crei una stringa ripetendo 10,000 volte la stringa 'CGAT'.

Crei una stringa di 40,000 caratteri scelti a caso dall’alfabeto 'CGAT'.

Utilizzi la funzione compress del modulo zlib per comprimere compress ciascuna delle due stringhe.

Infine calcoli le lunghezze delle nuove stringhe così ottenute ed i relativi rapporti di compressione4.

Es 26

Scrivere un programma che definisca una classe Punto2D, che rappresenti un punto del piano. Definire un metodo distanza_origine(), che ritorni la distanza del punto dall'origine.

Es 25

Scrivere una classe che rappresenti un dado. La classe deve avere una funzione lancia che stampa un numero da 1 a 6 con probabilita uniforme. Si usi la funzione choice.

Definire una classe derivata DadoTruccato che ridefinisca il metodo lancia imulando un dado in cui la probabilita che esca il numero 6 sia doppia rispetto agli altri numeri. Si usi la funzione random

Es 27

Scrivere un programma che definisca una classe DNA, che rappresenti una sequenza di DNA con una stringa di caratteri scelti tra C, G, A, T. Definire un metodo stampa(), che stampi a video la sequenza. Definire un metodo complementare(), che ritorni la sequenza complementare come un nuovo oggetto DNA.

Sesta lezione

Es 29

Scrivere un programma che definisca una classe MatriceSparsa, che rappresenti una matrice utilizzando un dizionario del tipo (i,j): value.

Definire il metodo __init__() in modo che la matrice sia inizializzata come una matrice 1x1 contenente il valore 1.

Definire un metodo inserisci() che inserisce il valore value alla riga i, colonna j della matrice. Le dimensioni della matrice devono essere eventualmente espanse per poter effettuare l'inserimento, inserendo valori 0.

Definire un metodo stampa(), che stampi la matrice come nell'esercizio 11. >>> mat = MatriceSparsa()
>>> mat.stampa()
0
>>> mat.inserisci(2,2,9)
>>> mat.stampa()
0 0 0
0 0 0
0 0 9
>>> mat.inserisci(2,0,45)
>>> mat.stampa()
0 0 0
0 0 0
45 0 9
>>> mat.inserisci(0,6,99)
>>> mat.stampa()
0 0 0 0 0 0 99
0 0 0 0 0 0 0
45 0 9 0 0 0 0

Es 19

Tutorial files

Scrivere una funzione che, ricevendo in ingresso il nome di un file FASTA3 contenente una sola sequenza (esempio mitochondrion.fasta), restituisca una stringa con la sequenza in esso contenuta. Si svolga l'esercizio senza usare le librerie biopython. Esempio di sintassi di un file FASTA:
>gi |251831106| ref | NC_012920 .1| Homo sapiens
GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGC
GTATGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATG
CTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGA
...

Soluzione: es19.py

Es 31

Scrivere un programma che usando la libreria biopython effettua le seguenti operazioni:

Istanziare due oggetti Seq rappresentanti rispettivamente la sequenza 'ACT' e la sua sequenza complementare

Usare la libreria SeqIO per parsare il file 'ls_orchid.gbk' in formato genbank. Per ciascuna sequenza si stampino l'ID, la lungheza della sequenza e il numero delle occorrenze delle sequenze istanziate al punto precedente rispettivamente nella sequenza letta e in quella complementare.

Si filtrino le sequenze lette al punto precedente in modo da selezionare solo quelle con una lunghezza inferiore a 700.

Si salvino le sequenza filtrate su un nuovo file usando il formato FASTA.

Soluzione: es31.py

Documentazione SeqIO

Esercizio Alberi

Si consideri un albero binario (di ricerca, o BST) costruito in Python utilizzando istanze della seguente classe: class TNode:
   def __init__(self, data=None, left=None, right=None):
      self.data=data
      self.left=left
      self.right=right

I Si aggiunga un metodo a TNode che, data in input una lista ordinata di interi (ordinamento crescente), costruisca un albero di profondità minima.

II Si aggiunga un metodo a TNode che stampi a video i contenuti dei nodi in accordo a una visita in profondità con ordinamento simmetrico (ovvero depth-first, in-order).

III Si aggiunga un metodo a TNode che restituisca una lista con i contenuti dei nodi ottenuti in accordo a una visita in profondità con ordinamento simmetrico (ovvero depth-first, in-order).

Soluzione: alberi.py