2008 python

Post on 06-Dec-2014

353 views 1 download

description

 

Transcript of 2008 python

PythonPythonLinuxDay-2008

by Orcim

PresentazionePresentazione

● Michielutti Loris (nickname) Orcim● Lavoro nell'ambito della progettazione● Dal 1980 scrivo codice in vari linguaggi

Assembler, C, C++ e progetto schede elettroniche

a microprocessori● Dal 2004 mi sono avvicinato

al meraviglioso mondo di Python

PanoramicaPanoramica● A cosa serve un linguaggio di programmazione

● Perche' Python

● Cosa si impara programmando● Qual'e' il miglior linguaggio

– (sono un programmatore)

A cosa serve un Linguaggio di A cosa serve un Linguaggio di ProgrammazioneProgrammazione

● definire delle sequenza ripetibili

● documentare e riprodurre tali sequenze– (sono un buon programmatore)

● imparare ad analizzare e a scegliere le situazioni piu' consone

– (sono un analista)

Cosa si impara programmandoCosa si impara programmando● * Logiche ● * Funzioni● * Ricorsioni● * Astrazione● * Algoritmi

● * Precisione● * Organizzazione● * Comunicazione● * Collaborazione

Qual'e' il miglior linguaggio?Qual'e' il miglior linguaggio?

● quello che uno conosce meglio● il piu' aperto possibile● il piu' facile da estendere● quello che permette piu' approcci al problema● quello che fornisce piu' documentazione e materiale

a questo punto posso affermare che per imparare a programmare python e' una meraviglia.

perche' Python?perche' Python?● Sintassi cristallina

