Laboratorio 2
ESERCIZIO V
-
Scrivere un programma che, data la stringa ‘abcdefghi’, la analizzi e stampi a video:
Lettera 1: a
Lettera 2: b
...
-
Modificare poi il programma in modo da leggere la stringa da tastiera.
Soluzione:
stringa = 'abcdefghi'
for i,c in enumerate(stringa):
print 'Lettera %d: %s' %(i+1, c)
#alternativa: formattazione di stringhe
for i,c in enumerate(stringa):
print 'Lettera {index}: {character}'.format(index=i+1, character=c)
stringa = raw_input('Inserisci una stringa: ')
for i,c in enumerate(stringa):
print 'Lettera %d: %s' %(i+1, c)
ESERCIZIO VI
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’.
Soluzione:
while True:
stringa = raw_input('Inserisci una stringa: \n')
if stringa == 'exit':
break
print len(stringa)
ESERCIZIO VII
Scrivere un programma che prenda in ingresso un intero e stampi tutti i numeri primi fino al numero fornito dall’utente.
Soluzione:
num = raw_input('Inserire un numero: \n')
n = 2
while n < int(num):
non_divisibile = True
for k in range(2,n):
if n%k == 0:
non_divisibile = False
if non_divisibile:
print n
n += 1
ESERCIZIO VIII
Scrivere un programma che:
-
Prenda una stringa in input da tastiera, rappresentante un singolo nucleotide
(A, C, G oppure T)
. -
Stampi a video una stringa rappresentante il nucleotide complementare.
Assicurarsi che il programma funzioni correttamente sia con input maiuscolo che minuscolo.
Soluzione:
nuc = raw_input('Inserire un singolo nucleotide (A, C, G, T): \n')
nuc = nuc.upper()
# Alternativa I:
if nuc == 'A':
print 'T'
elif nuc == 'C':
print 'G'
elif nuc == 'G':
print 'C'
elif nuc == 'T':
print 'A'
else:
print "Nucleotide {nuc} sconosciuto".format(nuc=nuc)
# Alternativa II:
nuc_dict = {'A':'T','C':'G','G':'C','T':'A'}
print nuc_dict[nuc]
ESERCIZIO IX
- Riprendere l’esercizio 8, e risolverlo definendo una funzione complementare(), che ritorni il nucleotide complementare a quello passato come argomento:
>>> complementare ('C')
'G'
- 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 nucleotide non valido. Tale eccezione deve essere catturata e gestita dal programma principale tramite la stampa a video di un messaggio di errore.
Soluzione:
# Parte I
def complementare(nuc):
nuc = nuc.upper()
nuc_dict = {'A':'T','C':'G','G':'C','T':'A'}
return nuc_dict[nuc]
# Parte II:
def complementare_eccezione(nuc):
nuc = nuc.upper()
nuc_dict = {'A':'T','C':'G','G':'C','T':'A'}
if nuc not in nuc_dict.keys():
raise Exception()
return nuc_dict[nuc]
# Programma principale
nuc = raw_input('Inserire un singolo nucleotide (A, C, G, T): \n')
print complementare(nuc)
try:
print complementare_eccezione(nuc)
except Exception:
print "Errore! Qualcosa è andato storto"
ESERCIZIO X
-
Modificare ulteriormente il programma dell’esercizio 9 (punto I) in modo da aggiungere una funzione filamento_opposto(), che utilizzi la funzione complementare() per restituire il filamento opposto a quello passato come argomento:
>>> filamento_opposto('CTAATGT ')
'GATTACA '
-
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.
-
Aggiungere una funzione reverse_complement(), che restituisca il reverse complement del filamento passato come argomento alla funzione:
>>> reverse_complement('CTAATGT')
'ACATTAG'
-
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.
Soluzione:
# Punto I:
def filamento_opposto(filamento):
sequenza_opposta = [complementare(c) for c in filamento]
return ''.join(sequenza_opposta)
# Punto II:
filamento_opposto_list = map(complementare, filamento)
filamento_opposto = ''.join(filamento_opposto_list)
# Punto III:
def reverse_complement(filamento):
# Ottenere il reverse del filamento
rev_f = filamento[::-1]
return filamento_opposto(rev_f)
print reverse_complement('CTAATGT')
# Punto IV:
import random
filamento = ''
#genero un filamento di lunghezza 10
#opzione I : ciclo for
for i in range(10):
filamento = filamento + random.choice('CGAT')
print filamento
# opzione II: list comprehension
filamento = ''.join([random.choice('CGAT') for i in xrange(10)])
print filamento
print filamento_opposto(filamento)
print reverse_complement(filamento)
...