Teaching‎ > ‎

Informatica per Statistica - 2013/2014

  • Su questo sito: http://pythontutor.com/visualize.html potete vedere passo dopo passo quello che succede durante l'esecuzione di un programma Python. Negli esercizi che ho messo nel sito includo anche una versione ottenuta da questo sito per facilitarvi la comprensione.
  • Viste le richieste da parte di alcuni studenti, potete contattarmi per email per fissare un appuntamento e rivedere insieme gli esercizi sui quali avete difficoltà. Cercate di mettervi d'accordo e organizzarvi in gruppo, posso essere disponibile al massimo un giorno della settimana per circa due ore.
  • Se qualcuno volesse farsi correggere un esercizio o volesse suggerimenti su come procedere a un certo punto del proprio programma non esiti a contattarmi per email.
  • Qui potete trovare una guida illustrata su come installare ed eseguire python su windows.


Lezione del 18/12/2013

posted Dec 23, 2013, 9:04 AM by Sokol Kosta

Progettazione di basi di dati, esempi con OpenOffice DB.

Lezione del 16/12/2013

posted Dec 23, 2013, 9:00 AM by Sokol Kosta   [ updated Dec 23, 2013, 9:01 AM ]

Esercizio 1:
  • Cifrario di Cesare: Leggere un testo in chiaro da un file (testo_chiaro.txt) e cifrarlo usando il cifrario di cesare con una certa chiave K.
  • Scrivere il testo cifrato in un file (testo_cifrato.txt).
File cesarelib.py
#! /usr/bin/env python

alfabeto = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
              'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'y', 'z']

def cifra_char(carattere, k):
    """
    Ritorna il carattere cifrato con chiave k.
    """
    if carattere not in alfabeto:
        return carattere

    for i in range(len(alfabeto)):
        if alfabeto[i] == carattere:
            return alfabeto[(i+k)%len(alfabeto)]

def decifra_char(carattere, k):
    if carattere not in alfabeto:
        return carattere

    for i in range(len(alfabeto)):
        if alfabeto[i] == carattere:
            return alfabeto[(i-k) % len(alfabeto)]

def cifra_testo(testo, k):
    testo_cifrato = ''
    for carattere in testo:
        carattere_cifrato = cifra_char(carattere, k)
        testo_cifrato += carattere_cifrato

    return testo_cifrato

def decifra_testo(testo_cifrato, k):
    testo_chiaro = ''

    for carattere in testo_cifrato:
        testo_chiaro += decifra_char(carattere, k)

    return testo_chiaro

File cesare1.py
#! /usr/bin/env python

import cesarelib

k = 3
input_file = open('testo_chiaro.txt', 'r')
testo_chiaro = input_file.read()
input_file.close()

testo_cifrato = cesarelib.cifra_testo(testo_chiaro, k)
cifrato_file = open('testo_cifrato.txt', 'w')
cifrato_file.write(testo_cifrato)
cifrato_file.close()

Esercizio 2:
  • Leggere il testo cifrato dal file testo_cifrato.txt e il testo in chiaro dal file testo_chiaro.txt e trovare la chiave K utilizzata per cifrare il testo.
File cesare2.py
#! /usr/bin/env python

import cesarelib

input_file = open('testo_chiaro.txt', 'r')
testo_chiaro = input_file.read()
input_file.close()

cifrato_file = open('testo_cifrato.txt', 'r')
testo_cifrato = cifrato_file.read()
cifrato_file.close()

for k in range(len(cesarelib.alfabeto)):
    testo_decifrato = cesarelib.decifra_testo(testo_cifrato, k)
    if testo_decifrato == testo_chiaro:
        print 'La chiave utilizzata per cifrare:', k
        break

Lezione del 6/12/2013

posted Dec 23, 2013, 8:42 AM by Sokol Kosta

Lezione del 2/12/2013

posted Dec 23, 2013, 8:37 AM by Sokol Kosta   [ updated Dec 23, 2013, 8:40 AM ]

Esercizio 1:
  • Alcuni ceni sui dizionari
  • Leggere un file di testo e contare le occorrenze di ogni lettera dell'alfabeto nel testo
  • Calcolare poi la frequenza per ciascuna lettera
