dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuepy08_it.pdf · 8 $( $ (?,?,?,?,?,?)

15

Upload: others

Post on 05-Feb-2020

12 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY08_it.pdf · 8 $( $ (?,?,?,?,?,?)

Full CircleEDIZIONE SPECIALE SERIE PROGRAMMAZIONE

LA RIVISTA INDIPENDENTE PER LA COMUNITÀ LINUX UBUNTU

full circle magazine non è affiliata né sostenuta dalla Canonical Ltd .

EDIZIONE SPECIALE

SERIE PROGRAMMAZIONE

PROGRAMMARE

IN PYTHON

VOLUME 8

Page 2: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY08_it.pdf · 8 $( $ (?,?,?,?,?,?)

Cos'è Full Circle

Full Circle è una rivista gratuita e

indipendente, dedicata alla famiglia

Ubuntu dei sistemi operativi Linux.

Ogni mese pubblica utili articoli

tecnici e articoli inviati dai lettori.

Full Circle ha anche un podcast di

supporto, il Full Circle Podcast, con

gli stessi argomenti della rivista e

altre interessanti notizie.

Si prega di notare che questaedizione speciale viene fornitasenza alcuna garanzia: né chi hacontribuito né la rivista Full Circlehanno alcuna responsabilità circaperdite di dati o danni chepossano derivare ai computer oalle apparecchiature dei lettoridall'applicazione di quantopubblicato.

Come contattarci

Sito web:http://www.fullcirclemagazine.org/

Forum:http://ubuntuforums.org/forumdisplay.php?f=270

IRC:#fullcirclemagazine suchat.freenode.net

Gruppo editoriale

Capo redattore: Ronnie Tucker(aka: RonnieTucker)[email protected]

Webmaster: Rob Kerfia(aka: admin / [email protected]

Modifiche e CorrezioniMike Kennedy, Lucas Westermann,Gord Campbell, Robert Orsino, JoshHertel, Bert Jerred

Si ringrazia la Canonical e i tantigruppi di traduzione nel mondo.

Ecco a voi un altro 'Specialemonotematico'

Come richiesto dai nostri lettori, stiamo assemblando in edizionidedicate alcuni degli articoli pubblicati in serie.

Quella che avete davanti è la ristampa della serie 'Programmare

in Python' parti 44-48, pubblicata nei numeri 73-78,consentendo all' impareggiabile professor Gregg Waltersil nr.74 come tempo libero per buona condotta.

Vi preghiamo di tenere conto della data di pubblicazione: leversioni attuali di hardware e software potrebbero esserediverse rispetto ad allora. Controllate il vostro hardware e ilvostro software prima di provare quanto descritto nelle guide diqueste edizioni speciali. Potreste avere versioni più recenti delsoftware installato o disponibile nei repository delle vostredistribuzioni.

Buon divertimento!

Gli articoli contenuti in questa rivista sono stati rilasciati sotto la licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stessomodo 3.0. Ciò significa che potete adattare, copiare, distribuire e inviare gli articoli ma solo sotto le seguenti condizioni: dovete attribuire il lavoroall'autore originale in una qualche forma (almeno un nome, un'email o un indirizzo Internet) e a questa rivista col suo nome ("Full Circle Magazine") econ suo indirizzo Internet www.fullcirclemagazine.org (ma non attribuire il/gli articolo/i in alcun modo che lasci intendere che gli autori e la rivista

abbiano esplicitamente autorizzato voi o l'uso che fate dell'opera). Se alterate, trasformate o create un'opera su questo lavoro dovete distribuire il lavoro risultante con la stessalicenza o una simile o compatibile.Full Circle magazine è completamente indipendente da Canonical, lo sponsor dei progetti di Ubuntu, e i punti di vista e le opinioni espresse nella rivista non sono in alcun

modo da attribuire o approvati dalla Canonical.

Full CircleLA RIVISTA INDIPENDENTE PER LA COMUNITÀ LINUX UBUNTU

Page 3: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY08_it.pdf · 8 $( $ (?,?,?,?,?,?)

full circle magazine n.73 8 indice ^

HHOOWW--TTOOScritto da Greg Walters PPrrooggrraammmmaarree II nn PPyytthhoonn :: PPaarrttee 4444

Q uesto mese faremo una piccoladeviazione dal nostro programma

TVRage per rispondere parzialmentealle domande di un nostro lettore. Miera stato chiesto di parlare di QTCreator e di come usarlo per disegnareinterfacce utente per i programmiPython.

Sfortunatamente, da quello cheposso dire, il supporto per QT Creatornon è ancora pronto per Python. È inlavorazione, ma non è ancora del tutto'pronto per il debutto'.

Così, nel tentativo di prepararci perquesto futuro articolo, lavoreremo conQT4 Designer. Si dovranno installare(se non lo sono già) python-qt4, qt4-dev-tools, python-qt4-dev, pyqt4-dev-tools e libqt4-dev.

Una volta fatto, sotto adApplicazioni | Sviluppo potrete trovareQT4 Designer. Proseguite e avviatelo.Si dovrebbe presentare con qualcosadi simile al seguente:

Assicuratevi che 'Main Window' siaselezionata e premete sul pulsante'Create'. Ora avrete una scheda biancanella quale trascinare e rilasciare i

controlli.

La prima cosa che vogliamo fare èridimensionare la finestra principale, acirca 500x300. Potete dire quanto ègrande dando uno sguardo a PropertyEditor sotto le proprietà geometrichenella parte destra della finestra diDesigner. Quindi, scorrere verso ilbasso la casella di riepilogo delleproprietà dell'editor fino a vedere'windowTitle'. Cambiate il testo da'MainWindow' a 'Python Test1 '.Dovreste veder cambiare la finestradel titolo della propria finestra diDesigner in 'Python Test1 - untitled*'.

Ora è un buon momento per salvare ilprogetto. Nominatelo 'pytest1 .ui'.Successivamente, metteremo unpulsante nella nostra form. Sarà unpulsante di uscita per terminare ilprogramma di prova. Sul lato sinistrodella finestra di Designer ci sono tutti icontrolli disponibili. Trovare la sezione'Buttons' e trascinare nella scheda ilcontrollo 'Push Button'. A differenzadelle interfacce grafiche usate inpassato, usando QT4 Designer non sidevono creare griglie per contenere icontrolli. Spostate il pulsante vicino alcentro inferiore della scheda. Se siguardano le proprietà dell'editor sotto

a geometrie, si vedrà qualcosa di similea questo:

[(200,260), 97x27]

Quelle tra parentesi sono leposizioni X e Y dell'oggetto (ilpulsante, in questo caso) sulla scheda,seguite dalla sua altezza e larghezza.Ho spostato il mio a 200,260.

Proprio sopra a esso c'è la proprietàdi objectName, che, per impostazionepredefinita, è impostata a'pushButton'. Cambiarla in 'btnExit'.Scorrere ora la lista di Property Editorfino alla sezione 'QAbstractButton' eimpostare la proprietà di 'text' in 'Exit'.È possibile vedere sulla propria schedache il testo sul pulsante è cambiato.

Ora, aggiungere un altro pulsante eposizionarlo a 200,200. Cambiare la suaproprietà objectName in 'btnClickMe' eimpostarne il testo a 'Premimi!'.

Aggiungete poi una etichetta. Latroverete nella casella degli strumentisulla sinistra sotto a 'DisplayWidgets'.Posizionatela vicino al centro dellascheda (ho posizionato la mia a21 0,1 30) e impostate la sua proprietà

Page 4: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY08_it.pdf · 8 $( $ (?,?,?,?,?,?)

full circle magazine n.73 9 indice ^

HOWTO - PROGRAMMARE PYTHON Parte 44objectName a 'lblDisplay'. Vogliamorenderla più grande di quanto sia perimpostazione predefinita, quindiimpostare le sue dimensioni all'incircaintorno a 221 x20. Nell'editor delleproprietà, scorrete giù nella sezione'Qlabel' e impostare l'allineamentoorizzontale a 'AlignHCenter'. Cambiateil testo in spazio vuoto. Verràimpostato nel codice quando ilpulsante btnClickMen sarà premuto.Ora salvate nuovamente il progetto.

SLOT E SEGNALI

La prossima sezione potrebbeessere un po' più difficile da capire,specialmente se ci avete seguito permolto tempo e avete affrontato iprecedenti disegnatori di interfaccegrafiche. Negli altri disegnatoriusavamo eventi che venivano attivatialla pressione di un oggetto, a esempioun pulsante. In QT4 Designer, gli eventisono chiamati Segnali e la funzione cheviene chiamata da questi Segnali èchiamata Slot. Quindi, per il pulsanteExit verrà usato il segnale Clic perchiamare lo slot che chiude la finestraprincipale. Siete totalmente confusiora? È passato del tempo dalla miaprima volta con QT, ma inizia ad averesenso dopo un po'.

Fortunatamente, c'è un modo

molto facile per usare gli slot e isegnali predefiniti. Premendo il tastoF4 della tastiera si entrerà nellamodalità Edit Signal e Slots Mode (peruscirne, premere F3). Ora, premete conil tasto sinistro sul pulsante Exit,mantenetelo e trascinateloleggermente in alto a destra nellascheda principale, quindi rilasciatelo. Sivedrà apparire una finestra di dialogoche somiglia a quanto mostrato sopra.

Ciò fornirà un modo facile percollegare alla scheda il segnale su cui siè fatto clic. Selezionate la primaopzione a sinistra, che dovrebbeessere 'clicked()'. Questo abiliterà illato destro della finestra. Selezionaredalla lista l'opzione 'close()' e farequindi clic su 'OK'. Si vedrà qualcosa disomigliante a questo:

Il segnale di clic (evento) è legatoalla funzione Close della finestraprincipale.

Il segnale di clic di btnClickMe verràfatto nel codice.

Salvate il file ancora una volta.Uscite da QT4 Designer e aprite unterminale. Cambiate il percorso inquello in cui è stato salvato il file. Oragenereremo un file python usando lostrumento a linea di comando pyuic4.Questo leggerà il file .ui. Il comandosarà:

pyuic4 -x pytest1.ui -opytest1.py

I l parametro -x dice di includere ilcodice per avviare e mostrarel'interfaccia utente. Il parametro -odice di creare il file piuttosto chevisualizzarlo solo sullo schermo. Unacosa importante da notare qui.ASSICURATEVI di aver fatto tutto inQT4 Designer prima di creare il filepython. Diversamente, saràcompletamente riscritto e dovretericominciare da zero.

Una volta fatto, otterrete il filepython. Apritelo con il vostro editorpreferito.

Il file stesso è lungo soltanto 65righe circa, commenti inclusi. Ci sonosolo pochi controlli quindi non sarebbepotuto essere molto lungo. Nonmostrerò una grande quantità dicodice. Dovreste essere capaci diseguire la maggior parte del codice,oramai. Comunque verrà creato eaggiunto codice al fine di inserire lafunzionalità per impostare il testodell'etichetta.

La prima cosa da fare è copiare lariga di segnale e slot e modificarla. Daqualche parte intorno alla riga 47 cidovrebbe essere il seguente codice:

QtCore.QObject.connect(self.btnExit,QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.close)

Page 5: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY08_it.pdf · 8 $( $ (?,?,?,?,?,?)

full circle magazine n.73 1 0 indice ^

HOWTO - PROGRAMMARE PYTHON Parte 44

Copiatelo e, giusto sotto a esso,incollatelo. Poi modificatelo in:

QtCore.QObject.connect(self.btnClickMe,QtCore.SIGNAL(_fromUtf8("clicked()")), self.SetLabelText)

Ciò creerà quindi la connessionesegnale/slot alla funzione cheimposterà il testo dell'etichetta. Sottoalla funzione retranslateUi, aggiungereil seguente codice:

def SetLabelText(self):

self.lblDisplay.setText(_fromUtf8("That Tickles!!!"))

Ho ottenuto le informazionidell'etichetta setText dalla linea diinizializzazione nella funzione setupUi.

Eseguite ora il codice. Ogni cosadovrebbe funzionare come ci siaspetta.

Sebbene questo è un esempioMOLTO semplice, sono sicuro che siete

abbastanza esperti per giocare conQT4 Designer e farvi un idea dellapotenza dello strumento.

Il prossimo mese faremo ritorno daquesta nostra deviazione iniziando alavorare sull'interfaccia utente per ilprogramma TVRage.

Come sempre, il codice può esserereperito su pastbin pressohttp://pastebin.com/98fSasdb per ilcodice .ui e pressohttp://pastebin.com/yC30B885 per ilcodice python.

Arrivederci alla prossima volta.

Greg Walters è il proprietario dellaRainyDay Solutions, LLC, una società diconsulenza in Aurora, Colorado eprogramma dal 1 972. Ama cucinare, fareescursioni, ascoltare musica e passare iltempo con la sua famiglia. Il suo sitoweb è www.thedesignatedgeek.net.

LA MIA STORIA RAPIDAdi Anthony Venable

Q uesta storia comincia agli inizi del 201 0. Ero al verde almomento così stavo tentando di trovare un sistema operativo

gratis. Mi serviva qualcosa che potevo avviare sul mio PC di casa.Avevo cercato su Internet, ma non avevo trovato nulla di utile permolto tempo. Ma un giorno ero da Barnes and Noble e vidi unarivista su Linux (benché avessi sentito di Linux prima, non avevomai pensato che fosse qualcosa che sarei stato capace di usare).Quando avevo chiesto a persone che sapevo essere deiprofessionisti del computer, mi era stato detto che era per espertie difficile da usare. Non avevo mai sentito cose positive su esso.Sono così stupito di non essermici imbattuto prima.

Quando ho letto la rivista, mi sono esposto a Ubuntu 9.1 0 -Karmic Koala. Suonava così bene, come se fosse esattamentequello che stavo cercando. Come risultato, ero molto emozionatoe lo portai a casa e, con mia sorpresa, fu così facile installarlo sulmio PC che decisi di usarlo insieme a Window XP come sistemadual boot. Tutto ciò che feci fu inserire il CD nel lettore e leistruzioni erano passo-passo che avreste dovuto essere veramentelenti per non capire come impostare ogni cosa.

Da allora sono stato molto soddisfatto di Ubuntu in generale esono stato in grado di controllare le ultime versioni quali la 1 0.04(Maverick Meerkat) e la 1 0.1 0 Lucid Lynx. Sono impaziente per la1 1 .04 Natty Narwhal per come integra il multi-touch e altro ancorarispetto alla 1 0.04.

Questa esperienza dimostra ancora una volta come riesco atrovare le cose più fighe per caso.

Page 6: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY08_it.pdf · 8 $( $ (?,?,?,?,?,?)

full circle magazine #75 8 indice ^

HHOOWW--TTOOScritto da Greg Walters PPrrooggrraammmmaarree iinn PPyytthhoonn -- PPaarrttee 4455

Questa volta andremoa rivedere ilnostroprogrammadidatabase

creatonegli articoli precedenti (parti41, 42e43).Nei prossimi articoli,quindi, utilizzeremo la libreriaQTpercreare l'interfacciautente.

Perprimacosadiamoun'occhiata acomefunziona l'applicazionegiàesistente. Eccounavisioned'insiemegenerale:• Creauna connessioneal databasee,senecessario, crea il database stesso.• Creauncursoreper il database.• Crea la tabella senonesistegià.•Assegna la cartella/e videoaunavariabile.• Cercaall'internodella cartella/e ivideo.•Ottiene il nomedel file, il nomedellaserie, il numerodella stagionee ilnumerodell'episodio.• Controlla se l'episodioesistegiàneldatabase.• Senonègiàpresente, lo aggiungealdatabase convalore "-1" così come l'IDTvRage• Successivamente cercaall'internodeldatabase l'IDe lo status, senecessario,e aggiorna il database.

Ridisegneremo il databaseper far

sì che includaun'altra tabella epermodificare la tabelladati già esistente.Perprimacosa creiamo lanostranuova tabella chiamandolaSeries. Essaconterrà tutte le informazioni riguardole serieTVcheabbiamonel nostrosistema. Lanuova tabella includerà iseguenti campi:• Pkid• SeriesName•TvRageSeries ID•Numberof seasons• StartDate•EndedFlag•Countryoforigin• Statusof the series (ended,current, etc)• Classification (scripted, "reality",etc)• Summaryof the seriesplot•Genres•Runtime inminutes•Network•Dayof theweek it airs• Timeofday it airs• Path to the series

Possiamousare laesistente routineMakeDataBaseper creare lanostranuova tabella. Primadel codiceesistente, aggiungete il codicemostrato sopraadestra.

L'istruzioneSQL (“sql =…”)dovrebbeessere tutta suuna solalinea,mavienequi spezzataperfacilitare la compresione. Lasciamo lamodificadella tabellagiàesistenteperdopo.

Oradobbiamomodificare lanostraroutineWalkThePathper far sì che ilnomedella seriee il percorsovenganosalvati all'internodella tabelladellaserie.

Sostituiamo la linea con il codice

sqlquery = 'SELECT count(pkid)as rowcount from TvShows whereFilename = "%s";' % fl

con

sqlquery = 'SELECT count(pkid)as rowcount from series whereseriesName = "%s";' % showname

Questo codice, (giustoperrinfrescare la vostramemoria)controllerà seabbiamogiàmemorizzato le serienella tabella.Oracerchiamo ledue righe con il codice:

sql = 'INSERT INTO TvShows(Series,RootPath,Filename,Season,Episode,tvrageid) VALUES(?,?,?,?,?,?)'

cursor.execute(sql,(showname,root,fl,season,episode,-1))

sql = 'CREATE TABLE IF NOT EXISTS Series (pkid INTEGER PRIMARY KEY AUTOINCREMENT,SeriesName TEXT,SeriesID TEXT,Seasons TEXT,StartDate TEXT,Ended TEXT,OriginCountry TEXT,Status TEXT,Classification TEXT,Summary TEXT,Genres TEXT,Runtime TEXT,Network TEXT,AirDay TEXT,AirTime TEXT,Path TEXT);'

cursor.execute(sql)

Page 7: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY08_it.pdf · 8 $( $ (?,?,?,?,?,?)

full circle magazine #75 9 indice ^

HOWTO - PYTHON Parte 45

e sostituiamole con

sql = 'INSERT INTO Series(SeriesName,Path,SeriesID)VALUES (?,?,?)'

cursor.execute(sql,(showname,root,-1))

Ciò ci permetteràdi inserire ilnomedelle serie (showname), ilpercorsodella serieeun "-1" come IDTvRage.Useremo il contrassegno "-1"per indicare che si devono reperire leinformazioni sulla seriedaTvRage.

Adesso rivediamo la routineWalkTheDatabaseperestrarrequelleserie che sonoprivedi informazioni(SeriesID= -1) e aggiornare i campi.

Cambiare la stringadi queryda:

sqlstring = "SELECT DISTINCTseries FROM TvShows WHEREtvrageid = -1"

a

sqlstring = "SELECTpkid,SeriesName FROM SeriesWHERE SeriesID = -1"

Questo creeràun risultato checipermetteràdi inoltrareuna richiestaperogni serie. Adesso cerchiamoesostituiamo le seguenti due linee

seriesname = x[0]

searchname =string.capwords(x[0]," ")

con

pkid = x[0]

seriesname = x[1]

searchname =string.capwords(x[1]," ")

Useremo il pkIDper l'istruzionediaggiornamente. Successivamentedobbiamomodificare la chiamataallaroutineUpdateDdatabaseper fare inmodoche includapkID.Modifichiamola riga

UpdateDatabase(seriesname,id)

in

UpdateDatabase(seriesname,id,pkid)

eanche la linea

GetShowStatus(seriesname,id)

in

GetShowData(seriesname,id,pkid)

Chesaràunanuova routine creatasulmomento.

Adesso, cambiamo ladefinizione

della routineUpdateDatabaseda

defUpdateDatabase(seriesname,id):

in

defUpdateDatabase(seriesname,id,pkid):

Oraènecessariomodificare lastringadi queryda

sqlstring = 'UPDATE tvshows SETtvrageid = ' + id + ' WHEREseries = "' + seriesname + '"'

in

sqlstring = 'UPDATE Series SETSeriesID = ' + id + ' WHEREpkID = %d' % pkid

Oraènecessario creare la routine

GetShowData (in alto).

Prenderemo le informazioni daTvRagee le inseriremonella tabellaSeries.

Ricordiamoche stiamocreandouna istanzadella routineTvRageeundizionario che contiene tutte leinformazioni dellenostre serie.

Successivamente creeremodellavariabili permemorizzare i dati peraggiornare la tabella (sopra)

Danondimenticare cheGenresèunsottoelementoecontieneuna listadi unoopiùgeneri. Fortunatamentequandoabbiamoscritto il codicedellaroutineTvRage, abbiamocreatounastringa chememorizza tutti i generi,indipendentementedal loronumero,

def GetShowData(seriesname,id,pkid):tr = TvRage()idcursor = connection.cursor()dict = tr.GetShowInfo(id)

seasons = dict['Seasons']startdate = dict['StartDate']ended = dict['Ended']origincountry = dict['Country']status = dict['Status']classification = dict['Classification']summary = dict['Summary']

Page 8: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY08_it.pdf · 8 $( $ (?,?,?,?,?,?)

full circle magazine #75 10 indice ^

HOWTO - PYTHON Parte 45per cui possiamousaresemplicemente la strigadel genere:

genres = dict['Genres']

runtime = dict['Runtime']

network = dict['Network']

airday = dict['Airday']

airtime = dict['Airtime']

Infine creiamo la stringadi querypereffettuare l'aggiornamento (inbasso).Nuovamentedovrebbetrovarsi tutto inuna singola lineadicodice,ma l'hodivisoper renderlopiùsemplice.

La sezione {number}, ricordiamo, èsimile allaopzionedi formattazione“%s”.Questo creerà lanostra stringadi query sostituendo {number} con idati chedesideriamo.Visto cheabbiamogiàdefinitoquesti campi

cometesto, vogliamousare ledoppievirgoletteper racchiudere i dati cheaggiungeremo.

Infine, li scriviamoneldatabase(sotto).

Equestoè tuttoperquesta volta,laprossimavolta continueremoconquantoaccennatoall'iniziodell'articolo. Finoadallora, divertitevi.

GregWaltersè il proprietariodellaRainyDaySolutions, LLC, una societàdiconsulenza inAurora, Coloradoeprogrammadal 1972.Amacucinare, fareescursioni, ascoltaremusicaepassare iltempocon la sua famiglia. Il suo sitowebèwww.thedesignatedgeek.net.

sqlstring = 'Update Series SET Seasons = "{0}", StartDate = "{1}", Ended = "{2}",OriginCountry = "{3}", Status = "{4}", Classification = "{5}",Summary = "{6}", Genres = "{7}", Runtime = "{8}", Network = "{9}",AirDay = "{10}",AirTime = "{11}"WHERE pkID ={12}'.format(seasons,startdate,ended,origincountry,status,classification,summary,genres,runtime,network,airday,airtime,pkid)

try:idcursor.execute(sqlstring)

except:print "Error Adding Series Information"

Il Podcast Ubuntu copre tutte le

ultime notizie e novità che si

presentano agli utenti di Ubuntu

Linux e ai fan del software libero in

generale. La rassegna è rivolta tanto

all'utente più fresco quanto al

programmatore più esperto. Le

nostre discussioni riguardano lo

sviluppo di Ubuntu ma non sono

eccessivamente tecniche. Siamo

abbastanza fortunati da avere

qualche gradito ospite nello show a

passarci novità di prima mano sugli

ultimi eccitanti sviluppi a cui stanno

lavorando, in modo comprensibile a

tutti! Parliamo inoltre della comunità

Ubuntu e di cosa le interessa.

Lo show è offerto dai membri della

comunità Ubuntu Linux del Regno

Unito. Ed essendo coperta dal

Codice di condotta di Ubuntu è

adatta a tutti.

Lo show è trasmesso live ogni due

settimane il martedì sera (ora

inglese) ed è disponibile per il

download il giorno seguente.

podcast.ubuntu-uk.org

Page 9: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY08_it.pdf · 8 $( $ (?,?,?,?,?,?)

full circle magazine #76 9 indice ^

HH OOWW--TTOOScritto da Greg Walters PPrroogg rraa mm mm aa rree II nn PPyytthh oonn -- PPaa rrttee 4466

Generalmente i miei articoli sonoabbastanza lunghi. Comunque, acausa di alcuni problemi medici,l'articolo di questo mese saràpiuttosto breve (nel grande schemadelle cose). Tuttavia, ci sforzeremo econtinueremo la nostra serie sulprogramma di gestione dei media.

Una delle cose che il programmadovrà fare per noi è di farci sapere seci siamo persi qualche episodio diqualsiasi serie inserita nel database.Ecco lo scenario. Abbiamo una serie,che chiameremo 'Lo spettacolo deglianni 80', lunga tre stagioni. Nellaseconda stagione c'erano 1 5 episodi.Tuttavia, ne abbiamo solo 1 3 nellanostra libreria. Come scopriamo,programmaticamente, quali episodisono mancanti?

Il modo più semplice è di usare leliste e i set. Abbiamo già usato le listein alcuni articoli negli ultimi quattroanni, ma i Set sono un nuovo tipo didati in questo how-to, quindi gliesamineremo per un instante.Secondo la 'documentazioneufficiale' di Python (docs.python.org),questa è la definizione di un set:

"Un setèunaraccoltanon ordinatasenzaelementiduplicati. Un uso

basilare include lemembership testing

e l'eliminazionedivociduplicate. Gli

oggettiSetsupportano inoltre le

operazionimatematichequalile

unioni, le intersezioni, ledifferenzee le

differenzesimmetriche".

Continuerò a usare l'esempiodalla pagina di documentazione perillustrare il processo.

>>> Basket =['apple','orange','apple','pear','orange','banana']

>>> fruit = set(basket)

>>> fruit

set(['orange','pear','apple','banana'])

Notate che nell'elenco originaleche è stato assegnato alla variabilebasket, apple e orange sono stateinserite due volte, ma quando laassegniamo a un set, i duplicativengono scartati. Ora, per usare il setche abbiamo appena creato,dobbiamo verificare se una voce difruit (o qualcos'altro) è nel set.Possiamo usare l'operatore 'in'.

>>> 'orange' in fruit

True

>>> 'kiwi' in fruit

False

>>>

Ciò è abbastanza semplice e,fortunatamente, state iniziando avedere dove va tutto ciò. Diciamo diavere una lista della spesa con unmucchio di frutta annotata e, mentreandiamo verso il negozio, vogliamoverificare ciò che ci manca,fondamentalmente le voci nella listadella spesa ma non quelle nel nostrocarrello. Possiamo cominciare così.

>>> shoppinglist =['orange','apple','pear','banana','kiwi','grapes']

>>> basket =['apple','kiwi','banana']

>>> sl = set(shoppinglist)

>>> b = set(basket)

>>> sl-b

set(['orange', 'pear','grapes'])

>>>

Creiamo le nostre due liste,shoppinglist per quello che ci serve ebasket per quello che abbiamo.Assegniamo ciascuna a un set equindi usiamo l'operatore di set perle differenze (il segno meno) perottenere le voci che sono nella listadella spesa ma non nel carrello.

Ora, usando la stessa logica,creeremo una routine (paginasuccessiva in basso a sinistra) che sioccuperà dei nostri episodi mancanti.Chiameremo la nostra routine'FindMissing' e gli passeremo duevariabili. La prima è un intero che èimpostato con il numero degliepisodi della stagione e la seconda èun elenco che contiene i numeri degliepisodi che abbiamo per quellastagione.

La routine, quando vieneeseguita, stampa [5, 8, 1 5] , che ècorretto. Ora diamo uno sguardo alcodice. La prima linea crea un setchiamato EpisodesNeeded usandoun elenco di interi creati tramite lafunzione range. Ci occorre dotare lafunzione range del valore iniziale e diquello finale. Aggiungiamo 1 alvalore maggiore di range per

Page 10: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY08_it.pdf · 8 $( $ (?,?,?,?,?,?)

full circle magazine #76 1 0 indice ^

HOWTO - PYTHON PARTE 46ottenere il giusto elenco di valori da1 a 1 5. Ricordiamoci che la funzionerange in realtà inizia da 0, quindiquando gli diamo 1 6 (expected(1 5)+1 ) l'effettiva lista che range creaè da 0 a 1 5. Diciamo alla funzionerange di partire da 1 , quindi anche sel'intervallo è da 0 a 1 5, che è di 1 6valori, vogliamo che 1 5 inizi a 1 .

Successivamente creiamo un setdall'elenco che viene passato nellaroutine, che contiene i numeri degliepisodi che abbiamo effettivamente.

Ora possiamo creare una listausando l'operatore di set per ledifferenze sui due set. Lo facciamo inmodo che possiamo ordinarlo con ilmetodo list.sort(). Potetecertamente farvi restituire l'elenco,se volete, ma in questa iterazionedella routine, vi basta stamparlo.

Bene, questo è tutto il tempo cheil mio corpo può sostenere sedutodavanti al computer, quindi vi lascioper questo mese, chiedendovi comepotremmo utilizzare ciò nel nostrogestore dei media.

Vi auguro un buon mese e civediamo presto.

Greg Walters è il proprietario dellaRainyDay Solutions, LLC, una società diconsulenza in Aurora, Colorado eprogramma dal 1 972. Ama cucinare, fareescursioni, ascoltare musica e passare iltempo con la sua famiglia. Il suo sito webè www.thedesignatedgeek.net.

def FindMissing(expected,have):#===================================# ‘expected’ is the number of episodes we should have# ‘have’ is a list of episodes that we do have# returns a sorted list of missing episode numbers#===================================EpisodesNeeded = set(range(1,expected+1))EpisodesHave = set(have)StillNeed = list(EpisodesNeeded - EpisodesHave)StillNeed.sort()print StillNeed

FindMissing(15,[1,2,3,4,6,7,9,10,11,12,13,14])

EDIZIONI SPECIALI DI PYTHON:

http://fullcirclemagazine.org/issue-py01 / http://fullcirclemagazine.org/issue-py02/

http://fullcirclemagazine.org/python-special-edition-issue-three/

http://fullcirclemagazine.org/python-special-edition-volume-four/

http://fullcirclemagazine.org/python-special-edition-volume-five/

http://fullcirclemagazine.org/python-special-edition-volume-six/

Page 11: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY08_it.pdf · 8 $( $ (?,?,?,?,?,?)

full circle magazine #77 7 indice ^

HH OOWW--TTOOScritto da Greg Walters PPrroogg rraa mm mm aa rree II nn PPyytthh oonn -- PPaa rrttee 4477

L o scorso mese abbiamo discussodell'uso dei set per mostrarci i

numeri degli episodi mancanti. Ètempo di mettere in pratica il rozzocodice presentato.

Modificheremo una routine e nescriveremo una nuova. Faremoprima la modifica. Nel file di lavorousato negli ultimi mesi, troviamo laroutine WalkThePath(filepath). Laquarta e quinta riga dovrebberoessere:

efile =open('errors.log',"w")

for root, dirs, files inos.walk(filepath,topdown=True):

Inseriremo il seguente codice fraqueste due righe:

lastroot = ''

elist = []

currentshow = ''

currentseason = ''

Oramai dovreste riconoscere checiò che abbiamo fatto qui èinizializzare le variabili. Ci sono trevariabili stringa e una lista. Useremo

la lista per tenerci i numeri degliepisodi (da qui il nome elist).

Diamo una rapida occhiata erinfreschiamoci la memoria (sopra)riguardo a ciò che stiamo facendocon la routine esistente, prima dimodificarla ulteriormente.

Le prime due righe impostano lecose per la routine walk-the-pathnella quale iniziamo in una datacartella del file system e visitiamoricorsivamente ogni sotto-cartella econtrolliamo i file che hannoestensione .avi, .mkv, .mp4 o .m4v.Se ce ne è qualcuno, allora loreiteriamo nell'elenco di quei nomidi file.

Nella linea in alto a destra,chiamiamo la routineGetSeasonEpisode per estrarre ilnome della serie, la stagione e ilnumero di episodio dal nome delfile. Se tutto viene analizzatocorrettamente, la variabile isokviene impostata a true e leinformazioni che stiamo cercando

vengono messe nell'elenco e poirestituite.

Qui (sotto) assegniamosemplicemente i dati restituiti daGetSeasonEpisode e li inseriamo invariabili separate con cui possiamogiocare. Ora che sappiamo dovesiamo, parliamo di dove andremo.

Vogliamo ottenere il numero diepisodio di ciascun file e inserirlonell'elenco elist. Una volta fatto contutti i file dentro alla cartellacorrente, possiamo allora ipotizzareche stiamo praticamentemantenendo il passo con i file e chel'episodio con il numero più alto è

l'ultimo disponibile. Come abbiamodetto lo scorso mese, possiamoquindi creare un set numerato da 1all'ultimo episodio e convertirel'elenco in un set ed estrarre ladifferenza. Sebbene ciò sia in teoriamagnifico, c'è un piccolo intopponel nostro essere sulla giusta strada'quando si tratta di pratica reale. Inrealtà non otteniamo un'indicazionechiara e pulita quando abbiamofinito con una particolare cartella.Quello che abbiamo, però, è laconsapevolezza che quandoabbiamo finito con ciascun file, ilcodice subito dopo "for file in [..."viene eseguito. Se sappiamo ilnome dell'ultima cartella visitata e

for root, dirs, files in os.walk(filepath,topdown=True):for file in [f for f in files if f.endswith (('.avi','mkv','mp4','m4v'))]:

# Combine path and filename to create a single variable.fn = join(root,file)OriginalFilename,ext = os.path.splitext(file)fl = fileisok,data = GetSeasonEpisode(fl)

if isok:showname = data[0]season = data[1]episode = data[2]print("Season {0} Episode {1}".format(season,episode))

Page 12: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY08_it.pdf · 8 $( $ (?,?,?,?,?,?)

full circle magazine #77 8 indice ^

HOWTO - PYTHON PARTE 47di quella attuale, possiamocomparare le due e, se sono diverse,abbiamo finito con una cartella e lanostra lista di episodi dovrebbeessere completa. A questo serve lavariabile 'lastroot'.

Metteremo la maggior parte delnostro nuovo codice proprio dopo lariga 'for file in ['. Sono solo setterighe, eccole (le righe nere sonoquelle esistenti, per vostraconvenienza).

Riga per riga del nuovo codice,ecco la logica:

Innanzitutto, controlliamo pervedere se la variabile lastroot ha lostesso valore di root (il nomedell'attuale cartella). Se così, siamonella stessa cartella, quindi nondobbiamo eseguire nessun codice.Altrimenti, assegniamo il nome dellacartella attuale alla variabile lastroot.Successivamente, controlliamo pervedere se l'elenco degli episodi (elist)ha qualche immissione (len(elist) > 0).Questo per assicurarsi che noneravamo in una cartella vuota. Seabbiamo voci nell'elenco, allorachiamiamo la routine Missing.Passiamo l'elenco episodi, il numeropiù alto dell'episodio, il numero dellastagione corrente e il nome dellastagione, quindi possiamo in seguito

stamparli. Le ultime tre righepuliscono l'elenco, il nome attualedello spettacolo e la stagione attuale,e andiamo avanti come abbiamo fattoprima.

Poi dobbiamo cambiare due righee aggiungerne una nel codice if isok:,pochi righe sotto. Di nuovo, a destra,le righe nere sono il codice esistente:

Qui siamo appena tornati indietrodalla routine GetSeasonEpisode. Seavevamo un nome di file analizzabile,vogliamo prendere il nome dellospettacolo e il numero di stagione eaggiungere l'episodio attualeall'elenco. Attenzione, convertiremoil numero dell'episodio in un numerointero prima di aggiungerlo all'elenco.

Abbiamo fatto con questaporzione di codice. Ora, quello chedobbiamo fare è di aggiungere laroutine Missing. Proprio dopo laroutine WalkThePath, aggiungeremoil codice in fondo pagina.

Anche in questo caso, è uninsieme di codice molto semplice e loabbiamo praticamente esaminato ilmese scorso, ma faremo un ripassonel caso ve lo foste perso.

Definiamo la funzione eimpostiamo quattro parametri.Passeremo l'elenco degli episodi(eplist), il numero degli episodi che ciaspettiamo (shouldhave) che è ilnumero più alto di episodionell'elenco episodi, il numero dellastagione (season) e il nome dellospettacolo (showname).

Successivamente, creiamo un setche contiene un elenco di numeriusando la funzione nativa range,iniziando con 1 e andando nel valore

for file in [f for f in files if f.endswith (('.avi','mkv','mp4','m4v'))]:# Combine path and filename to create a single variable.if lastroot != root:

lastroot = rootif len(elist) > 0:

Missing(elist,max(elist),currentseason,currentshow)elist = []currentshow = ''currentseason = ''

fn = join(root,file)

isok,data = GetSeasonEpisode(fl)if isok:

currentshow = showname = data[0]currentseason = season = data[1]episode = data[2]elist.append(int(episode))

else:

#----------------------------------def Missing(eplist,shouldhave,season,showname):

temp = set(range(1,shouldhave+1))ret = list(temp-set(eplist))if len(ret) > 0:

print('Missing Episodes for {0} Season {1} - {2}'.format(showname,season,ret))

Page 13: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY08_it.pdf · 8 $( $ (?,?,?,?,?,?)

full circle magazine #77 9 indice ^

Greg Walters è il proprietario dellaRainyDay Solutions, LLC, una societàdi consulenza in Aurora, Colorado eprogramma dal 1 972. Ama cucinare,fare escursioni, la musica e passare iltempo con la sua famiglia. I l suo sitoweb è www.thedesignatedgeek.net.

HOWTO - PYTHON PARTE 47shouldhave +1 . Chiamiamo quindi lafunzione difference, su questo set esu un set convertito dall'elencoepisodi (temp-set(eplist)), e loriconvertiamo in un elenco.Controlliamo poi per vedere se c'èqualcosa nell'elenco, quindi nonstampiamo una riga con un elencovuoto e, se c'è qualcosa, lastampiamo.

Questo è quanto. L'unica crepa inquesta logica è che facendo le cose inquesta maniera non sappiamo se cisono nuovi episodi che non abbiamo.

Ho messo le due routine supastebin per voi, se volete solo fareuna rapida sostituzione nel vostrocodice funzionante. Le potetetrovare pressohttp://pastebin.com/XHTRv2dQ.

Passate un buon mese, ci vediamopresto.

Il Podcast Ubuntu copre tutte leultime notizie e novità che sipresentano agli utenti di UbuntuLinux e ai fan del software libero ingenerale. La rassegna è rivolta tantoall'utente più fresco quanto alprogrammatore più esperto. Lenostre discussioni riguardano losviluppo di Ubuntu ma non sonoeccessivamente tecniche. Siamoabbastanza fortunati da averequalche gradito ospite nello show apassarci novità di prima mano sugliultimi eccitanti sviluppi a cui stannolavorando, in modo comprensibile atutti! Parliamo inoltre della comunitàUbuntu e di cosa le interessa.

Lo show è offerto dai membri dellacomunità Ubuntu Linux del RegnoUnito. Ed essendo coperto dalCodice di condotta di Ubuntu èadatto a tutti.

Lo show è trasmesso live ogni duesettimane il martedì sera (orainglese) ed è disponibile per ildownload il giorno seguente.

podcast.ubuntu-uk.org

PYTHON EDIZIONI SPECIALI:

http://fullcirclemagazine.org/issue-py01 / http://fullcirclemagazine.org/issue-py02/

http://fullcirclemagazine.org/python-special-edition-issue-three/

http://fullcirclemagazine.org/python-special-edition-volume-four/

http://fullcirclemagazine.org/python-special-edition-volume-five/

http://fullcirclemagazine.org/python-special-edition-volume-six/

Page 14: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY08_it.pdf · 8 $( $ (?,?,?,?,?,?)

full circle magazine #78 9 indice ^

HHOOWW--TTOOScritto da Greg Walters PPrrooggrraammmmaarree iinn PPyytthhoonn -- PPaarrttee 4488

B en tornati. È difficileimmaginare che sono passati 4

anni da quando ho iniziato questaserie. Stavo pensando di mettere daparte per un po' il progetto digestione dei media e di ritornare adalcune basi della programmazionein Python.

Questo mese, rivisiterò ilcomando print. È uno delle funzionipiù usate (almeno nella miaprogrammazione) che sembra nonottenere la descrizione che merita.Ci sono molte cose che si possonofare con esso oltre ai soliti '%s %d'.

Poiché la sintassi di print èdifferente tra Python 2.x e 3.x, glidaremo un'occhiata separatamente.Ricordatevi, comunque, che poteteusare la sintassi del 3.x in Python2.7. La maggior parte di ciò chepresento questo mese sarà fattodalla shell interattiva. Poteteseguire passo passo. Il codice saràcome il seguente:

>>> a = "Hello Python"

>>> print("String a is %s"%a)

e l'output sarà in grassetto,come questo:

String a is Hello Python

PYTHON 2.X

Certamente vi ricordate dellasemplice sintassi della funzioneprint nella 2.x che utilizza lasostituzione di variabile %s o %dper le stringhe semplici o i decimali.Ma sono disponibili molte altreopzioni. Per esempio, se doveteformattare un numero con gli zeriiniziali, lo dovete fare in questomodo:

>>> print("Your value is%03d" % 4)Your value is 004

In questo caso, usiamo ilcomando di formattazione '%03d'per dire "mostra il numero con unaestensione di tre caratteri e, senecessario, con gli zero davanti".

>>> pi = 3.14159>>> print('PI = %5.3f.' % pi)PI = 3.142.

Qui ho usato l'opzione performattare il tipo float. Con '%5.3f'

gli si dice di produrre un output conun totale di cinque caratteri e treposti decimali. Notate che il puntodel decimale si prende uno dei postidel totale dei caratteri.

Un'altra cosa che potreste noncapire è che potete usare le chiavi diun dizionario come parte delcomando di formattazione.

>>> info ={"FName":"Fred","LName":"Farkel","City":"Denver"}

>>> print('Greetings%(FName)s %(LName)s of%(City)s!' % info)

Greetings Fred Farkel ofDenver!

La tabella seguente mostra levarie chiavi di sostituzione possibilie il loro significato.

Page 15: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY08_it.pdf · 8 $( $ (?,?,?,?,?,?)

full circle magazine #78 1 0 indice ^

HOWTO - PYTHON PARTE 48

PYTHON 3.X

Con Python 3.x, abbiamo moltealtre opzioni quando si tratta dellafunzione print (ricordatevi chepotete usarle con Python 2.7).

Per rinfrescarvi la memoria, eccoun semplice esempio della funzioneprint con la 3.x.

>>> print('{0}{1}'.format("Hello","Python"))Hello Python

>>> print("Python is {0}cool!".format("WAY"))Python is WAY cool!

I campi di sostituzione sonoracchiusi nelle parentesi graffe "{""}". Ogni cosa al di fuori di questeviene considerata un'espressioneletterale e sarà stampata come tale.Nel primo esempio, abbiamonumerato i campi di sostituzione 0 e1 . Questo dice a Python di prendereil primo valore (0) e metterlo nelcampo {0} e così via. Comunque, nondovete affatto usare tutti i numeri.Usando questa opzione si causa ilposizionamento del primo valorenel primo insieme di parentesi e cosìvia.

>>> print("This version of {}is

{}".format("Python","3.3.2"))This version of Python is3.2.2

Come dicono nelle pubblicità inTV, "MA ASPETTATE... C'ÈDELL'ALTRO". Se vogliamo farealcune formattazioni in linea,abbiamo le seguenti opzioni.

:<x Left align with a widthof x:>x Right align with a widthof x:^x Center align with a widthof x

Ecco un esempio:

>>>print("|{:<20}|".format("Left"))|Left |>>>print("|{:>20}|".format("Righ"))| Right|>>>print("|{:^20}|".format("Center"))| Center |

Potete anche specificare uncarattere di riempimento insieme algiustificato/ampiezza.

>>>print("{:*>10}".format(321.40))*****321.4

Se dovete formattare un output

di data/orario, potete fare qualcosadi simile a questo:

>>> d =datetime.datetime(2013,10,9,10,45,1)

>>>print("{:%m/%d/%y}".format(d))10/09/13

>>>print("{:%H:%M:%S}".format(d))10:45:01

Stampare il separatore dimigliaia usando la virgola (oqualsiasi altro carattere) è facile.

>>> print("This is a bignumber{:,}".format(7219219281))This is a big number7,219,219,281

Bene, questo dovrebbe darviabbastanza cibo per la mente perquesto mese. Ci vedremo all'iniziodel quinto anno.

Greg Walters è il proprietario dellaRainyDay Solutions, LLC, una societàdi consulenza in Aurora, Colorado eprogramma dal 1 972. Ama cucinare,fare escursioni, la musica e passare iltempo con la sua famiglia. I l suo sitoweb è www.thedesignatedgeek.net.

I l Podcast Ubuntu copre tutte leultime notizie e novità che sipresentano agl i utenti di UbuntuLinux e ai fan del software l iberoin generale. La rassegna èrivolta tanto al l 'utente piùfresco quanto al programmatorepiù esperto. Le nostrediscussioni riguardano losvi luppo di Ubuntu ma non sonoeccessivamente tecniche.Siamo abbastanza fortunati daavere qualche gradito ospitenel lo show a passarci novità diprima mano sugl i u ltimieccitanti svi luppi a cui stannolavorando, in modocomprensibi le a tutti ! Parl iamoinoltre del la comunità Ubuntu edi cosa le interessa.

Lo show è offerto dai membridel la comunità Ubuntu Linux delRegno Unito. Ed essendocoperta dal Codice di condottadi Ubuntu è adatta a tutti .

Lo show è trasmesso l ive ognidue settimane i l martedì sera(ora inglese) ed è disponibi leper i l download i l g iornoseguente.

podcast.ubuntu-uk.org