.. -*- mode: rst -*- .. include:: beamerdefs.txt ====================== print 'Hello Python' ====================== Un po' di storia ================ - primi anni '80: ABC, progettato per essere facile da imparare - 1991: Python 0.9.0 - 1994 |-->| 1999: Python 1.0 |-->| 1.5.2 - 2000 |-->| 2006: Python 2.0 |-->| 2.5 - Tutte compatibili all'indietro (o quasi :-)) |pause| - 2008: **Python 2.6** e Python 3.0 Python in N punti ================= - Scripting language (qualunque cosa voglia dire) * Compilato automaticamente * Startup molto veloce * Adatto per piccoli programmi usa e getta * Ottima integrazione con il S.O. |pause| - Tipato **dinamicamente** * Test Driven Development! |pause| - Multi-paradigma * Object-oriented * Procedurale * (`Funzionale`) Vantaggi di Python ================== |invisible| .. raw:: latex {\vspace{-1cm}\hfill\scalebox{0.400000}{\includegraphics{vangelo.png}}\hspace{0.5cm}} |pause| - Estremamente produttivo * 1 linea di Python ~= 2/5/10 linee di Java - Programmi molto leggibili - Moltissime librerie - Facile da estendere - Multipiattaforma - CPython: Linux, Windows, Mac, etc. - Jython, IronPython, (PyPy) - Adatto anche a grossi progetti |pause| |google| |youtube| |pypy| .. |google| image:: google.png :scale: 15 :align: middle .. |youtube| image:: youtube.png :scale: 25 :align: middle .. |pypy| image:: pypy.png :scale: 15 :align: middle Hello world =========== |example<| hello.py |>| |include<| hello.py |>| |end_example| - Nessuna dichiarazione - Solo statement Funzioni ======== |example<| func.py |>| |include<| func.py |>| |end_example| - indentazione significativa - nessun ';' - tipizzazione dinamica e forte - `def` è uno statement Tipi di dato ============ - Numeri * Interi a precisione arbitraria * Floating point * Complessi * Decimali (nella stdlib) - Stringhe - Liste - Dizionari - Tuple - ... Stringhe ======== |example<| str.py |>| |include<| str.py |>| |end_example| Liste ===== |example<| list.py |>| |include<| list.py |>| |end_example| Dizionari ========= |example<| dict.py |>| |include<| dict.py |>| |end_example| Tuple ===== |example<| tuple.py |>| |include<| tuple.py |>| |end_example| Strutture di controllo (1) ========================== |example<| if.py |>| |include<| if.py |>| |end_example| |pause| :: $ python if.py good Strutture di controllo (2) ========================== |example<| while.py |>| |include<| while.py |>| |end_example| |pause| :: $ python while.py 1 1 2 3 5 8 13 21 34 55 Strutture di controllo (3) ========================== |example<| for.py |>| |include<| for.py |>| |end_example| |pause| :: $ python for.py 0 1 2 3 4 5 6 7 8 9 p y t h o n baz foo bar Strutture di controllo (4) ========================== |example<| else.py |>| |include<| else.py |>| |end_example| |pause| :: $ python else.py 2 3 5 7 11 13 17 19 Funzionalità delle funzioni (1) =============================== |example<| funcargs1.py |>| |include<| funcargs1.py |>| |end_example| |pause| :: $ python funcargs1.py 21 10 Funzionalità delle funzioni (2) =============================== |example<| funcargs2.py |>| |include<| funcargs2.py |>| |end_example| |pause| :: $ python funcargs2.py 1 2 pippo --> 3 pluto --> 4 Funzionalità delle funzioni (3) =============================== |example<| closure.py |>| |include<| closure.py |>| |end_example| |pause| :: $ python closure.py 8 Eccezioni ========= |example<| exceptions.py |>| |include<| exceptions.py |>| |end_example| |pause| :: $ python exceptions.py ops bye bye Nomi e oggetti ============== - Universo di oggetti - Etichette associate agli oggetti - Variabili: nomi all'interno di un namespace - Tutto ciò che ha un nome, è un oggetto * numeri, stringhe, etc. * funzioni * classi * moduli * traceback * ... Classi ====== |lst-scriptsize| |example<| stack.py |>| |include<| stack.py |>| |end_example| - ``self`` esplicito - creazione di oggetti come chiamata a funzione Indovinello =========== |invisible| - Nel giardino di Pierino c'è un animale che: * cammina come un cane * scodinzola come un cane * abbaia come un cane * ma non è un cane - Che cos'è? |pause| .. image:: dog.png :scale: 40 :align: center - |sout<| Dog |>| **Duck typing** Lookup degli attributi ====================== - Object model *attribute based* - Oggetto |-->| serie di *namespace* innestati - ``obj.x`` cerca ``x`` dal più interno al più esterno - Serie di namespace: * oggetto * classe dell'oggetto * superclasse * super-superclasse * etc. |pause| - ``obj.x = y`` aggiorna **sempre** il namespace ``obj`` |pause| - ``obj.x`` |<=>| ``getattr(obj, 'x')`` - ``obj.x = y`` |<=>| ``setattr(obj, 'x', y)`` Metodi ====== - Funzioni all'interno del namespace della classe - ``stack.push(42)`` * ``tmp = stack.push`` * ``tmp(42)`` - ``tmp`` è un *bound method*: oggetto di prima classe Ereditarietà multipla ===================== |example<| inheritance.py |>| |include<| inheritance.py |>| |end_example| - Linearizzazione - Serie di namespace: * ``obj`` * ``obj.__class__.__mro__`` Introspezione ============= |invisible| - ``dir(obj)``: lista degli attributi (superclassi incluse) - ``obj.__dict__``: dizionario degli attributi - ``obj.__class__``: classe dell'oggeto (mutabile!) - ``obj.__doc__``: docstring |pause| - ``sys._getframe()``: frame di esecuzione |warning| .. |warning| image:: warning.png :scale: 4 Pausa ===== .. image:: pausa.png :scale: 50 :align: center Design pattern in Python ======================== - `All problems in computer science can be solved by another level of indirection` |pause| * ... except the problem of too many levels of indirection |pause| - Design pattern * disaccoppiamento tra diverse parti del sistema * ``livello_di_indirezione++`` * bisogna accontentare il typechecker - Duck typing + dynamic lang == meno lavoro Delegation pattern (Java) ========================= |lst-tiny| |lst-java| |example<| delegation.java (da wikipedia) |>| |include<| delegation.java |>| |end_example| Delegation pattern (Python) =========================== |lst-scriptsize| |example<| delegation.py |>| |include<| delegation.py |>| |end_example| Decorator (Python) ================== |lst-scriptsize| |example<| decorator.py |>| |include<| decorator.py |>| |end_example| Abstract Factory (Java) ========================= |lst-tiny| |lst-java| |example<| abstractfactory.java |>| |include<| abstractfactory.java |>| |end_example| Abstract Factory (Python/1) =========================== |example<| abstractfactory1.py |>| |include<| abstractfactory1.py |>| |end_example| Abstract Factory (Python/2) =========================== |lst-footnotesize| |column1| |example<| WinFactory.py |>| |include<| WinFactory.py |>| |end_example| |pause| |column2| |example<| abstractfactory2.py |>| |include<| abstractfactory2.py |>| |end_example| |end_columns| Generatori (1) ============== |example<| generators1.py |>| |include<| generators1.py |>| |end_example| Generatori (2) ============== |example<| generators2.py |>| |include<| generators2.py |>| |end_example| |pause| :: $ python generators2.py 1 1 2 3 5 8 13 21 34 55 Generatori infiniti (1) ======================= |example<| generators3.py |>| |include<| generators3.py |>| |end_example| Generatori infiniti (2) ======================= |lst-footnotesize| |example<| takewhile.py |>| |include<| takewhile.py |>| |end_example| |pause| :: $ python takewhile.py 0 2 4 6 8 10 12 14 16 18 Stile funzionale ================ |example<| functional.py |>| |include<| functional.py |>| |end_example| |pause| :: $ python functional.py 0 2 4 6 8 10 12 14 16 18 List comprehension/generator expression ======================================= |example<| listcomp.py |>| |include<| listcomp.py |>| |end_example| |pause| :: $ python listcomp.py 0 2 4 6 8 10 12 14 16 18 0 2 4 6 8 10 12 14 16 18 Function decorators (1) ======================= |lst-scriptsize| |example<| funcdec1.py |>| |include<| funcdec1.py |>| |end_example| |pause| |small| :: $ python funcdec1.py enter add exit add 42 |end_small| Function decorators (2) ======================= |example<| funcdec2.py |>| |include<| funcdec2.py |>| |end_example| |pause| - Solo zucchero sintattico! - Però hanno aperto nuovi modi di pensare - Decoratori builtin: staticmethod, classmethod - Altri esempi: * logging * caching/memoization * aggiunta di metadati * etc. Q/A? ==== - http://www.python.org - Arrivederci al prossimo tutorial! - Venerdì 15 Gennaio 2010: Newspeak, **Elena Zucca** .. image:: Zucca05.jpg :scale: 40 :align: right |small| http://www.disi.unige.it/person/AnconaD/PLtutorial.html |end_small|