#! /usr/bin/env python

def letter_freq(counts):
    """
    Dato un dizionario con le occorrenze di ciascuna lettera nel testo
    calcola la frequenza.
    """
    frequences = {}
    total_count = sum( [counts[letter] for letter in counts] )

    for letter in counts:
        frequences[letter] = float(counts[letter]) / total_count

    return frequences


def count_letters(filename):
    """
    Prende il nome di un file, lo apre,
    e conta il numero di volte che ogni carattere appare nel testo.
    """

    # Dizionario {chiave: valore}
    # chiave - carattere trovato nel testo
    # valore - numero di volte che il carattere si trova nel testo
    counts = {}

    text_file = open(filename, 'r')
    text = text_file.read()

    for letter in text:
        # Consideriamo soltanto le lettere
        if letter.isalpha():
            # Convertiamo tutto in minuscolo
            # (cosi da non contare 'A' e 'a' separatamente per esempio)
            letter = letter.lower()
            # Se il carattere non si trova nel dizionario allora
            # lo introduciamo e inizializziamo il valore a 0
            if letter not in counts:
                counts[letter] = 0

            # Incrementiamo il valore di 1
            counts[letter] += 1

    return counts


"""
Read a filename and print the frequence of its letters.
"""

filename = raw_input('Insert the text filename: ')

counts = count_letters(filename)
print counts

frequences = letter_freq(counts)
print frequences

for letter in frequences:
    print letter, frequences[letter]

print sorted(frequences.values())

Lezione del 25/11/2013

posted Dec 23, 2013, 8:18 AM by Sokol Kosta   [ updated Dec 23, 2013, 8:19 AM ]

Esercizio 1:
  • Definire un modulo statistica.py nel quale implementiamo le nostre funzioni.
  • Implementare le funzioni di: media, varianza, deviazione standard, standardizzazione di una distribuzione.
  • Usare le funzioni implementate nel modulo definito in un programma.
File statistica.py
#! /usr/bin/env python

import math

def media(lista):
    """
    Ritorna la media dei valori della lista 
    (utilizza la funzione sum() di Python per calcolare la somma).
    """
    return float(sum(lista)) / len(lista)

def standard_deviation(lista):
    """
    sqrt( (sum_{i=1}^{N}(x_i - media)^2) / N)
    """

    media_lista = media(lista)
    somma = 0

    for n in lista:
        scarto = n - media_lista
        scarto2 = scarto**2
        somma = somma + scarto2

    return math.sqrt(float(somma) / len(lista))


def variance(lista):
    """
    Calcola la varianza dei valori della lista.
    """
    dev_standard = standard_deviation(lista)
    return dev_standard**2


def standard_distribution(lista):
    """
    Calcola la distribuzione standardizzata.
    """
    standard_list = []

    media_lista = media(lista)
    dev_standard = standard_deviation(lista)

    for n in lista:
        standard_list.append( (n - media_lista) / dev_standard )

    return standard_list

File programma.py
#! /usr/bin/env python

# Includiamo il file con le funzioni da noi definite e implementate.
# Questo file viene chiamato modulo.
import statistica

lista = [40, -36, -40, 23, 58, 73, 26, -10, 23, -5, 34, 80, 78, 11]
print 'Lista originale:', lista

# Ordiniamo la lista usando la funzione di Python: sorted()
sorted_lista = sorted(lista)
print 'Lista ordinata:', sorted_lista

# Calcoliamo la media usando la funzione da noi implementata.
media_lista = statistica.media(lista)
print 'La media:', media_lista

# Calcoliamo la deviazione standard
dev_standard = statistica.standard_deviation(lista)
print 'Deviazione standard:', dev_standard

# Calcoliamo la varianza
variance_lista = statistica.variance(lista)
print 'Varianza:', variance_lista

# Calcoliamo la distribuzione standardizzata.
standard_list = statistica.standard_distribution(lista)
print 'Distribuzione standardizzata:', standard_list

Lezione del 18/11/2013

posted Dec 23, 2013, 7:54 AM by Sokol Kosta

Esercizio 1:
#! /usr/bin/env python

