910 likes | 1.18k Views
Python : Introduzione al linguaggio ed esercizi. Marco Di Felice Sistemi Operativi , AA 2010-2011 Dipartimento di Scienze dell’Informazione Universita ’ degli Studi di Bologna. … Da dove iniziare.
E N D
Python: Introduzione al linguaggioedesercizi Marco Di Felice SistemiOperativi, AA 2010-2011 Dipartimento di Scienzedell’Informazione Universita’ degliStudi di Bologna
… Da dove iniziare • Qualchetestoconsigliato (e reperibile ON-LINE) per iniziare a programmare in Python: How to think like a Computer Scientist. Learning with Python – A.Downey, J. Elkner, C. Meyers (GNU) Dave into Python – Mark Pilgrim-
Il linguaggioPyhton • Ideatoneglianni ‘80 da G. van Rossum • Versioneattuale del linguaggio: 2.6 • Prevalentemente object-oriented, ma multi-paradigma(object-oriented, procedurale, funzionale, etc) • Utilizza un interprete per l’esecuzione(non compilato) • Dispone di librerie molto vaste per: parsing (HTML/XML), networking, GUI, accesso a database, Web scripting, etc
EseguireprogrammiPyhton • Due possibilimodalita’ di esecuzione: • Modalita’ interattiva $$ python >> a=3+5 • Modalita’ con Program Files $$ vim myprogram.py $$ python myprogram.py
Variabili, Tipi, Espressioni • In un programma Python non e’ necessariodichiarare le variabiliedillorotipo. • Il tipaggioavvienedinamicamente a run-time. • Assegnamento di valori a a variabili. message=“Hello world” a=5 x=2.34 >>type(message) <type ‘str’>
Espressioni • Operatorimatematici: + - / * // ** % • Operatorilogici: and or not • Operatoridi confronto: >, <, >=, <= • Assegnamento: = • CostantiBooleane: True False • Python <versione 2.2.1 Non esisteiltipo di datobooleano. FALSO: 0, stringavuota “ “, listavuota [], dizionariovuoto {}
Costrutti di selezione • Costrutti di selezione: if-else / if-elif- … - else IF CONDIZIONE: SEQUENZA DI COMANDI RAMO IF ELSE SEQUENZA DI COMANDI RAMO ELSE if x==y: print x, “ and “,y,” are equal “ else print x, “ and “,y,” are different “
Costrutti di iterazione • Costrutti di iterazione: while WHILE CONDIZIONE: SEQUENZA DI COMANDI DEL CICLO X=1.0 while x<10.0: print x,” “,math.log(x) x=x + 1.0
Indentazione e Blocchi • Python utilizzal’indentazione (e non le parentesigraffe) per distinguerel’inizio e la fine di un blocco (es. Il codice da eseguireall’interno di un ciclo). • Per questomotivo, indentarebeneilcodice e’ fondamentale! while n>0: while n>0: n=n-1 n=n-1 print n print n DIVERSO!!
Dichiarazione di Funzioni • Keyword def per identificarel’inizio di unafunzione DEFnomeFUNZIONE (argomenti): CORPO della FUNZIONE RETURN valore (opzionale) • Per richiamareunafunzione: nomeFUNZIONE (argomenti)
Funzioni Lambda • Python consente di definire al volopiccolefunzioni in una sola riga(lambda-funzioni). >> g= lamdba x: x**2 >> g(4) >> 16 • Le funzionilambda non possonocontenerecomandi e non possonocontenerepiu’ di un’espressione
Dichiarazione di Funzioni • (ES1): Scrivereilcodicedellafunzionefattoriale:
Dichiarazione di Funzioni • (ES1): Scrivereilcodicedellafunzionefattoriale: # Factorial function def factorial(n): if (n==0): return 1 else return n*factorial(n-1) >> print factorial(4) >> 24
Parametri e Funzioni • Python consente di definirefunzioni con parametriopzionali; se la funzione e’ chiamatasenzaargomento, l’argomentoprendeilvalorepredefinito (indicatonella signature dellafunzione). def power(a,b=2): return a**b >> power(4,3) >> power(4)
OperazionisuStringhe • In Python, unastringa e’ unalista di caratteri. message=“Hello world” • La funzionelenrestituisce la lunghezza >> len(message) >> 11 • L’operatore[] consente di accedereaisingolicaratterichecompongono la stringa: >> print message[0] >> ‘H’
OperazionisuStringhe >> message=“Hello world” >> print message [0] >> ‘H’ >> print message [2:3] >> ‘l’ (Selezionaunasottostringa) >> print message [2:] >> ‘llo World’ (Selezionaunasottostringa) >> print message [-1] >> ‘d’
OperazionisuStringhe • Le stringhesonolisteIMMUTABILI. message[0]=‘G’ NON SI PUO’ FARE!! • Libreria di funzionisustringhe import string Listepredefinitedellaclasse string: string.lowercase string.uppercase String.digits
OperazionisuStringhe • L’operatorefor … in consente di ciclaresututtiglielementi di unalista for c in str: print c • L’operatorein verifica la presenza di un carattere in unastringa. if c in str: print “Found!”
OperazionisuStringhe • (ES2): Scrivereunafunzionecheck_string(str)chericeve in input unastringa, e ritorna 0 se la stringastr e ben formata, 1 altrimenti. • Assumiamocheunastringasia ben formata se contienesolo caratteriminuscoli.
OperazionisuStringhe import string defcheck_string(str): for c in str: if not(c in string.lowercase): return 0 return 1 >> print check_string(“hello), “ “, check_string(“Hello”) >> 1 0
Liste di Elementi • In Python, unalista e’ un insiemeordinato di valori, in cui ciascunvalore e’ identificato da un indice. [] LISTA VUOTA [1,2,3,4,5] [“Hello”, “World”, “Python”] • Glielementipossonoessereeterogenei: [“Hello”,1,3.4,5] [“Hello”, [1,2], 4, 10, [1,2,3]]
Liste di Elementi Come con le stringhe: • [] per accedere ad un elementodellalista • inverifica la presenza di un elemento in unalista • lenrestituisce la lunghezzadellalista • +concatena due liste • *ripeteunalista un datonumero di volte
Liste di Elementi A differenzadellestringhe, le listesonoMUTABILI a=[1,2,3,4], a[0]=-1 • del per rimuovere un elementodellalista del a[0] • appendaggiunge un elementoallalista (in fondo) • insertaggiunge un elemento in unaposizionespecifica a.append(6) a.insert(0,6)
Liste di Elementi • Le listesonopassateper riferimentoe non per valore. a=[1,2,3] b=a a a b b [1,2,3] [1,2,3] [1,2,3] • … E se inveceb=a[:] ??
Liste di Elementi • (ES3) Data la listaseguente: a=[[1,2],3,4,5,6] Definirequalidelleoperazionisonovalide e quali no. • a[0][0]=5 • print a[0][-3] • print a[0][-1] • a[5]=‘b’ • a[2:4]=[2]
Liste di Elementi • (ES4) Determinarel’output del programmaseguente: a=[‘a’,’b’,[‘b’,’c’],1,2,3] del a[0] a[1][0]=‘a’ c=a[2:4] d=a[1] e=c+d print e
Liste di Elementi • (ES5) Determinarel’output del programmaseguente: def fun(a): return a[2:] a=[1,2,3,4,5] b=a b[3]=6 c=fun(a) c[2]=3 print c
Liste di Elementi • (ES6) Scrivere un programmachelegge input 5 numeriinteri da tastiera. Ogninumerolettovieneinserito in unalista solo se non e’ un duplicato di un numerogia’ letto. Se e’ un duplicato, ilprogramma continua la lettura da tastierafinche’ un numero non duplicatovienedigitato. Dopo aver lettoi 5 valori, ilprogramma ne calcola la media e la stampa a video.
Liste di Elementi # Read an integer value from the keybord defread_number(): message="Please insert an integer value " read=input(message) return read # Returns a list of 5 non-replicated values defread_list_values(): listread=[] # Number of readings from the input numread=0 while (numread <5): val=read_number() # Check if the reading is valid if not (val in listread): listread.append(val) numread+=1 else: print "This is a duplicated value ..." return listread
Liste di Elementi # Main program listv=read_list_values() # Initialize the average value average=0.0 # Compute the average value for val in listv: average+=val average=average / len(listv) print " The average value is ...", average
Liste di Elementi • List comprehension => Tecnicacompatta per mappareunalista in un’altraapplicandounafunzione a ciascunodeglielementidellalista. >> li=[1,2,3,4,5] >> li2=[elem * 4 for elem in li] >> print li2 >> [4,8,12,16,20]
Liste di Elementi • List comprehension + Filtri=> E’ possibileaggiungeredeifiltri, in modochealcunielementivenganomappatiedaltrirestinoalterati. >> li=[1,2,3,4,5] >> li2=[elem * 4 for elem in li if elem >2 ] >> print li2 >> [12,16,20]
Liste di Elementi • (ES7) Scrivereunafunzionecheck_sum_present(li, value) cheprende in input unalista di interi (si assume senzaelementiduplicati) ed un valore e verifica se nellalista ci sono due elementia,btalichea+b=value. La funzionedeverestituirela lista di tutte le coppie [a,b] chesoddisfano la condizione.
Liste di Elementi defcheck_sum_present(li, value): return [ [elem,value-elem] for elem in li if (((value-elem) in li) and (value-elem !=elem )) ] li=[1,2,3,4,5,6,7,8] print check_sum_present(li,11)
Tupla di Elementi • Unatupla di elementi e’ simile ad unalista, ma a differenzadelleliste e’ IMMUTABILE. tuple=1,2,3,4,5 tuple=(‘a’,’b’,’c’,’d’,’e’) • Le tuple sonoutili per fare swap di variabili o assegnamentimultipli: y, x = x, y a, b, c, d = 1, ‘Hello’, 4, 5.6
Tupla di Elementi A cheservono le tuple? • Le tuple sonopiu’ velocidelleliste=> utilizzare le tuple nelcaso in cui sidebba solo iteraresu un insieme di valori e non sidebbamodificarli. • Consentono di proteggeredallascritturaidatiche non devonoesseremodificati. • Le tuple, a differenzadelleliste, possonoessereusate come chiavi di un dizionario.
Dizionari • Un dizionario e’ un insieme di coppie: <chiave, valore>, in cui la chiave non deveesserenecessariamente un intero (a differenzadelleliste). dict={} dict[‘Mario’]=“0861343242” dict[‘Monica’]=“086243434” dict{‘Mario’:’0861343242’, ‘Monica’: …}
Dizionari • Il metodolenrestituisceilnumero di elementi • Il metodokeysresistuisce la listadellechiavi • Il metodovaluesrestituisce la listadeivalori • Il metododelelimina un elementodallalista • Il metodoclearcancellatuttoilcontenuto di un dizionario >> print dict.keys() >> print dict.values() >> del dict[2]
Dizionari • Il metodogetrestituisceilvaloreassociato ad unacertachiave: >> print dict.get(“Mario”) >> print dict.get(“Mario”,”Nome non trovato”) • Il metodohas_keyritorna 1 se la chiaveappareneldizionario, 0 altrimenti. >> print dict.has_key(“Mario”) >> True
Dizionari • Non possonoesserciduplicazioni di chiavi in un dizionario. • Glielementi di un dizionario NON sonoordinati. • Valorie chiavipossonoassumerequalsiasitipo. Non necessariamentetutte le chiavidevonoavere lo stessotipo. dict={“0”:120,”Marco”:32,”1.0”:[1,2,3]}
Dizionari • (ES8) Scrivere un programmachecalcolailprodotto di due matrici (supponiamoentrambe le matriciabbianodimensioneNxN) • (ES9) Ottimizzareilprogrammaprecedentenelcaso in cui le matricisiano sparse (cioe’ gran parte deivaloridellematricisianosettati a 0)
Dizionari • (ES10) Indicarel’output del programmaseguente. str=“hello” dict={‘h’:1,’e’:2,’l’:3} val=0 for c in str: val=val+dict.get(c,-1) print val
Dizionari • (ES11) Indicarel’output del programmaseguente. def fun(d,x): if d.has_key(x): d[x]=3 dic={‘a’:1,’b’:2,’c’:4} dic2=dic.copy() dic3=dic del dic[‘a’] fun(dic2,’a’) fun(dic3,’a’) dic2[‘b’]=dic2[‘a’]+dic3.get(‘a’,-2) print dic2[‘b’]
ClassiedOggetti • Python e’ un linguaggio ad oggetti; l’astrazione di classiedoggetto ha moltipunti in comune con altrilinguaggi di programmazione (es. Java) class Point: def __init__(self,x=0,y=0): self.x=x self.y=y
ClassiedOggetti • Il metodo__init__ e’ Il costruttoredellaclasse. • self e’ ilriferimentoall’oggettocorrente, tramiteil quale sipuo’ accedere ad icampidell’oggettocorrente. E’ il primo parametro di ognimetododellaclasse, ma non deveesserepassato dal chiamante. class Point: def distance(self, other): … p= Point(10,20) p1=Point(20,30) p.distance(p1) => NON: p.distance(p,p1)!!
ClassiedOggetti • Come in altrilinguaggi ad oggetti, e’ possibile fare overloading di operatori built-in (es. addizione, moltiplicazione, sottrazione, etc) def __add__(self, other): return Point(self.x+other.x,self.y+other.y) Point p1=new Point(x1,y1) Point p2=new Point(x2,y2) p3=p1 + p2
ClassiedOggetti • Come in altrilinguaggi ad oggetti, e’ possibilecrearegerarchie di classetramitel’ereditarieta’. • Come C++, Python supportal’ereditarieta’ multipla. • Per indicareche la classePoint3D e’ figliadellaclassePoint: class Point3D(Point):
ClassiedOggetti Esistonoalcunimetodi di classe “speciali”: • __repr__ ritornaunarappresentazione di un oggetto sotto forma di unastringa • __cmp__ e’ utilizzatoquandosieffettuailconfrontotraclassi (overloading dell’operatore ==) • __len__ritorna la lunghezzadell’oggetto • __delitem__richiamato da del istanza[chiave]
ClassiedOggetti • E’ possibiledefiniremetodiprivatiche non possonoesserereferenziatiall’esternodellaclasse. • La distinzionetrametodipubblici e metodiprivatisibasaesclusivamentesulnome. • Se ilnome di un metodo o attributoinizia con (man non finisce con) due underscore, e’ privato; ognialtracosa e’ pubblica. def __myfunction():
ClassiedOggetti • Come in Java/C++, Python consente la manipolazionedelleeccezionitramite I blocchitry…except • Il comando raise vieneusato per lanciareun’eccezione. try: fsock=open(“file.dat”,”r”) except IOError: