Presentazione tenuta in occasione del Codemotion del 5 marzo 2011 a Roma http://www.codemotion.it/
L'esperienza di programmazione in Python vista con gli occhi di due programmatori Java. Quali sono le difficoltà incontrate e le prime impressioni nel lavorare con questo linguaggio ed il suo ambiente di sviluppo. Compariamo i due linguaggi e sfatiamo alcuni luoghi comuni che li riguardano, tracciando un quadro imparziale dei pro e dei contro di ognuno di essi. In questo talk si risponderà ad alcune domande per capire se Python rappresenti realmente un passo verso la libertà degli sviluppatori.
2. Sviluppare in Python: un passo verso la libertà
Obiettivo
Stimolare la curiosità e
diffondere l'interesse nei confronti di
Python in ambito professionale!
Matteo Cafarotti - Serafino Beraldi
3. Agenda
● Confronto Python vs Java
● Caratteristiche di Python
● Campi di applicazione
● Considerazioni
Matteo Cafarotti - Serafino Beraldi
4. Sviluppare in Python: un passo verso la libertà
Storia
● Java nasce nel 1996 ad opera di James Gosling...
● Obiettivo: ambiente software platform-indipendent
● Target: dall'elettronica di consumo al WWW
● Nel 2009 Sun Microsystem viene acquisita da Oracle
● Python è stato creato da Guido Van Rossum nel 1991...
● Il nome del linguaggio è stato ispirato da uno show televisivo
● Semplicità dei linguaggio di scripting + potenza dei linguaggi Object Oriented
● Nel 2010 vince il “TIOBE Programming Award”
Matteo Cafarotti - Serafino Beraldi
5. Sviluppare in Python: un passo verso la libertà
Python è free ed Open Source
● Python è FLOSS (Free and Open Source Software)
● È possibile vedere il suo codice sorgente, modificarlo, prelevare segmenti di
codice e usarli in altri programmi free
● FLOSS si basa sul principio della libera condivisione delle conoscenze
all'interno di una community
● Fin dalla sua creazione Python è stato aggiornato da una community che lo
migliora e lo fa crescere costantemente
Matteo Cafarotti - Serafino Beraldi
6. Sviluppare in Python: un passo verso la libertà
PEP
● Con il termine PEP (Python Enhancement Proposal) si indicano le proposte di
avanzamento di Python che sono raccolte dalla Python org, valutate ed
eventualmente adottate negli sviluppi del linguaggio.
● Tali proposte sono avanzate sia dal team di sviluppo di Python che dalla
community e sono raccolte sul sito python.org.
Matteo Cafarotti - Serafino Beraldi
7. Sviluppare in Python: un passo verso la libertà
PEP20: Zen of Python
● Beautiful is better than ugly. ● In the face of ambiguity, refuse the
● Explicit is better than implicit. temptation to guess.
There should be one-- and preferably only
Simple is better than complex.
●
●
● Complex is better than complicated.
one – obvious way to do it.
● Although that way may not be obvious at first
● Flat is better than nested.
unless you're Dutch.
● Sparse is better than dense. ● Now is better than never.
● Readability counts. ● Although never is often better than *right*
now.
● Special cases aren't special enough to break
the rules.
● If the implementation is hard to explain, it's a
bad idea.
● Although practicality beats purity.
● If the implementation is easy to explain, it
● Errors should never pass silently.
may be a good idea.
● Unless explicitly silenced. ● Namespaces are one honking great idea --
let's do more of those!
Matteo Cafarotti - Serafino Beraldi
8. Sviluppare in Python: un passo verso la libertà
Similitudini tra Java e Python
Java Python
Object Oriented
pre compilato javac compiler python compiler/interpreter
java byte code interpreter python compiler/interpreter
portabile
tipizzazione strongly typed strongly typed
gestione memoria automatic garbage collection automatic garbage collection
in Python qualsiasi cosa è un oggetto: moduli, classi, funzioni...
Matteo Cafarotti - Serafino Beraldi
9. Sviluppare in Python: un passo verso la libertà
Differenze tra Java e Python
Java Python
tipizzazione statica dinamica
ereditarietà singola multipla
overloading operatori
interprete interattivo
sintassi verbosa sintetica
Matteo Cafarotti - Serafino Beraldi
10. Sviluppare in Python: un passo verso la libertà
Tipizzazione Statica vs Tipizzazione Dinamica
Statica ↔ Compile-Time Dinamica ↔ Run-Time
variabile variabile
valore tipo valore
tipo tipo
Matteo Cafarotti - Serafino Beraldi
11. Sviluppare in Python: un passo verso la libertà
Cosa ci è piaciuto di Python
● Python consente di scrivere meno codice
● Usare l'interprete Python in modo interattivo
● Pre-compilazione automatica dei sorgenti
● File di configurazione nello stesso linguaggio
● I metodi possono restituire più di un valore
● Valori di default sui parametri di un metodo
● Test e doctest
● ...
Matteo Cafarotti - Serafino Beraldi
12. Sviluppare in Python: un passo verso la libertà
Cosa ci è piaciuto di Python
● …
● Una code convention ben formalizzata ( PEP8 )
● Strutture dati built-in ( lists, tuples, sets, dict )
● L’overloading degli operatori
● Keyword arguments
Matteo Cafarotti - Serafino Beraldi
13. Sviluppare in Python: un passo verso la libertà
Python consente di scrivere meno codice
def backup_txt_file(file_name):
in_file = open(file_name,"r")
out_file = open("backup_file.txt","w")
i = 0
for line in in_file.readlines():
i += 1
out_file.write("%s : %s" % (i ,line))
in_file.close()
out_file.close()
meno codice => TTM migliore
Matteo Cafarotti - Serafino Beraldi
14. Sviluppare in Python: un passo verso la libertà
Usare l'interprete Python in modo interattivo
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) [GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> (2+3)*4
20
>>> nome = raw_input('Inserisci il tuo nome: ')
Inserisci il tuo nome: Matteo
>>> print nome
Matteo
>>> file = open("/home/serafino/ciao.txt")
>>> file.readline()
'Ciao Pythonn'
L'interprete consente di testare le funzioni durante lo sviluppo!
Matteo Cafarotti - Serafino Beraldi
15. Sviluppare in Python: un passo verso la libertà
Pre-compilazione automatica dei sorgenti
javac java
a.java a.class
python python
a.py a.pyc
La pre-compilazione automatica fa risparmiare molto tempo!
Matteo Cafarotti - Serafino Beraldi
16. Sviluppare in Python: un passo verso la libertà
File di configurazione in Python
DEBUG = True DATABASES = {
TIME_ZONE = 'Europe/Rome' 'default': {
INSTALLED_APPS = ( 'ENGINE': 'postgresql_psycopg2',
'djangodevtools', 'NAME': 'db_name',
'kiowa', 'USER': 'db_user',
'myapp', 'PASSWORD': 'db_pwd',
) 'HOST': 'localhost',
'PORT': '',
}
}
No XML o properties!
Matteo Cafarotti - Serafino Beraldi
17. Sviluppare in Python: un passo verso la libertà
Restituire più di un valore
>>> def split_lista(lista):
... pari, dispari = [], []
... for i in lista:
... (dispari if bool(i % 2) else pari).append(i)
... return pari, dispari
...
>>> p, d = split_lista([3,2,6,5,1,8,5,8,2,6,5,1,5,7,3,2,9,0,2,4,7])
>>> p
[2, 6, 8, 8, 2, 6, 2, 0, 2, 4]
>>> d
[3, 5, 1, 5, 5, 1, 5, 7, 3, 9, 7]
Riduce la quantità di codice!
Matteo Cafarotti - Serafino Beraldi
18. Sviluppare in Python: un passo verso la libertà
Valori di default sui parametri
>>> def split_lista(lista=[]):
c ... pari, dispari = [], []
... for i in lista:
... (dispari if bool(i % 2) else pari).append(i)
... return pari, dispari
...
>>> p, d = split_lista()
>>> p
[]
>>> d
[]
Riduce la quantità di codice!
Matteo Cafarotti - Serafino Beraldi
19. Sviluppare in Python: un passo verso la libertà
Test
from django.test import TestCase
class PersonaTestCase(TestCase):
fixtures = ['persone.json']
def test_save(self):
"""
Test save worst-case: not all mandatory fields are provided => IntegrityError
"""
data = {
‘name' : ‘Mario',
}
target_item = Persona(**data)
self.assertRaises(IntegrityError, target_item.save, force_insert=False)
Il metodo assertRaises è molto comodo!
Matteo Cafarotti - Serafino Beraldi
20. Sviluppare in Python: un passo verso la libertà
Doctest
def split_lista(lista=[]):
'''
Suddivide una lista di interi in due liste, ...
Usage:
>>> p, d = split_lista([3,2,6,5,1,8,5,8,2,6,5,1,5,7,3,2,9,0,2,4,7])
>>> p
[2, 6, 8, 8, 2, 6, 2, 0, 2, 4]
>>> d
[3, 5, 1, 5, 5, 1, 5, 7, 3, 9, 7]
'''
...
return pari, dispari
Aumenta la leggibilità e garantisce il “corretto” funzionamento!
Matteo Cafarotti - Serafino Beraldi
21. Sviluppare in Python: un passo verso la libertà
PEP8
class Classe1(object):
def __init__(self):
# ...
2 righe bianche tra un classe e l'altra →
class Classe2(object):
def metodo1(self):
1 spazio bianco
# ...
1 riga bianca tra un metodo e l'altro →
def metodo2(self, a, b):
self.X = a + b
# ...
1 spazio bianco
Aumenta la leggibilità del codice!
Matteo Cafarotti - Serafino Beraldi
22. Sviluppare in Python: un passo verso la libertà
Strutture dati built-in
>>> # liste
>>> l = [7, 19 ,14, 5, 11]
>>> l[1]
19
>>> l[2:]
[14, 5, 11]
>>> l.append(16)
>>> l
[7, 19, 14, 5, 11, 16]
>>> # insiemi
>>> s1 = set([1, 23, 5, 6, 11, 23, 5, 4])
>>> s1
set([1, 4, 5, 6, 11, 23])
>>> s2 = set([23, 15, 6, 15])
>>> s2
set([15, 6, 23])
>>> s1 | s2 # unione tra due insiemi
set([1, 4, 5, 6, 23, 11, 15])
>>> s1 & s2 # intersezione tra due insiemi
Set([6, 23])
Matteo Cafarotti - Serafino Beraldi
23. Sviluppare in Python: un passo verso la libertà
Overloading degli operatori
class Complex(object):
def __init__(self, real, imag):
self.real = real
self.imag = imag
def __repr__(self):
return '(%s,%si%s)' % (self.real, '-' if self.imag<0 else '', abs(self.imag))
def __add__(self, c):
return Complex(self.real+c.real, self.imag+c.imag)
def __mul__(self, c):
return Complex(self.real*c.real-self.imag*c.imag, self.real*c.real+self.imag*c.imag)
>>> a = Complex(1,1)
>>> b = Complex(1,-1)
>>> b = Complex(-1,-1)
>>> a+b*c
Aumenta la leggibilità! u'(1,i3)'
Matteo Cafarotti - Serafino Beraldi
24. Sviluppare in Python: un passo verso la libertà
Keyword arguments
class Persona(object):
def __init__(self, nome="", cognome="", **kwargs):
self.nome = nome
self.cognome = cognome
for k, v in kwargs.items():
setattr(self, k, v)
def __repr__(self):
return '%s %s' % (self.cognome, self.nome)
>>> Persona(nome='Marco')
Marco
>>> p = Persona(nome='Marco', cognome='Rossi', citta='Roma')
>>> p
Rossi Marco
Riduce la quantità di >>> p.citta
'Roma'
codice!
>>> p.email = "marco.rossi@email.com"
>>> p.email
'marco.rossi@email.com'
Matteo Cafarotti - Serafino Beraldi
25. Sviluppare in Python: un passo verso la libertà
Campi di applicazione
Industria cinematografica
● Python è stato adottato dalla Dreamworks nell'ambito della produzione
delle animazioni 3D in sostituzione di Perl per la maggiore facilità di
utilizzo e per la capacità di integrazione con le librerie C++
● La Industrial Light & Magic (LucasFilm), l'azienda di effetti speciali che ha
creato Star Wars, utilizza Python per amalgamare insieme le centinaia di
computers e componenti software utilizzati in ambito di computer grafica.
Matteo Cafarotti - Serafino Beraldi
26. Sviluppare in Python: un passo verso la libertà
Campi di applicazione
Industria aerospaziale
● La Nasa utilizza Python per implementare i sistemi di controllo delle
proprie missioni
Matteo Cafarotti - Serafino Beraldi
27. Sviluppare in Python: un passo verso la libertà
Campi di applicazione
Monitoraggio traffico aereo
● Frequentis, uno dei leader a livello mondiale per le soluzioni di gestione
del traffico aereo e la sicurezza pubblica, utilizza software scritto in Python
per il monitoraggio del traffico aereo
Matteo Cafarotti - Serafino Beraldi
28. Sviluppare in Python: un passo verso la libertà
Campi di applicazione
Metereologia
● ForecastWatch.com usa Python per aiutare meteorologi a produrre
previsioni meteo più accurate
Matteo Cafarotti - Serafino Beraldi
29. Sviluppare in Python: un passo verso la libertà
Campi di applicazione
Biologia
● AstraZeneca, una delle aziende leader nel mondo della farmaceutica,
utilizza Python nel processo di identificazione delle droghe.
● Molecular Modeling Toolkit, una libreria per la modellazione e la
simulazione delle molecole.
Matteo Cafarotti - Serafino Beraldi
30. Sviluppare in Python: un passo verso la libertà
Campi di applicazione
Amministrazione
● Devis utilizza Python e Zope (server per applicazioni) per la produzione di
un CMS (content management system) utilizzato nel settore dell'
eGovernment.
● K-tech utilizza Python e Django (web framework) per lo sviluppo del CRM
aziendale e web application per i propri clienti.
Matteo Cafarotti - Serafino Beraldi
31. Sviluppare in Python: un passo verso la libertà
Campi di applicazione
Sistemi Operativi
Molte delle applicazioni scritte per il Desktop Manager di Linux "Gnome" sono
scritte in linguaggio Python tramite utilizzo delle librerie PyGTK:
● Computer Temperature Monitor
● Bittorrent
● Exaile
● Pitivi
● Pycasa
Matteo Cafarotti - Serafino Beraldi
32. Sviluppare in Python: un passo verso la libertà
Big G, il gigante di Mountain View, ha avviato già da tempo una marcata
politica di investimenti su Python iniziata con l'assunzione di Guido Van
Rossum tra le sue fila e che ha portato alla nascita di Google App Engine
(piattaforma di sviluppo e hosting di web application scritta al 100% in
Python)
Matteo Cafarotti - Serafino Beraldi
33. Sviluppare in Python: un passo verso la libertà
Altri
● Red Hat ha implementato in python il proprio tool di installazione
Anaconda.
● Infoseek usa python nei propri prodotti per la ricerca sul web.
● Yahoo! ha sviluppato in python alcuni servizi di internet.
Matteo Cafarotti - Serafino Beraldi
34. Sviluppare in Python: un passo verso la libertà
Primo impatto
Il primo impatto con Python può disorientare:
● Eclipse non risponde più ai comandi :-(
● Si ritorna alla shell
● Rispolverare i pattern di programmazione ed i principi Object Oriented
La prima impressione è che programmare in queste condizioni
sarà maledettamente faticoso!
Matteo Cafarotti - Serafino Beraldi
35. Sviluppare in Python: un passo verso la libertà
Siamo programmatori o specialisti di prodotto?
Sviluppare software in un linguaggio come Java che è supportato da
strumenti (IDE e Frameworks) sempre più avanzati ha reso il processo di
sviluppo più facile.
Scrivere codice che superi la fase di compilazione senza errori è ormai un
obiettivo alla portata di tutti.
Gli strumenti sono i veri protagonisti!
Matteo Cafarotti - Serafino Beraldi
36. Sviluppare in Python: un passo verso la libertà
Python può rappresentare un passo verso la libertà?
Il mercato dei programmatori è saturo di javisti
surplus di offerta rispetto alla domanda
crollo del valore di mercato di quella tipologia di skill
Chi ne gioverà saranno le aziende che avranno a disposizione
forza lavoro a costo irrisorio e facilmente sostituibile.
Quali saranno le conseguenze?
Matteo Cafarotti - Serafino Beraldi
37. Sviluppare in Python: un passo verso la libertà
Conseguenze
● Stipendi sempre più bassi per i programmatori java
● Qualità del codice e del prodotto software sempre più scadente
● Perdita di competitività delle aziende nei confronti dei competitors
internazionali
Matteo Cafarotti - Serafino Beraldi
38. Sviluppare in Python: un passo verso la libertà
Abbracciare un linguaggio che pone come conditio sine qua non una preparazione
consistente ed “effettiva” è una garanzia
● per la nostra professione
● per le aziende che decidono di investirvi
Siamo ritornati protagonisti!
Matteo Cafarotti - Serafino Beraldi
39. Sviluppare in Python: un passo verso la libertà
Riferimenti
www.python.org
m.cafarotti@gmail.com
serafino.beraldi@gmail.com
Matteo Cafarotti - Serafino Beraldi
40. Sviluppare in Python: un passo verso la libertà
Estrazione!!!
Matteo Cafarotti - Serafino Beraldi