import math

def calculate_mean(lista):
    """
    Data una lista di numeri ritorna la media.
    """
    somma = 0
    for n in lista:
        somma = somma + n

    return float(somma) / len(lista)

def calculate_pearson(x, y):
    """
    Date due liste di numeri calcola l'indice di correlazione di Pearson.
    """
    mean_x = calculate_mean(x)
    mean_y = calculate_mean(y)

    xy = 0
    x2 = 0
    y2 = 0

    for i in range(len(x)):
        x[i] = x[i] - mean_x
        y[i] = y[i] - mean_y

        xy = xy + x[i]*y[i]
        x2 = x2 + x[i]*x[i]
        y2 = y2 + y[i]*y[i]

    return xy / math.sqrt(x2*y2)


# Le liste che contengono i valori delle due colonne
x = []
y = []

input_file = open('input.csv')
lines = input_file.readlines()
input_file.close()

for line in lines:
    line = line.strip().split(',')
    x.append(int(line[0]))
    y.append(int(line[1]))

print 'La correlazione di Pearson delle due liste:', calculate_pearson(x, y)

Lezione del 11/11/2013

posted Dec 23, 2013, 7:39 AM by Sokol Kosta   [ updated Dec 23, 2013, 7:40 AM ]

In questa lezione gli studenti si sono organizzati in gruppi per cercare di capire meglio quello che abbiamo imparato nelle lezioni precedenti. Gli esercizi che dovevano svolgere erano due:

Esercizio 1:
  • Leggere un file di un certo righe di numeri e chiamare delle funzioni su ciascuna riga.
#! /usr/bin/env python

def somma(lista):
    """
    Funzione che prende una lista di numeri e ritorna la somma.

    Arguments:
        lista: lista di numeri

    Returns:
        Somma dei numeri della lista
    """
    s = 0
    for el in lista:
        s = s + el

    return s

# File aperto in modo lettura
input_file = open('input.csv', 'r')

# Leggiamo le righe del file. Ogni riga contiene i numeri sui quali vogliamo lavorare.
for linea in input_file.readlines():
    linea = linea.strip().split(',')
    for i in range(len(linea)):
        linea[i] = int(linea[i])

    s = somma(linea)

    print s

input_file.close()

Esercizio 2:
  • Leggere i dati dalle colonne.
  • Dobbiamo prima contare il numero delle colonne.
#! /usr/bin/env python

# Una constante che contiene il nome del file che verra' utilizzata in questo esercizio
NOME_INPUT_FILE = 'input2.csv'

def somma(lista):
    """
    Funzione che prende una lista di numeri e ritorna la somma.

    Arguments:
        lista: lista di numeri

    Returns:
        Somma dei numeri della lista
    """
    s = 0
    for el in lista:
        s = s + el

    return s

def conta_colonne(input_file):
    """
    Prende un file .csv e conta il numero di colonne.
    """
    in_file = open(input_file, 'r')
    nr_colonne = len(in_file.readline().strip().split(','))
    in_file.close()

    return nr_colonne


# Contiamo il numero delle colonne
numero_colonne = conta_colonne(NOME_INPUT_FILE)

# La lista che conterra' una lista per ogni colonna
colonne = []

# Aggiungiamo una lista per ogni colonna
for i in range(numero_colonne):
    colonne.append([])

# File aperto in modo lettura
input_file = open(NOME_INPUT_FILE, 'r')

# Leggiamo le righe del file. Ogni riga contiene i numeri sui quali vogliamo lavorare.
for linea in input_file.readlines():
    linea = linea.strip().split(',')
    for i in range(len(linea)):
        linea[i] = int(linea[i])

        # Aggiungiamo alla i-esima lista il numero della i-esima colonna
        colonne[i].append(linea[i])

input_file.close()

for col in colonne:
    print somma(col)

Lezione del 04/11/2013

posted Nov 4, 2013, 8:32 AM by Sokol Kosta   [ updated Nov 4, 2013, 8:39 AM ]

Esercizi visti in laboratorio:

Esercizio 1: 
  • Scrivere una funzione che calcola la somma degli elementi di una lista in modo iterativo;
  • una funzione che calcola la somma in modo ricorsivo.
Qui potete vedere il codice in azione.
#! /usr/bin/env python

def somma_iterativa(lista):
    """
    Calcola la somma degli elementi della lista
    in modo iterativo.     """     somma = 0     for el in lista:         somma = somma + el
    return somma
def somma_ricorsiva(lista):     """     Calcola la somma degli elementi della lista     in modo ricorsivo.     """
    # Caso base: la lista e' vuota     if len(lista) == 0:         return 0
    return lista[0] + somma_ricorsiva(lista[1:])

# Testiamo le funzioni di somma
lista = [23, -47, -19]
print 'La somma calcolata in modo iterativo:', somma_iterativa(lista)
print 'La somma calcolata in modo ricorsivo:', somma_ricorsiva(lista)


Esercizio 2:
  • Leggere le righe di numeri interi separati da spazio da un file;
  • applicare su ciascuna riga una delle funzioni somma che abbiamo appena visto;
  • scrivere la somma di ogni riga su un file di output.
#! /usr/bin/env python

def somma_iterativa(lista):
    """     Calcola la somma degli elementi della lista     in modo iterativo.     """     somma = 0     for el in lista:         somma = somma + el
    return somma
def somma_ricorsiva(lista):     """     Calcola la somma degli elementi della lista     in modo ricorsivo.     """     # Caso base: la lista e' vuota     if len(lista) == 0:         return 0
    return lista[0] + somma_ricorsiva(lista[1:])
input_file = open('input.txt''r') out_file = open('output.txt''w')
lines = input_file.readlines()
for i in range(len(lines)):     lines[i] = lines[i].strip()

for line in lines:     line = line.split(' ')
    for i in range(len(line)):         line[i] = int(line[i])
    somma = somma_ricorsiva(line)     out_file.write(str(somma))     out_file.write('\n')

Esercizio 3: Calcolare l'ennesimo numero di Fibonacci in modo ricorsivo (Nota: In laboratorio i primi due elementi li ho chiamati a0 ed a1, qui li chiamo Fed Fper seguire la definizione di Wikipedia).
  • F1 = 1
  • F2 = 1
  • Fn = Fn-1 + Fn-2
Qui potete vedere il codice in azione.
#! /usr/bin/env python
def fibonacci_ricorsivo(n):     """     Ritorna l'ennesimo numero di Fibonacci.     """
    # Casi base: Il primo e il secondo numero di Fibonacci     # sono 1 per definizione.     if n == 1 or n == 2:         return 1
    # Altrimenti calcoliamo il numero di fibonacci secondo la definizione.     return fibonacci_ricorsivo(n-1) + fibonacci_ricorsivo(n-2)
n = raw_input('Numero di Fibonacci da calcolare:') n = int(n)
print fibonacci_ricorsivo(n)


Lezione del 28/10/2013

posted Oct 28, 2013, 9:03 AM by Sokol Kosta   [ updated Oct 28, 2013, 9:14 AM ]

Esercizi da fare a casa:
  • Es 1. Modificare gli esercizi che abbiamo visto in laboratorio in modo tale che l'output venga scritto in un file invece che nel terminale.
    • Usare la funzione: output_file = open('ouput.txt', 'w') per aprire il file in scrittura.
    • Usare output_file.write(string) per scrivere nel file.
    • Usare repr(int) per convertire un numero intero in una stringa prima di scriverlo nel file (utile per quando dovete scrivere la media).

  • Es 2. Implementare uno script python che:
    • legge un numero da tastiera
    • poi legge n numeri e li mette in una lista
    • ordina la lista
    • trova la mediana dei numeri
    • stampa la mediana.
    • Esempio (cinque numeri inseriti dalla tastiera, n=5):
      • Input:
        5
        8
        2
        6
        3
      • Output:
        3
    • Esempio (zero numeri inseriti, n=0):
      • Input:
        0
         
      • Output:
        0
    • Esempio (un numero inserito, n=1):
      • Input:
        1
        9
         
      • Output:
        9

Esercizi visti in laboratorio:

Esercizio 1: Leggere un file di alcune righe di numeri interi separati da spazio e calcolare la media di ciascuna riga.
Funzioni viste:
  • Per aprire un file: open()
  • Per leggere tutte le righe del file: readlines()
  • Per togliere gli spazi all'inizio e alla fine delle righe: strip()
  • Per prendere i numeri dalle righe in base al delimitatore (uno spazio bianco nel nostro caso): split()
  • Per chiudere il file: close()
! /usr/bin/env python

def media(lista):
    """
    Prende una lista e ritorna la media degli elementi.
    """
    # Si parte con una somma inizializzata a zero
    somma = 0
    # Aggiungiamo gli elementi della lista uno a uno alla somma
    for elemento in lista:
        somma = somma + elemento

    # La somma la trasformiamo in numero float per avere una media precisa
    somma = float(somma)

    # La media e' data dalla somma divisa per il numero degli elementi
    media = somma / len(lista)

    return media

# Apriamo il file contente le righe con i numeri usando la funzione 'open()' # La funzione open() ritorna un oggetto di tipo File input_file = open('input.txt''r')

# Usando la funzione dell'oggetto di tipo File 'readlines()' # si leggono tutte le righe del file e viene ritornata una lista che le contiene. lines = input_file.readlines()

# Vediamo il contenuto della lista print 'Le righe originali del file:' print lines print

# Togliamo il simbolo di ritorno '\n' e eventuali altri spazi dalle righe con la funzione 'strip()' for i in range(len(lines)):     lines[i] = lines[i].strip() # Vediamo il contenuto della lista print 'Le righe senza il simbolo di ritorno alla fine:' print lines print
# Separiamo i valori delle righe secondo lo spazio bianco usando la funzione 'split()' for i in range(len(lines)):     lines[i] = lines[i].split(' ') # Vediamo il contenuto della lista print 'Le righe divise per spazio:' print lines print
# Convertiamo i numeri rappresentati da stringhe in numeri interi usando la funzione 'int()' for linea in lines:     for i in range(len(linea)):         linea[i] = int(linea[i]) # Vediamo il contenuto della lista print 'Le righe con gli elementi convertiti in numeri interi:' print lines print
for i in range(len(lines)):     print 'La media della riga nr.', (i+1), ':', media(lines[i])
# Non dimentichiamo di chiudere il file quando abbiamo finito input_file.close()

Esercizio 2: Leggere un file di alcune righe di numeri interi separati da spazio e ordinare le righe usando la funzione insertion_sort()
Link utili: Animazione algoritmi di ordinamento

#! /usr/bin/env python
def swap(l, i, j):     """     Funzione che prende una lista l e due indici i e j     e scambia i valori di l[i] e l[j].     """     temp = l[i]     l[i] = l[j]     l[j] = temp
def insertion_sort(lista):     """     Algoritmo insertion sort per ordinare una lista.     Prende una lista e ritorna la lista ordinata.     """
    for i in range(1len(lista)):         j = i         while j > 0 and lista[j] < lista[j-1]:             swap(lista, j, j-1)             j = j-1
    return lista
# Apriamo il file contente le righe con i numeri usando la funzione 'open()' # La funzione open() ritorna un oggetto di tipo File input_file = open('input.txt''r')
# Usando la funzione dell'oggetto di tipo File 'readlines()' # si leggono tutte le righe del file e viene ritornata una lista che le contiene. lines = input_file.readlines()
for i in range(len(lines)):     lines[i] = lines[i].strip()     lines[i] = lines[i].split(' ') print 'Le righe senza ritorno e divise per spazio:' print lines print

# Convertiamo i numeri rappresentati da stringhe in numeri interi usando la funzione 'int()' for linea in lines:     for i in range(len(linea)):         linea[i] = int(linea[i]) # Vediamo il contenuto della lista print 'Le righe con gli elementi convertiti in numeri interi:' print lines print

for i in range(len(lines)):     print 'La riga nr.', i, 'ordinata:', insertion_sort(lines[i])
# Non dimentichiamo di chiudere il file quando abbiamo finito input_file.close()

Lezione del 21/10/2013

posted Oct 22, 2013, 11:45 AM by Sokol Kosta   [ updated Oct 22, 2013, 11:49 AM ]