(50% di codice in meno, 300% piu' produttivo)● Interprete interattivo (valutazione in tempo reale)● Alto livello di astrazione● Potenti strutture dati● Diversi Paradigmi (Procedurale,Funzionale,Oggetti)● Nessuna necessita' di distruggere gli oggetti

non piu' utilizzati. (Garbage Collection)● Estendibile (scrivere componenti in C,C++,ecc)

● Customizzabile (leggere componenti da C,C++,ecc)● Multi piattaforma (linux,windows,mac,ecc)

Caratteristiche di baseCaratteristiche di base

● Struttura Dati

● Controllo di flusso

● Funzioni

attenzione attenzione PythonPython lavora per referenza! lavora per referenza!(vedremo cosa significa)(vedremo cosa significa)

Struttura DatiStruttura Dati (tipi)(tipi)

● Number (int,long, double) YES● Booleans YES● Characters NO● Strings YES● Arrays (su modulo esterno numpy) NI● Records NO

NumeriNumeri>>> a = 5 / 2>>> a = 5 / 2 # Integer(default)# Integer(default)>>> print a>>> print a22>>> b = 10L>>> b = 10L # Long# Long>>> print b>>> print b1010>>> c = a + 3.567>>> c = a + 3.567 # Double (float)# Double (float)>>> print c>>> print c5.5675.567>>> x = 3 >>> x = 3 # assegnazione# assegnazione>>> y = x >>> y = x # # cosa faccio qui?cosa faccio qui?>>> y += 1>>> y += 1 # chi mi sa dire quanto# chi mi sa dire quanto

# vale x?# vale x?print x, yprint x, y # attenzione in python ci# attenzione in python ci3 43 4 # sono pochi tipi # sono pochi tipi

# # mutabili!mutabili!

LogicheLogicheLe costanti booleaneLe costanti booleaneFalseFalse: 0,None,oggetti e contenitori vuoti: 0,None,oggetti e contenitori vuoti TrueTrue: not 0,oggetti e contenitori non vuoti: not 0,oggetti e contenitori non vuoti

Gli operatori di comparazioneGli operatori di comparazione==,!=,<,<=,etc.==,!=,<,<=,etc.

verifichiamo il verifichiamo il CONTENUTOCONTENUTO delle referenze! delle referenze!>>> x = 4; y = 4>>> x = 4; y = 4 # assegnamo 2 valori# assegnamo 2 valori>>> print x == y>>> print x == yTrueTrue

se vogliamo verificare la se vogliamo verificare la REFERENZAREFERENZA allora allorausiamo l'operatore usiamo l'operatore isis

>>> print x is y>>> print x is yFalseFalse

Logiche Logiche (and, or)(and, or)

Attenzione Attenzione andand e e oror non ritornano non ritornano TrueTrue e e FalseFalse ma il valore di una delle sotto-espressioni!ma il valore di una delle sotto-espressioni!X X andand Y Y andand Z Z

- se sono tutti - se sono tutti veriveri ritorna ritorna ZZ- altrimenti ritorna il primo valore - altrimenti ritorna il primo valore falsofalso

X X oror Y Y oror Z Z- se sono tutti - se sono tutti falsifalsi ritorna ritorna ZZ- altrimenti ritorna il primo valore - altrimenti ritorna il primo valore verovero

Trucco per implementare la condizione ternariaTrucco per implementare la condizione ternaria l'equivalente in C di (test ? val1 : val2)l'equivalente in C di (test ? val1 : val2)

res = 1 > 2 and val1 or val2res = 1 > 2 and val1 or val2 - quando il test e' - quando il test e' verovero ritorna ritorna val1val1 - quando il test e' - quando il test e' falsofalso ritorna ritorna val2val2 attenzione funziona solo con val1 attenzione funziona solo con val1 verovero!!

Stringhe Stringhe (sono sequenze immutabili)(sono sequenze immutabili)>>> a = “ciao”>>> a = “ciao” # assegnazione# assegnazione>>> print a>>> print aciaociao>>> b = a>>> b = a # copio la referenza# copio la referenza>>> print b>>> print bciaociao>>> a += ' mondo'>>> a += ' mondo' # riassegnazione# riassegnazione>>> print a,b>>> print a,bciao mondo ciaociao mondo ciao>>> print “bye”>>> print “bye” # stringa senza referenza# stringa senza referenzabyebye>>> b = '''ciao>>> b = '''ciao # assegnazione multi linea# assegnazione multi linea>>> sono un>>> sono un>>>>>> multi linea'''multi linea'''

Struttura DatiStruttura Dati (avanzata)(avanzata)

● Complex Numbers YES● Lists YES● Tuples YES● Hash tables (dizionari) YES

Numeri ComplessiNumeri Complessi>>> a = complex(1,2)>>> a = complex(1,2) # assegnazione# assegnazione

# usa il tipo float!# usa il tipo float!>>> print a.real>>> print a.real # parte reale# parte reale1.01.0>>> print a.imag>>> print a.imag # parte immaginaria# parte immaginaria2.02.0>>> print a>>> print a # visualizzazione# visualizzazione(1+j2)(1+j2) # in forma complessa# in forma complessa>>> a += (3+j4)>>> a += (3+j4) # operazioni# operazioni>>> print a>>> print a(4+j6)(4+j6)

Liste Liste (sono sequenze mutabili)(sono sequenze mutabili)>>> a = [1,'a',(1+j2)]>>> a = [1,'a',(1+j2)] # assegn. eterogenea # assegn. eterogenea >>> b = list('string')>>> b = list('string') # conv. di una stringa# conv. di una stringa>>> print a, b>>> print a, b # visualizzazione# visualizzazione[1,'a',(1+j2)] ['s','t','r','i','n','g'][1,'a',(1+j2)] ['s','t','r','i','n','g']>>> a += [3,4]>>> a += [3,4] # aggiungo N elementi# aggiungo N elementi>>> print a, a[1]>>> print a, a[1] # rifer. ad 1 elemento# rifer. ad 1 elemento[1,'a',(1+j2),3,4] 'a'[1,'a',(1+j2),3,4] 'a'>>> c = b>>> c = b # # copio la referenzacopio la referenza>>> b.append('a')>>> b.append('a') # aggiungo un elemento# aggiungo un elemento>>> print c>>> print c['s','t','r','i','n','g','a']['s','t','r','i','n','g','a']>>> c = b.copy()>>> c = b.copy() # # creo una copiacreo una copia >>> c = b[:]>>> c = b[:] # in modo esplicito# in modo esplicito

Tuple Tuple (sono sequenze immutabili)(sono sequenze immutabili)

>>> t = (1,2,'ciao',3)>>> t = (1,2,'ciao',3) # assegnazione# assegnazione>>> print t, t[2]>>> print t, t[2] # visualizzazione# visualizzazione(1,2,'ciao',3) 'ciao'(1,2,'ciao',3) 'ciao'>>> l = list(t)>>> l = list(t) # converto in lista# converto in lista>>> l += ['a']>>> l += ['a'] # aggiungo un elemento# aggiungo un elemento>>> print t[:-2]>>> print t[:-2] # visualizzo senza gli # visualizzo senza gli (1,2)(1,2) # ultimi 2 elementi# ultimi 2 elementi>>> print l[2:]>>> print l[2:] # visualizzo dal # visualizzo dal ['ciao',3,'a']['ciao',3,'a'] # 2 elemento in poi# 2 elemento in poi>>> print t[1:2]>>> print t[1:2] # visualizzo una # visualizzo una (2,'ciao')(2,'ciao') # porzione# porzione>>> n = tupla(l)>>> n = tupla(l) # converto in tupla# converto in tupla>>> print n>>> print n(1,2,'ciao',3,'a')(1,2,'ciao',3,'a')

Dizionari Dizionari (sono mappe non sono sequenze!)(sono mappe non sono sequenze!) vi accedo per chiave.vi accedo per chiave. le chiavi devono essere univoche!le chiavi devono essere univoche! >>> d = {'uno':1,2:'due','tre':'tre'}>>> d = {'uno':1,2:'due','tre':'tre'}>>> print d['uno']>>> print d['uno'] # visualizzo il valore# visualizzo il valore11 # dell'elemento 'uno'# dell'elemento 'uno'>>> d[4] = 'ciao'>>> d[4] = 'ciao' # nuovo elemento # nuovo elemento >>> del d['uno']>>> del d['uno'] # rimuovo un elemento# rimuovo un elemento>>> print d>>> print d # visualizzazione# visualizzazione{2:'due','tre':'tre',4:'ciao'}{2:'due','tre':'tre',4:'ciao'}>>> print d.keys()>>> print d.keys() # lista delle chiavi# lista delle chiavi[2,'tre',4][2,'tre',4]>>> print d.values()>>> print d.values() # lista dei valori# lista dei valori['due','tre','ciao']['due','tre','ciao']>>> print d.items()>>> print d.items() # lista degli elementi# lista degli elementi[(2,'due'),('tre','tre'),(4,'ciao')][(2,'due'),('tre','tre'),(4,'ciao')]

FunzioniFunzioni● Verifica dei tipi sugli argomenti NO● Parametri di default YES● Parametri per chiave YES● Parametri come funzioni YES

Tutte le funzioni ritornano un valore!Tutte le funzioni ritornano un valore!in caso di assenza della istruzione in caso di assenza della istruzione returnreturnla funzione torna il valore di default la funzione torna il valore di default NoneNone

In In pythonpython non esite l'overloading della funzione! non esite l'overloading della funzione! due funzioni non possono avere lo stesso nome due funzioni non possono avere lo stesso nome

anche se hanno differenti argomenti!anche se hanno differenti argomenti!

Funzioni (Funzioni (verifica dei tipi)verifica dei tipi)>>> def = foo(x):>>> def = foo(x): # definizione di una# definizione di una... ... print xprint x # funzione# funzione......>>> foo('ciao')>>> foo('ciao') # richiamo della funzione# richiamo della funzioneciaociao # # con una stringacon una stringa>>> foo(35)>>> foo(35) # richiamo della funzione# richiamo della funzione3535 # # con un interocon un intero

Nessuna verifica sui tipi dei parametri passati ?Nessuna verifica sui tipi dei parametri passati ?NO in realta' questo e' il NO in realta' questo e' il Dynamic Typing!Dynamic Typing!Se i parametri fossero stati es: Se i parametri fossero stati es: foo(x,y)foo(x,y)

e la funzione e la funzione print x * yprint x * ypythonpython avrebbe controllato e in caso di operazione non avrebbe controllato e in caso di operazione non

congrua avrebbe sollevato una eccezzione!congrua avrebbe sollevato una eccezzione!Questo e' lo Questo e' lo Strong Typing!Strong Typing!

Funzioni Funzioni (parametri di default)(parametri di default)>>> x = 35>>> x = 35 # referenzio un intero# referenzio un intero>>> def = foo(a=x):>>> def = foo(a=x): # definizione di una# definizione di una... ... print aprint a # funzione# funzione......>>> foo('ciao')>>> foo('ciao') # richiamo della funzione# richiamo della funzioneciaociao # # con un parametrocon un parametro>>> foo()>>> foo() # richiamo della funzione# richiamo della funzione3535 # # senza parametrisenza parametri>>> x = 10>>> x = 10 # riassegnazione!# riassegnazione!>>> foo()>>> foo() # 35 o 10 ?# 35 o 10 ?3535 # perche' il parametro di# perche' il parametro di

# default e' assegnato una# default e' assegnato una# sola volta!# sola volta!durante l'istanzadurante l'istanza

Funzioni Funzioni (parametri per chiave)(parametri per chiave)

>>> def = foo(x=1,y=2,z=3):>>> def = foo(x=1,y=2,z=3):... ... print 'x,y,z =',x,y,zprint 'x,y,z =',x,y,z......>>> foo()>>> foo() # richiamo della funzione# richiamo della funzionex,y,z = 1 2 3x,y,z = 1 2 3 # # senza parametrisenza parametri>>> foo(10)>>> foo(10) # passaggio dei parametri# passaggio dei parametrix,y,z = 10 2 3x,y,z = 10 2 3 # # per posizioneper posizione>>> foo(y=20)>>> foo(y=20) # passaggio dei parametri# passaggio dei parametrix,y,z = 1 20 3x,y,z = 1 20 3 # # per chiave (nome)per chiave (nome)>>> foo(10,z=30)>>> foo(10,z=30) # passaggio dei parametri# passaggio dei parametrix,y,z = 10 2 30x,y,z = 10 2 30 # # mistomisto

Funzioni Funzioni (parametri come funzioni)(parametri come funzioni)

>>> def = foo(x=1,y=2,z=3):>>> def = foo(x=1,y=2,z=3):... ... print 'x,y,z =',x,y,zprint 'x,y,z =',x,y,z......>>> foo(>>> foo(*[4,5]*[4,5])) # passaggio dei parametri# passaggio dei parametrix,y,z = 4 5 3x,y,z = 4 5 3 # # contenuti in una listacontenuti in una lista>>> >>> foo(**{'x':10,'z':30})foo(**{'x':10,'z':30})

# passaggio dei parametri# passaggio dei parametrix,y,z = 10 2 30x,y,z = 10 2 30 # contenuti in un dizion.# contenuti in un dizion.

# y=(valore di default)# y=(valore di default)>>> def = pippo(>>> def = pippo(x,yx,y):):... ... return x(y)return x(y) # passaggio dei parametri# passaggio dei parametri...... # # dove x e' una funzionedove x e' una funzione>>> pippo(foo,9)>>> pippo(foo,9)x,y,z = 9 2 3x,y,z = 9 2 3

Controllo dei flussiControllo dei flussi

● If then else YES● Case YES● While do YES● For YES● Omega-N YES● Assert YES

if

else then

TrueFalse

if then elseif then else

>>> x = 3>>> x = 3>>> if x < 10: print 'ciao'>>> if x < 10: print 'ciao'......ciaociao>>> if x > 10: print 'ciao'>>> if x > 10: print 'ciao'...... else: print 'bye'else: print 'bye'......byebye

Da console interattiva:Da console interattiva:

casecase

>>> x = 3>>> x = 3>>> if x == 1: print 'uno'>>> if x == 1: print 'uno'...... elif x==2: print 'due'elif x==2: print 'due'...... elif x==3: print 'tre'elif x==3: print 'tre'... else: print 'non esistente'... else: print 'non esistente'tretre>>>>>>

Da console interattiva:Da console interattiva:

if do ATrue

False

if do BTrue

False

while dowhile do

>>> x = 3>>> x = 3>>> while x > 0: >>> while x > 0: ...... print 'x =', xprint 'x =', x... ... x -=1x -=1......x = 3x = 3x = 2x = 2x = 1x = 1>>>>>>

Da console interattiva:Da console interattiva:

Si puo' usare la chiave Si puo' usare la chiave breakbreak per interrompere per interrompere anticipatamente il loop.anticipatamente il loop.Si puo' usare la chiave Si puo' usare la chiave continuecontinue per saltare al per saltare al ciclo successivo senza eseguire le istruzione ciclo successivo senza eseguire le istruzione successive alla chiave.successive alla chiave.

if

do

True

False

For For (interi,stringa)(interi,stringa)

>>> range(3)>>> range(3) # funzione che torna una# funzione che torna una[0,1,2][0,1,2] # lista di N elementi# lista di N elementi>>> for x in range(3):print 'x =',x>>> for x in range(3):print 'x =',x......x = 0x = 0 # ciclo di interi# ciclo di interix = 1x = 1x = 2x = 2

Da console interattiva:Da console interattiva:

>>> for x in 'ciao':print 'x =',x>>> for x in 'ciao':print 'x =',x......x = cx = c # ciclo di una stringa# ciclo di una stringax = ix = ix = ax = ax = ox = o

For For (lista,tupla)(lista,tupla)

>>> for x in [1,2,3]:print 'x =',x>>> for x in [1,2,3]:print 'x =',x......x = 0x = 0 # ciclo di una lista# ciclo di una listax = 1x = 1x = 2x = 2

Da console interattiva:Da console interattiva:

>>> for x in ('c','i','a','o'):print 'x =',x>>> for x in ('c','i','a','o'):print 'x =',x......x = cx = c # ciclo di una tupla# ciclo di una tuplax = ix = ix = ax = ax = ox = o

For For (dizionari)(dizionari)

>>> d=>>> d={'a':1,'b':2} {'a':1,'b':2} # creo un dizionario# creo un dizionario>>> for x,y in d.items()>>> for x,y in d.items():p:print 'foo =',x,yrint 'foo =',x,y......foo = a 1foo = a 1 # ciclo degli elementi# ciclo degli elementifoo = b 2foo = b 2>>> for x in d.keys()>>> for x in d.keys():p:print 'foo =',xrint 'foo =',x......foo = a foo = a # ciclo delle chiavi# ciclo delle chiavifoo = bfoo = b>>> for x in d.values()>>> for x in d.values():p:print 'foo =',xrint 'foo =',x......foo = 1 foo = 1 # ciclo dei valori# ciclo dei valorifoo = 2foo = 2>>>>>>

Da console interattiva:Da console interattiva:

Omega-NOmega-N

>>> flg = 2>>> flg = 2 # flag di ctrl# flag di ctrl>>> while True:>>> while True:... ... pprint 'eseguo A'rint 'eseguo A'... if flg <=0: break... if flg <=0: break... print 'eseguo B'... print 'eseguo B'... flg -=1... flg -=1 # omega-1# omega-1......eseguo Aeseguo Aeseguo Beseguo Beseguo Aeseguo Aeseguo Beseguo Beseguo Aeseguo A>>>>>>

Da console interattiva:Da console interattiva:

if

do A

do B

True

False

AssertAssert# l'istruzione assert verifica che una# l'istruzione assert verifica che una# determinata condizione sia vera# determinata condizione sia vera# durante l'esecuzione del programma# durante l'esecuzione del programma# altrimenti lo interrompe!# altrimenti lo interrompe!assert(x < 3)assert(x < 3) # if # if FalseFalse exit exit

Potenzialita'Potenzialita'di python:di python:

- puo' operare con le matrici.- puo' operare con le matrici.- - puo' graficare dati.puo' graficare dati.- puo' plottare in tridimensionale.- puo' plottare in tridimensionale.- puo' creare interfaccie grafiche.- puo' creare interfaccie grafiche.- puo' aprire e salvare files in diversi formati.- puo' aprire e salvare files in diversi formati.- puo' gestire immagini di vari formati.- puo' gestire immagini di vari formati.- puo' interagire, anche a basso livello con il Sistema Operativo - puo' interagire, anche a basso livello con il Sistema Operativo

e con la macchina.e con la macchina.

Le librerie Le librerie (packages)(packages)

In python librerie significa:In python librerie significa:files di script raccolti in ordine tipologico chiamati packages.files di script raccolti in ordine tipologico chiamati packages.

Un package non e' altro che una cartella dove all'interno troviamo:Un package non e' altro che una cartella dove all'interno troviamo:i files di script (moduli) i files di script (moduli) oltre al file speciale di nome: oltre al file speciale di nome: __init__.py__init__.pyche serve ad identificare la cartella come package.che serve ad identificare la cartella come package.

Il file speciale puo' essere anche vuoto.Il file speciale puo' essere anche vuoto.La prima volta che si importa un modulo dal packge vieneLa prima volta che si importa un modulo dal packge viene automaticamente richiamato ed eseguito il file automaticamente richiamato ed eseguito il file __init__.py__init__.py ! !Dunque si puo' usare questo file per inserire delle istruzioniDunque si puo' usare questo file per inserire delle istruzioni di preparazione al codice seguente ! di preparazione al codice seguente !

Vediamo alcune librerie e le loro potenzialita':

NumericNumeric

* permette di lavorare efficientemente con grandiquantita' di dati organizzati in tabelle e matrici (array).* velocita' di calcolo enormemente superiore grazie all'ottimizzazione del codice e alla gestione della memoria.

PyLab PyLab (plot 2d)(plot 2d)

* disegnare grafici bidimensionali* standalone con toolbar integrati (zoom, pan, ecc.)* Esportazioni in formati vettoriali* Customizzare i grafici in qualsiasi Gui* Sintassi di base molto simile al plot di Matlab* Scrivere formule usando la sintassi Latex

SciPySciPy

SSi appoggia a Numeric e pyLab puo' esser visto come un completamento dei primi 2.* vettori, tensori, trasformazioni... integrali, derivate, interpolazioni, polinomi * statistica* supporto per file di testo formattati per il Fortran* widgets per plot lineari e 3D* analisi di immagini* interfacce per il calcolo distribuito (parallelo)* elaborazione dei segnali

symPysymPy(calcolo simbolico)(calcolo simbolico)

* aritmetica di base *,/,+,-,*** semplificazioni (a*b*b+2*b*a*b) (3*a*b^2)→* espansioni ((a+b)^2) (a^2+2*a*b+b^2)→* funzioni (exp,ln,ecc)* numeri complessi* derivate* serie di taylor (laurent)* equazioni differenziali

Python Image LibraryPython Image Library (pil) (pil)

* Permette l'elaborazione di immagini da Python. * Sono supportati i piu' diffusi formati di immagine. Le funzioni possibili:

* visualizzare* ritagliare* filtrare* analizzare* ridimensionare* convertire* applicare filtri* ecc..

AstrofisicaAstrofisica

* PyRAF trattamento dei dati, array, immagini* PyAstro set di funzioni utili per calcoli astronomici * PyEphem scientific-grade astronomical computations* PyFits per leggere e scrivere il formato FITS

Fisica Atomica e MolecalareFisica Atomica e Molecalare

* MMTK toolkit di modellazione molecolare* PyMOL visualizzazione 3d, rendering, ecc* Vmd visualizzazione molecolare animata

VpythonVpython

Real-time 3D Graphics (Interactive Scenes)

Interfaccie graficheInterfaccie grafiche

<- Tkinter(tlc/tk)

<- PyGtk pyQt4 ->

WxPython →

ecc..

FineFineRiferimenti locali:Riferimenti locali: - www.velug.it # il sito del Velug - orcim.50webs.com # il mio sito - orciml@gmail.com # il mio indirizzo

Riferimenti del linguaggio:Riferimenti del linguaggio: - http://www.python.org/ # sito ufficiale - http://www.planetpython.org/ # discussioni giornaliere - http://wiki.python.org/moin/Documentation # documentazione - http://groups.google.com/group/it.comp.lang.python # gruppo di discussione - http://lists.python.it/pipermail/python/ # mail-list archivio

Domande ?Domande ?