Sei sulla pagina 1di 12

Download

Documentazione

FAQ

Aiutaci!!!

Eoraqualcosadicompletamentedifferente...

PythonIstantaneo
diMagnusLieHetland tradottodaAlexMartelli

Questo un corso rapido di minima sul linguaggio di programmazione Python. Per saperne di pi, dai un'occhioalladocumentazionesulsitowebdiPython,http://www.python.org/,specialmenteiltutorial. Se ti staichiedendoperchtidovrebbeinteressare,guardalapaginadeiparagoni,dovePythonparagonatoad altrilinguaggi. Questaintroduzioneharicevutomoltelodidalettorisoddisfatti,edstatatradottainvarilinguaggi,fracui Portoghese,Russo,Norvegese,CoreanoeSpagnolo.
(PaginaPythondiM.L.Hetland)

1.Fondamenti Anzitutto,pensaalPythoncomepseudocodice.quasivero.Levariabilinonhannotipi,nsidichiarano. Appaiono quando le assegni, spariscono quando non le usi pi. L'assegnazione si fa con l'operatore = . L'eguaglianzasicontrollaconl'operatore= .Puoiassegnarepivariabiliallavolta: =
xyz=123 ,,,,

frteod=scn,frt is,scneodis

a=b=13 2

Iblocchisonoindicatidall'indentazione,esolodall'indentazione.(N B G NE D E I / N ngraffe.)Alcunecomuni strutturedicontrollo:


ir(0adx<2) fx<5ox>1n0: pit"lvlrK" rnIaoeO.

ir10 fx<5o0<x<2:

pit"lvlrK" rnIaoeO.

frii12345: on[,,,,] pit"trzoenmr" rnIeainueo,i

x=1 0 wiex>: hl=0 pit"noannngtv. rnxacroeaio" x=x1

