Ingegneria degli Algoritmi (II parte pratica) Correzione prova pratica Ing. Domenico Spera domenico.spera@students.uniroma2.eu
Premessa Sono stati richiesti i seguenti task: Implementare la versione in-order di DFS Implementare la versione post-order di DFS Testare gli algoritmi implementati (facoltativo) fantasia e creatività
Esempio di non-test Penso ad un albero che possa essere verificato a mano: Altezza pari ad 1 sarebbe banale! Quindi uso altezza parti a 2... Uso il mio nome: Andrea (POCHE LETTERE!) Eseguo DFS sull'albero
Test creativo Cosa succede se uso un albero vuoto? Cosa succede se l'albero ha altezza > 2? Cosa succede ad un albero totalmente sbilanciato a sinistra/destra? E se aggiungo qualche altro nodo? Cosa succede se creo 1000 alberi random ed eseguo DFS? E chi me li controlla?? creo un algoritmo ricorsivo con 4 righe di codice, mi confronto con un collega, cerco una variante su google...
Test creativo Cosa succede se uso un albero vuoto? Cosa succede se l'albero ha altezza > 2? Cosa succede ad un albero totalmente sbilanciato a sinistra/destra? E se aggiungo qualche altro nodo? Cosa succede se creo 1000 alberi random ed eseguo DFS? Ok, ho capito tutto.. ora creo 2 alberi simpatici di buonanno e auguriperlefeste!
Errori ricorrenti Nessun controllo sull'albero vuoto Implementazione della sola versione ricorsiva La struttura dell'albero viene modificata: Inserito un flag visited Nodi visitati vengono tagliati via Sottoalberi vengono tagliati/spostati La radice viene modificata Algoritmi non corretti (infinite loop..) Nonostante ciò qualcuno ha trovato il modo di ripristinare l'albero originario..
Cosa non voglio vedere..
ZERO COMMENTI!
TROPPI COMMENTI!
TROPPI COMMENTI! (ma ottimo codice..)
TROPPI COMMENTI E PURE IN MAIUSCOLO!
Nomi di variabile che non voglio vedere...
Nomi di variabile che non voglio vedere... NEWNODE1 in maiusolo solo costanti! list indica una collezione particolare in python! nomi buffi ok nei test, MAI nel codice singoli caratteri da usare solo nei seguenti casi: i, j, k se sono indici da scorrere convenzioni sui tipi (e.g. s per string, i per integer, d per decimal, etc..)
Cose strane in output..
Ingegneria degli Algoritmi (II parte pratica) Lezione 11 Ing. Domenico Spera domenico.spera@students.uniroma2.eu
Sommario Advanced Python (parte 2) Metaclassi Classi astratte Metodo str ( ) Grafi Liste di incidenza Liste di adiacenza Matrice di adiacenza
Advanced Python (parte 2)
Premessa Anche le classi sono istanze... di un particolare oggetto chiamato metaclasse
Metaclassi Ogni classe è istanza della metaclasse di default type E' possibile creare nuove metaclassi Le metaclassi offrono grande flessibilità nella gestione del ciclo di vita di un oggetto (creazione, inizializzazione, etc..) Ma, per il momento, quello che vi basta sapere è che esistono le metaclassi!
Classi astratte
Classi astratte Permettono di dichiarare il comportamento della classe senza doverne implementare obbligatoriamente i metodi Permettono di dichiarare una classe base estendibile/ereditabile da altre (e.g. Graph sarà ereditata da GraphIncidenceList, GraphAdjacencyList, etc)
Classi astratte in Python Utilizzare il modulo abc (Abstract base classes) La classe deve essere una istanza della metaclasse ABCMeta I metodi non implementati devono essere segnati come metodi astratti tramite decorator @abstractmethod E' molto più semplice di quello che sembra...
Classi astratte in Python from abc import ABCMeta, abstractmethod class Graph(metaclass=ABCMeta): @abstractmethod def insertnode(self, elem):... TUTTO QUI!
Stampare in output un oggetto
Stampare in output un oggetto def main( ): myobject = Edge(5, 4, 2.1) print(myobject) Cosa stampa l'interprete Python?
Stampare in output un oggetto def main( ): myobject = Edge(5, 4, 2.1) print(myobject) < main.edge object at 0x7f21a382d588> Questa è la posizione dell'oggetto in memoria!
Stampare in output un oggetto metodo str (self) Richiamato da str(object) e dalle funzioni format( ) e print( ) Deve tornare un oggetto di tipo string La documentazione ufficiale riporta [...] to compute the informal or nicely printable string representation of an object.
Stampare in output un oggetto Nodo: indice elemento colore def str (self): return '(' + str(self.indice) + ', ' + str(self.elemento) + ', ' + str(self.elemento) + ')'
Stampare in output un oggetto def main( ): myobject = Nodo(5, 4, 'rosso') print(myobject) (5, 4, rosso)
Grafi e visite di grafi
Esercizio 1 Aggiungere alla classe Edge del file elements.py il metodo str ( self) per stampare in output il contenuto di un arco, ovvero indici dei vertici e peso dell'arco.
Esercizio 2 Modificare il metodo genericsearch( ) nel file Graph_IncidenceList.py. Dove trovate il tag [TODO: aggiorna il padre] fare in modo che per ogni nodo incontrato già marcato venga aggiornato il padre del relativo nodo nell'albero di output. HIT: utilizzare la variabile currnode che punta al rispettivo nodo dell'albero. HIT2: aggiornare il padre evitando di staccare un intero sottoalbero, ovvero scollegando il nodo corrente dall'albero per ricollegarlo ad un suo discendente.
Approfondimenti https://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/ https://docs.python.org/3.4/library/abc.html http://pythoncentral.io/what-is-the-difference-between- str -and- repr - in-python/