Esercizi da fare a casa:

Es 1. Implementare una funzione che prende una lista e verifica se la lista è ordinata.
Esempio 1: lista = [3, 7, 8, 23, 34], la funzione stampa SI
Esempio 2: lista
 = [3, 1, 8, 23, 34], la funzione stampa NO

Es 2. Implementare una funzione che prende una lista e la ordina usando l'algoritmo Insertion Sort visto in classe.
In più implementare anche un altra funzione che ordina la lista usando l'algoritmo Bubble Sort.
Esempio: lista = [2, 5, -4, -1, 9, 3, -14, 12], la funzione ritorna: [-14, -4, -1, 2, 3, 5, 9, 12]

Es 3. Implementare una funzione che prende una lista e ritorna la lista senza i duplicati.
Esempio: lista = [3, 1, 3, 6, 4, 9, 3, 1, 4, 7], la funzione ritorna: [6, 7, 9]

Esercizi visti in laboratorio:

Esercizio 1: Definizione di una funzione che calcola il massimo tra due numeri.

#! /usr/bin/env python

def max2(n1, n2):
    """
    Le funzioni sono sempre definite con la parola chiave 'def'.
    Dopo la parentesi chiusa vanno messi due punti.     Tutto quello che fa parte della funzione deve essere indentato di un tab.
    La funzione deve essere definita prime di essere chiamata.

    Questa funzione prende due numeri e ritorna il piu' grande.
    """

    if n1 > n2:
        return n1     else:         return n2

    # Fine funzione, adesso DOBBIAMO rientrare di un tab nella indentazione.

print 'Inserisci due numeri per calcolare il massimo:'

# Prendiamo il primo e il secondo numero in input dalla tastiera
n1 = int(raw_input())
n2 = int(raw_input())
print 'Il massimo tra', n1, 'e', n2, '=', max2(n1, n2)

Esercizio 2: Semplici operazioni sulle listeforrange(), append().
#! /usr/bin/env python
# Una lista viene dichiarata con le parentesi quadre. # Una lista puo' contenere oggetti di diversi tipi, stringhe, interi, float, ecc. lista1 = ['ciao'2, -1'mondo''3.14'] print 'La lista:', lista1 print

# Per iterare sugli elementi della lista si usa il ciclo 'for'
print 'Gli elementi della lista sono:'
for elemento in lista1:
    print elemento
print

# La funzione len() ritorna la lunghezza della lista.
print 'Lunghezza della lista:'len(lista1)
print

# Gli elementi della lista si possono accedere anche tramite l'indice
# della posizione dove si trovano nella lista.
# Il conteggio delle posizioni comincia da 0 e finisce a len(lista1)-1.
# Per accedere all'elemento che si trova in posizione 'i' della lista: lista1[i]
print 'Il primo elemento della lista e\':', lista1[0]
print 'Il terzo elemento della lista e\':', lista1[2]
print 'L\'ultimo elemento della lista e\':', lista1[len(lista1)-1]
print
# La funzione range() nella sua forma piu' semplice prende un numero n
# e ritorna una lista di numeri da 0 a n-1: [0, 1, ..., n-1]
print 'Una lista di numeri da 0 a lunghezza(lista)-1:'range(len(lista1))
print

# Stampiamo tutti gli elementi della lista utilizzando gli indici.
# Per prendere tutti gli indici utilizziamo la funzione range()
print 'Di nuovo gli elementi della lista, stampati utilizzando gli indici adesso'
for i in range(len(lista1)):
    print lista1[i]
print

Esercizio 3. Definire una funzione che prende una lista di numeri e ritorna una lista composta solo dai numeri positivi della lista.
#! /usr/bin/env python
def ritorna_lista_positivi(lista):     """     Questa funzione prende una lista di numeri e ritorna una lista     composta dai numeri positivi.     """
    lista2 = []
    for n in lista:         if n > 0:             lista2.append(n)
    return lista2
lista = [4, -25, -3, -34, -92, -87]
print 'Lista originale:', lista
lista_dei_positivi = ritorna_lista_positivi(lista)
print 'Lista dei positivi:', lista_dei_positivi




1-10 of 12