Iprimidueesempisonoequivalenti. Lavariabileindicedatanelciclo f r o iterasuglielementidiunalist(scrittacomenell'esempio).Perfareun ciclof r o "normale"(ciounciclodiconteggio),usalafunzionebuiltinr n e ) ag(.


#Sapaoid9cmrs. tmaivlra0a9opei frvleiag(0) oaunrne10: pitvle rnau

(Larigacheiniziacon"# "uncommento,edignoratadall'interprete.) Okoranesaiabbastanzaper(inteoria)implementarequalsiasialgoritmoinPython.Aggiungiamounpo'di interazioneelementareconl'utente.Peravereinputdall'utente(daunpromptditesto),usalafunzionebuiltin ipt nu.


x=ipt"metrnnmr:" nu(Imteeuueo) pit"lqarteueo,xx rnIudaodlnmr"*

La funzione i p t mostra il prompt passatole (che pu essere vuoto) e permette all'utente di immettere nu qualsiasivalorePythonvalido.Inquestocasociaspettavamounnumerosevieneimmessoqualcosad'altro (adesempiounastringa),ilprogrammavaincrash.Perevitarlociservirebbeunpo'dicontrollodeglierrori. Quinonstaraparlarnebastidireche,sevuoichel'inputdell'utentesiapresoverbatimcomestringa(cos che tutto possa venire immesso), userai invece la funzione r w i p t Se volessi convertire la stringa a _ n u . immessas inunintero,potrestipoiusarei t s . n() Nota:Sevuoileggereunastringaconi p t n u ,l'utentedovrscrivereesplicitamentelevirgolette.InPython,le stringhepossonoessereracchiusefravirgolettesempliciodoppie. Quindi,abbiamocopertostrutturedicontrollo,inputeoutputoraciservonodellebellestrutturedati.Le

pi importanti sono liste e dizionari. Le liste sono scritte con parentesi quadre, e possono naturalmente essereannidate:
nm"lee,"on] ae=[Ces"Jh"

x=[123,yz,[]] [,,][,][[]]

Una delle cose carine delle liste che puoi accederne gli elementi separatamente o a gruppi, attraverso indiciamento e affettamento. L'indiciamento si fa (come in molti altri linguaggi) appendendo l'indice fra parentesiquadreallalista.(Notacheilprimoelementohaindice0).
pitnm[]ae0tma"onCes" rnae1,nm[]#SapJhlee

nm[]="mt" ae0Sih

L'affettamento quasi come l'indiciamento, eccetto che scriverai sia l'indice d'inizio sia quello di fine del risultato,conunduepunti(": ")asepararli:
x=[sa""pm,sa""pm,sa""gs,ad,sa" "pm,sa""pm,sa""pm,eg""n""pm]

pitx57tmalit"gs,ad] rn[:]#Sapalsa[eg""n"

Notachelafinenoncompresa.Semancaunodegliindici,significachevuoituttoinquelladirezione.Per esempio l s [ 3 significa "ogni elemento dall'inizio di l s sino all'elemento 3, non compreso" (Si it:] it potrebbe sostenere che significa in realt l'elemento 4, poich il conteggio parte a 0... vabb). l s [ : , it3] d'altra parte, significherebbe "ogni elemento di l s , partendo dall'elemento 3 (compreso) sino all'ultimo, it compreso." Per avere risultati davvero interessanti, puoi usare anche numeri negativi: l s [ 3 il terzo it] elementodallafinedellalista... Apropositodiindiciamento,potrebbeinteressartisaperechelafunzionebuiltinl n e tidlalunghezzadiuna lista. Ora,dunqueeidizionari?Perfarlasemplice,sonocomeliste,mailorocontenutinonsonoordinati.Come siindicizzanoallora? B, ogni elemento ha una chiave, cio un "nome" che usato per trovare l'elemento propriocomeinunverodizionario.Unpaiodidizionarid'esempio:
{"lc":2423,"oi":223, Aie3552Brs536 "lrc":2555Drs3263 Caie322,"oi":2644}

profrtnm'Rbn,'atnm'Ho" esn={'isae:"oi"lsae:"od, ocpto'Sonrl 'cuain:"cude"}

Ora, per avere l'occupazione di p r o , usiamo l'espressione p r o [ o c p t o " . Se volessimo esn esn"cuain] cambiareilsuocognome,potremmoscrivere:
pro[lsae]="fLcse" esn'atnm'ookly

Semplice,no?Comeleliste,idizionaripossonocontenerealtridizionari.Oancheliste.Enaturalmenteanche lelistepossonoconteneredizionari.Quindi,sipossonofacilmentefarestrutturedatipiuttostoavanzate. 2.Funzione Prossimo passo: l'astrazione. Vogliamo dare un nome a un brano di codice, e chiamarlo con un paio di parametri.In altre parole vogliamo definire una funzione(o"procedura"). facile. Usa la keyword d f e cos:
dfsur() eqaex: rtr* eunxx

pitsur()#Sap rnqae2tma4

Perquellidivoichelocapiscono:tuttiiparametriinPythonsonopassatiperriferimento(come,adesempio, inJava).Perquellichenonlocapiscono:nonvenepreoccupate: ) Python ha gran copia di cose graziose come gli argomenti con nome e gli argomenti di default e pu gestire un numero variabile di argomenti a una singola funzione. Per altre informazioni su questo, vedere il tutorialdiPython,sezione4.7. Sesaiusarelefunzioniingenerale,questoquelchetiservesaperesudiloroinPython.(Ahs...lakeyword r t r terminal'esecuzionedellafunzioneerestituisceilvaloredatole.) eun Unacosachepotrebbeessertiutilesapere,per,cheinPythonlefunzionisonovalori.Cos,sehaiuna funzionecomes u r ,potrestifarequalcosacome: qae
qebe=sur uelqae qebe2 uel() Sap tma4

Per chiamare una funzione senza argomenti devi ricordarti di scrivere d i ( e non d i . Quest'ultimo, ot) ot comeabbiamomostrato,ritornasololafunzionestessa,comevalore.(Questovaleancheperimetodidegli oggetti...vedioltre.) 3.Oggettieroba... Pensotusappiacomefunzionalaprogrammazioneaoggetti.(Altrimenti,questasezionepotrebbenonavere moltosensoperte.Nonimporta...cominciaagiocaresenzaglioggetti: .)InPythonsidefinisconoleclassi ) conlakeyword(sorpresa!)c a s l s ,cos:
casBse: lsakt

#Rcrasmr'roetsl* iodepelagmno*ef df_ii_(efcnet=oe: e_nt_sl,otnsNn) sl.otns=cnetr[ efcnetotnso]

dfadsl,lmn) ed(efeeet: sl.otnsapn(lmn) efcnet.pedeeet

dfpitm(ef: ern_esl) rsl" eut=" freeetiefcnet: olmnnsl.otns rsleut+""+`lmn` eut=rsleeet pit"otee"rsl rnCnin:+eut

Cosenuovequi: 1. Tuttiimetodi(funzionidiunoggetto)ricevonounargomentoinpiall'iniziodellalistadegliargomenti, checontienel'oggettostesso(dettos l inquestoesempio,ilchel'abitudine.) ef 2. Imetodisichiamanocos:o j c . e h d a g , r 2 . betmto(r1ag) 3. Alcuninomidimetodo,come_ i i _ ,sonopredefiniti,consignificatispeciali._ i i _ ilnome _nt_ _nt_ delcostruttoredellaclasse,ciolafunzionechiamataquandocreiun'istanza. 4. Alcuniargomentipossonoessereopzionalieavereunvaloredidefault(comedettoprima,nella sezionesullefunzioni).Questosifascrivendoladefinizionecome:
dfsa(g=2:.. epmae3).

Qui,s a puesserechiamataconunoozeroparametri.Senonnevengonousati,ilparametroa e pm g avrvalore32. 5. "Logicacortocircuito".undettagliocarino...vedisotto. 6. Gliapostrofirovesciaticonvertonounoggettoallasuarappresentazionestringa.(Cossee e e t lmn contieneilnumero1,allora` l m n ` e e e t lostessodi" " 1 mentre' l m n ' e e e t unastringaletterale.) 7. Ilsegnodiaddizione+ usatoancheperconcatenarelisteestringhe.Lestringheinrealtsonosolo listedicaratteri(ilchesignificachepoteteusaresudiesseindiciamentoeaffettamentoelafunzione ln e .Ganzo,eh?) Nessun metodo (n variabile membro) protetto (o privato o simile) in Python. L'incapsulamento praticamentequestionedistilediprogrammazione.(Setiservedavvero,cisonoconvenzionisuinomi che permettonounpo'diprivacy: ). ) Ora,quellalogicacortocircuito...

TuttiivaloriinPythonpossonoessereusaticomevalorilogici.Alcunideipi"vuoti",come[ ,0 " e N n ] , " oe rappresentanolafalsitlogica,mentrelamaggiorpartedeglialtrivalori(come [ ] 1 " e l , w r d ) 0 , o H l o o l " rappresentanolaveritlogica. Ora,leespressionilogichecomea a d b n sonovalutatecos:Primo,sicontrollasea vero.Senonlo,il risultato. Se lo , il risultato b (che rappresenter il valore di verit dell'espressione.) La logica corrispondentepera o :sea rb vero,ilrisultato.Senonlo,ilrisultatob . Questo meccanismo fa s che a d e o si comportino come gli operatori booleani che dovrebbero n r implementare, ma ti permette anche di scrivere espressioni condizionali semplici e dolci. Per esempio, l'istruzione
i: fa pita rn es: le pitb rn

potrebbeesserescrittaanche:
pitao rnrb

Ineffetti,questopiuttostoidiomaticoinPyton,quindimeglioabituarcisi.quelchefacciamonelmetodo Bse._nt_ a k t _ i i _ .L'argomento c n e t haunvaloredidefaultdi N n (che,fralealtrecose,false). otns oe Quindi,percontrollaresehaunvalore,potremmoscrivere:


iotns fcnet: sl.otns=cnet efcnetotns es: le sl.otns=[ efcnet]

Naturalmente,orasaichec'unmodomigliore.Eperchnonglidiamoilvaloredidefaultdi [ dasubito? ] Perch a causa di come funziona Python, questo darebbe a tutti i Basket la stessa lista vuota come contenutodidefault.Appenaunocominciaariempirsi,tutticonterrebberoglistessielementi,eildefaultnon sarebbepivuoto...perimpararedipisuquesto,dovrestileggereladocumentazioneecercareladifferenza fraidentiteeguaglianza. Unaltromododifarequantosopra:
df_ii_(efotns[) e_nt_sl,cnet=]: sl.otns=cnet[] efcnetotns:

Puoiindovinarecomequestofunziona?Invecediusarelastessalistavuotadappertutto,usiamol'espressione cnet[] o t n s : perfareunacopia.(Semplicemente,affettiamoiltutto.)

Cos,perfareeffettivamenteunB s e eusarlo(ciochiamarequalchemetodosudiesso)faremoqualcosa akt come:


b=Bse('pl''rne] akt[ape,oag') bad"eo" .d(lmn) bpitm( .rn_e)

Cisonoaltrimetodimagicioltrea_ i i _ .Unodiessi _ s r _ _nt_ _ t _ ,chedefiniscecheaspettovuoleavere l'oggettosevienetrattatocomestringa.PotremmousarlonelnostroBasketinvecedip i t m : rn_e


df_sr_sl) e_t_(ef: rsl" eut=" freeetiefcnet: olmnnsl.otns rsleut+""+`lmn` eut=rsleeet rtrCnan:+eut eun"otis"rsl

Ora,sevolessimostampareilBasketb ,potremmosemplicementeusare:
pitb rn

Ganzo,eh? Lesottoclassisifannocos:
casSaBse(akt: lspmaktBse) #.. .

Python permette eredit multipla, quindi puoi avere varie superclassi fra parentesi, separate da virgole. Le classisiistanzianocos: x = B s e ( .Icostruttori,comedicevo,sifannodefinendolaspeciale funzione akt) membro _ i i _ . Supponiamo che S a B s e abbia un costruttore_ i i _ ( e f t p ) Allora _nt_ pmakt _ n t _ s l , y e . potrestifarneunocos:y = S a B s e ( a p e " . pmakt"pls) Se, nel costruttore di S a B s e , ti servisse chiamare il costruttore di una o pi superclassi, potresti pmakt chiamarlocos: B s e . _ n t _ s l ) a k t _ i i _ ( e f .Notache,oltreainormaliparametri,devifornireesplicitamente s l ,poichla_ i i _ dellasuperclassenonsaconqualeistanzastiatrattando. ef _nt_ PeraltremeravigliesullaprogrammazioneaoggettiinPython,vedilasezione9deltutorial. 4.UntruccomentaleJedi. (Questasezionequasoloperchpensochesiabella.Decisamentenonnecessarioleggerlaperiniziarea impararePython.) Tipiaccionoiconcettisbalorditivi?Allora,seseidavveroaudace,potrestidareun'occhiataalsaggiodiGuido van Rossum sulle metaclassi. Se per preferisci che il tuo cervello non esploda, potrebbe bastarti questo

trucchetto. Pythonusaspazidinomidinamicienonlessicali.Questosignificachesehaiunafunzionecos:
dfoag_uc(: ernejie) rtr* eunx2

... dove una variabile (in questo caso x non connessa a un argomento e non riceve un valore entro la ) funzione,Pythonuserilvalorecheessahadoveequandolafunzionechiamata.Inquestocaso:
x=3 y=oag_uc( rnejie) #yoa6 r x=1 y=oag_uc( rnejie) #yoa2 r

Di solito, questo il tipo di comportamento che desideri (bench questo esempio sia un po' artificioso raramentesiaccedecosallevariabili.)Tuttavia,a volte pu essere carino avere qualcosa di simile a uno spazio di nomi statico, cio, memorizzare alcuni valori dall'ambiente nella funzione quando viene creata. Il mododifarequestoinPythonattraversogliargomentididefault.
x=4 dfapejiexx: epl_uc(=) rtr* eunx2

Qui,l'argomento x riceveunvaloredidefaultcheegualealvaloredellavariabile x nelmomentoincuila funzionevienedefinita.Quindi,sinchnessunofornisceunargomentoperlafunzione,sicomportercos:


x=3 y=apejie) pl_uc( #yio snw8 x=1 y=apejie) pl_uc( #yio snw8

Cosilvaloredix noncambiato.Seciservissesoloquesto,avremmoequivalentementepotutoscrivere:
dftmt_uc(: eoaojie)

x=4 rtr* eunx2

oanche
dfcro_uc(: eartjie) rtr eun8

Tuttavia,ilpuntocheilvaloredix raccoltodall'ambientenelmomentoincuilafunzionevienedefinita.In chemodoquestoutile?Facciamounesempiounafunzionechecomponealtreduefunzioni. Vogliamounafunzionechelavoracos:


foahipri,cs rmmtmotsno

snoops(i,o) ics=cmoesncs

x=sno() ics3

Dove c m o e la funzione che vogliamo costruire, e x ha il valore . 3 0 1 6 5 8 cio ops 0 8 6 2 8 1 3 , sncs3) i ( o ( ) .Ora,comefacciamoquesto? (Notachequistiamousandofunzionicomeargomento...ilcheuntruccogiparecchiocarinoins.) Chiaramente, c m o e accetta due funzioni come parametri, e restituisce una funzione che accetta un ops parametro.Quindi,unoscheletrodisoluzionepotrebbeessere:
dfcmoefn,fn) eops(u1u2: dfinrx: ene() ps. as#.. rtrne euninr

Potremmoesseretentatidiscrivere r t r u 1 f n ( ) entrolafunzione i n r eunfn(u2x) n e eaccontentarci.No, no,no.Questosicomporterebbemoltostranamente.Immaginailseguentescenario:


foahipri,cs rmmtmotsno

dffn() eu1x: rtrol! eunx+"wrd"

dffn() eu2x: rtrHlo" eun"el,

snoops(i,o)savrinbgit ics=cmoesncs#ualesoesalaa

x=sno() ics3

Ora,chevaloreavrebbe x ?Esatto: " e l , w r d . Perch? Perch quando c m o e viene chiamata, Hlo ol" ops raccoglieivaloridi f n e f n dall'ambiente,nonquellicheeranoingiroquandofucreata.Peravereuna u1 u2 soluzionefunzionante,tuttoquelchedobbiamofareusarelatecnicachehodescrittoprima:
dfcmoefn,fn) eops(u1u2: dfinrxu1fn,fn=u2: ene(,fn=u1u2fn) rtru1fn() eunfn(u2x) rtrne euninr

Oradobbiamosolosperarechenessunopassiallafunzionerisultantepidiunargomento,perchquestola romperebbe : .Aproposito,vistochenonciserveilnome i n r edesso contiene solo un'espressione, ) n e , tantovalefareunafunzioneanonima,usandolakeywordl m d : aba


dfcmoef,f) eops(12: rtrabax1f,f=21f() eunlmd,f=12f:f(2x)

Conciso,machiaro.Deviamarlo: ) (Esenonnehaicapitonulla,nonpreoccuparti.AlmenosperotiabbiaconvintochePythonpiche"soloun linguaggiodiscripting"...: ) ) 5.Eora... Giustopochecosettevicinoallafine.Lamaggioranzadellefunzionieclassiutilisonopiazzateinmoduli,che sono file di testo contenenti codice Python. Puoi importarli e usarli nei tuoi programmi. Per esempio, per usareilmetodos l t p i delmodulostandards r n ,puoifare,o: tig
iprtig motsrn

x=srn.pi() tigslty

Oppure...
fotigiprpi rmsrnmotslt

x=slty pi()

Per altre informazioni sui moduli della libreria standard, dai un'occhiata a www.python.org/doc/lib. Contengonounmucchiodirobautile. Tutto il codice nel modulo/script eseguito quando viene importato. Se vuoi che il tuo programma possa essereusatosiacomemoduloimportabilesiacomeprogrammaeseguibile,aggiungiallafinediessoqualcosa come:
i_ae_=_mi_"o) f_nm_="_an_:g(

Questounmodomagicoperdirechesequestomodulovienefattogirarecomescripteseguibile(cio,se nonstiamovenendoimportatidaunaltriscript),alloravachiamatalafunzioneg .Naturalmente,potrestifare o qualsiasicosainquestaposizionedopoilduepunti...: ) EperquellidivoichevoglionorendereeseguibileunoscriptsuUN*X,usatelaseguenteprimarigaperfarlo funzionaredasolo:


#/s/i/nyhn !urbnevpto

Infine,brevemenzionediunconcettoimportante:leEccezioni.Alcuneoperazioni(comedividereperzero,o leggeredaunfileinesistente)produconounacondizionedierrore,ciodieccezione.Puoianchefartiletue, sollevandoleinmomentiappropriati. Senonvienegestital'eccezione,iltuoprogrammaterminaestampaunmessaggiodierrore.Puoievitarlocon unaistruzionedit ye c p .Peresempio: r/ xet


dfsf_iiinab: eaedvso(,) ty r: rtr/ eunab ecpeoiiinro: xetZrDvsoErr rtroe eunNn

ZrDvsoErr e o i i i n r o un'eccezionestandard.Inquestocaso,avrestipotutocontrollarese b erazero,ma

inmolticasi,questastrategianonapplicabile.Inoltre,senonavessimolaclausolat y s f _ i i i n r in a e d v s o , ciosefosseunafunzionerischiosadachiamare,potremmoancorafarequalcosacome:
ty r: usf_iiinab naedvso(,) ecpeoiiinro: xetZrDvsoErr pit"oehnaiieyzrnusf_iiin rnSmtigwsdvddbeoinaedvso"

Nei casi in cui normalmente non ci sarebbe uno specifico problema, per potrebbe succedere, usare le eccezionipermettedievitarecostosicontrolliecc. Beh,questotutto.Sperotuabbiaimparatoqualcosa.Oravaiegioca.Ericordailmottoper imparare il Python: "Use the source, Luke." (Traduzione: leggi tutto il codice su cui puoi mettere le mani : ) Per ) cominciare, ecco un esempio. il ben noto algoritmo QuickSort di Hoare. Una versione con sintassi colorizzataqui. C' una cosa che pu meritare di essere detta su questo esempio. La variabile d n controlla se la oe p r i i n abbia o meno finito di muovere gli elementi. Quindi, quando uno dei due cicli interni vuol atto terminare l'intera sequenza di scambi, mette d n ad 1 poi esce con b e k Perch i cicli interni usano oe , r a . d n ?Perch,quandoilprimociclointernofiniscecon b e k se il prossimo ciclo debba partire o meno oe r a , dipendedalfattocheilcicloprincipalesiafinito,cio,sed n siastataomenopostaad1 oe :
wientdn: hlooe wientdn: hlooe #Ieasndura trioanbek

wientdn: hlooe #Eeutooslpionnhotdn"a sgiosleirmoapso"oed1

Unaversioneequivalente,forsepichiara,manellamiaopinionemenobellina,sarebbe:
wientdn: hlooe wie1 hl: #Ieasndura trioanbek

iooe fntdn: wie1 hl: #Eeutooslpionnhotdn"a sgiosleirmoapso"oed1

L'unicaragionepercuihousatolavariabile d n nelprimocicloerachemipiacevaconservarelasimmetria oe fraidue.Coslisipotrebbescambiareel'algoritmofunzionerebbeancora. AlcunialtriesempisitrovanosullapaginadeibocconcinidiJoeStrout.


[PaginaPythondiMagnusLieHetland]

CopyrightMagnusLieHetland(magnus@hetland.org)
Ultimamodificadell'originale:WedMay1923:29:50METDST1999