python per ragazzi - verona-trento per ragazzi_appunti... · chi dovrebbe leggere questo libro...
TRANSCRIPT
PYTHONPERRAGAZZI
UN’INTRODUZIONEGIOCOSAALLAPROGRAMMAZIONE
JASONR.BRIGGS
INDICEINBREVEL’autore,l’illustratore,irevisoritecniciRingraziamentiIntroduzione
PARTEI:IMPARAREAPROGRAMMARE1:Nontuttiiserpentistrisciano2:Calcolievariabili3:Stringhe,liste,tupleemappe4:Disegnareconletartarughe5:PorredomandeconIfeElse6:Girareintondo7:Riciclareilcodiceconfunzioniemoduli8:Comesiusanoclassieoggetti9:LefunzioniinternediPython10:ModuliutilidiPython11:Ancoragraficadellatartaruga12:Graficamigliorecontkinter
PARTEII:BOUNCE!13:Iniziamoilprimogioco:Bounce!14:Completiamoilprimogioco:Bounce!
PARTEIII:L’AVVENTUROSAFUGADIMR.STICKMAN15:CrearelagraficaperilgiocodiMr.StickMan16:SviluppareilgiocodiMr.StickMan17:CreareMr.StickMan18:CompletareilgiocodiMr.StickMan
Postfazione:Daquidovesiva?Appendice:LeparolechiavediPythonGlossario
INTRODUZIONE
Perchéimparareaprogrammare?Laprogrammazionefavoriscelacreatività,ilragionamentoela
capacitàdirisolvereproblemi.Chiprogrammahalapossibilitàdicrearequalcosadalnulla,diusarelalogicapertrasformareicostruttidellaprogrammazioneinunaformacheuncomputerpuòeseguiree,quandolecosenonvannopropriocomeavrebberodovuto,diusarelacapacitàdirisolvereproblemiperstabilirechecosasiaandatostorto.
Programmareèun’attivitàdivertente,avolteimpegnativa(eognitantoancheunpo’frustrante)elecapacitàchesiapprendonoprogrammandopossonoessereutilisiaascuolasianellavoro…anchesequelchefatenonhanullaachevedereconicomputer.
Infine,senonaltro,laprogrammazioneèunmodoeccellenteperpassareunpomeriggioquandofuorifabruttotempo.
PERCHÉPYTHON?Pythonèunlinguaggiodiprogrammazionefaciledaimparare,maconalcunecaratteristichedavveromoltoutiliperchièalleprimearmi.Ilcodiceèmoltofaciledaleggere,rispettoaquellodialtrilinguaggidiprogrammazione,ehaunainterfacciainterattiva(la“shell”)incuisipossonoscrivereiprogrammievederligirare.Oltreallasemplicitàdellastrutturadellinguaggioeallashellinterattivaconcuisipuòsperimentare,Pythonhaalcunealtrecaratteristichecherafforzanodimoltoilprocessodiapprendimentoepermettedicrearesemplicianimazionipercreareiproprigiochi.Unodiquestielementièilmoduloturtle,ispiratoallagraficadellatartaruga(utilizzatodallinguaggiodiprogrammazioneLogogiàneglianniSessanta)epensatoperleapplicazioniincampoeducativo.Unaltroèilmodulotkinter,un’interfacciaperTk,un“toolkit”,cioèuninsiemedistrumenti,perleinterfaccegrafiche,chemetteadisposizioneunmetodosemplicepercreareprogrammicongraficaeanimazioniunpo’piùavanzate.
COMEIMPARAREASCRIVERECODICEComesempre,quandosiprovaafarequalcosaperlaprimavolta,èmeglioiniziaredallebasi,perciòcominciateconiprimicapitolienonfateviprenderedallatentazionedisaltarefinoaicapitolipiùavanzati.Nessunoèingradodisuonareunasinfonialaprimavoltacheprendeinmanounostrumentomusicale.Gliaspirantipilotinonfannovolareunaereoprimadiavercapitoicontrollifondamentalieiginnasti(disolito)nonsonocapacidifareunsaltomortalealprimotentativo.Seandateavantitropporapidamente,nonsolononviresterannointestaleideefondamentali,maicontenutideicapitolisuccessivivisembrerannopiùcomplicatidiquelchesonoinrealtà.
Nelprocedere,provatetuttigliesempi:cosìpotretevederecomefunzionano.Allafinedellamaggiorpartedeicapitolicisonoanchedeirompicapodiprogrammazionechepotetecercaredirisolvere:viaiuterannoamigliorarelevostreabilitàdiprogrammazione.Ricordate:quantomeglioassimileretelebasi,tantopiùfacilevirisulteràcapireideepiùcomplicateinseguito.
Quandoincontratequalcosadifrustranteoditroppoimpegnativo,eccoalcunecosecheiotrovoutili:
1.
2.
Suddivideteunproblemainpartipiùpiccole.Cercatedicapirechecosafaunpiccoloframmentodicodice,oppureragionatesolosuunapiccolapartediun’ideadifficile(concentratevisuunpiccoloframmentodicodiceinvecedicercaredicapireiltuttoinunavoltasola).Sequestoancoranonvièd’aiuto,avoltelacosamiglioreèsemplicementenonpensarciperunpo’.Dormitecisopraeriprendeteilproblemailgiornodopo.Èunbuonmodoperrisolveremoltiproblemiepuòessereparticolarmenteutileperlaprogrammazione.
CHIDOVREBBELEGGEREQUESTOLIBROQuestolibroèperchiunquesiainteressatoallaprogrammazione,bambinooadultocheaquestocamposiavviciniperlaprimavolta.Sevoleteimparareascrivereilvostrosoftwareanzichéusaresolamenteiprogrammiscrittidaaltri,questolibroèunottimopuntodipartenza.
Neicapitoliseguenti,trovereteleinformazioniperinstallarePython,eseguirelashellesvolgerequalchecalcolo,stampareiltestocheapparesulloschermo,crearelisteesvolgerealcunesemplicioperazionidicontrollodelflussoutilizzandoglienunciatiifeiciclifor(escopriretechecosasonoglienunciatiifeiciclifor!).Vedretecomeriutilizzareilcodiceconlefunzioni,glielementifondamentalidiclassieoggettieladescrizionedialcunefunzioniealcunimoduli,fraimoltichefannopartediPython.
Troveretecapitolisullagraficadellatartaruga,alivellopiùsempliceepiùavanzato,eanchesull’usodelmodulotkinterperdisegnaresulloschermo.Allafinedimolticapitolivisonorompicapodiprogrammazionedivariacomplessità,cheviaiuterannoaconsolidareleconoscenzeappenaacquisite,conlapossibilitàdiscriverevoistessipiccoliprogrammi.
Unavoltaacquisitalaconoscenzadeifondamentidellaprogrammazione,impareretecomescrivereivostrigiochi.Svilupperemoduegiochigraficiescopriremoilrilevamentodellecollisioni,glieventievarietecnichedianimazione.
LamaggiorpartedegliesempinellibrousalashellIDLE(IntegratedDeveLopmentEnvironment,ambienteintegratodisviluppo)diPython.IDLEevidenzialastrutturasintattica,offrefunzionidicopiaeincolla(analogheaquellecheuseresteinaltreapplicazioni)eunafinestradieditorincuipotetesalvareilvostrocodiceperpoterlousareancorainseguito,ilchesignificacheIDLEfunzionasiacomeunambienteinterattivoperlasperimentazioneeancheunpo’comeuneditorditesto.Gliesempifunzionerannoaltrettantobeneconlaconsolestandardeunnormaleeditorditesto,mal’evidenziazionedellasintassieunambienteunpo’piùamichevolecomequellodiIDLEpossonoesserediaiutopercapiremeglio,perciònelprimocapitolovedremocomeimpostarlo.
CHECOSAC’ÈINQUESTOLIBROEccounabrevepanoramicadiquellochetrovereteinciascuncapitolo.
IlCapitolo1èun’introduzioneallaprogrammazione,conleistruzioniperinstallarePython.
IlCapitolo2introduceicalcolifondamentalielevariabili,eilCapitolo3descrivealcunideitipifondamentalidiPython,comelestringhe,lelisteeleennuple.
ConilCapitolo4arrivailprimoassaggiodelmoduloturtle.Passeremodaglielementibasedellaprogrammazioneacomefarmuovereunatartaruga(sottoformadiunafreccia)ingiroperloschermo.
IlCapitolo5trattadellevariazionidellecondizioniedeglienunciatiif(condizionali);ilCapitolo6procedeconicicliforewhile.
NelCapitolo7inizieremoausareecrearefunzioni,poinelCapitolo8parleremodiclassieoggetti.Esamineremoleideebaseabbastanzaafondoperpoterpoiutilizzarequalcunadelletecnichediprogrammazionenecessarie,neicapitolipiùavanti,perlosviluppodigiochi.Aquestopuntoilmaterialecominciaadiventareunpo’piùcomplicato.
IlCapitolo9trattalamaggiorpartedellefunzioniinterneaPythoneilCapitolo10continuaaffrontandoalcunimoduli(fondamentalmente,blocchidifunzionalitàutili),installatiperimpostazionepredefinitainsiemeaPython.
IlCapitolo11ritornaalmoduloturtlepersperimentarequalcheformapiùcomplicata.IlCapitolo12passaall’usodelmodulotkinterpercrearequalcheoggettograficopiùavanzato.
NeiCapitoli13e14creeremoilnostroprimogioco,“Bounce!”,chesifondasulleconoscenzeacquisiteneicapitoliprecedenti;neiCapitoli15-18creeremounaltrogioco,“L’avventurosafugadiMr.StickMan”.Icapitolidedicatiallosviluppodeigiochisonoquelliincuilecosepossonofarsidavveroserie.Seincontrateproblemichenonriuscitearisolverealtrimenti,scaricateilcodicedalsitowebcheaccompagnaillibro(http://python-for-kids.com/)econfrontateilvostrocodiceconquestiesempi,chesicuramentefunzionano.
NellaPostfazione,concludiamodandounosguardoaPyGameeadalcunialtrilinguaggidiprogrammazionemoltodiffusi.
Infine,nell’Appendice,potretetrovareleparolechiavediPythontrattateindettaglioe,nelGlossario,trovereteledefinizionideiterminidellaprogrammazioneutilizzatiintuttoillibro.
ILSITOWEBDIACCOMPAGNAMENTOSevitrovatenellecondizionidiaverbisognodiaiutomentreleggete,provateaconsultareilsitodiaccompagnamento,http://python-for-kids.com/(ininglese),dovepotretetrovaretuttigliesempidellibroealtrirompicapodiprogrammazione.Trovereteanchelesoluzionidituttiirompicaponellibro,nelcasovitroviateindifficoltàovogliatecontrollareilvostrolavoro.
BUONDIVERTIMENTO!
Ricordate,mentreprocedete,chelaprogrammazionepuòesseredivertente.Nonprendetelacomeunlavoro.Pensatelaprogrammazionecomeunmodopercrearegiochioapplicazionidivertentichepotetecondividerecongliamicioconaltri.
Imparareaprogrammareèunmeravigliosoeserciziomentaleeirisultatipossonoesseremoltogratificanti.Masoprattutto,qualsiasicosafacciate,divertitevi!
PARTEIIMPARAREAPROGRAMMARE
1NONTUTTIISERPENTISTRISCIANO
Unprogrammapercomputerèuninsiemediistruzionigrazieallequaliuncomputersvolgequalcheattività.Nonsitrattadellepartifisichediunamacchina(comeifili,imicrochip,leschede,ildiscofissoealtrecosesimili)madiquellamateriaimpalpabileenascostache“gira”suquell’hardware.Unprogrammapercomputer,chechiameròingeneresemplicementeprogramma,èl’insiemedeicomandichediconoaquell’hardware“stupido”checosafare.Softwareèuninsiemediprogrammi.
Senzaprogrammi,quasiognidispositivocheusatequotidianamentesmetterebbedifunzionareosarebbemoltomenoutilediquelcheè.Iprogrammi,inunaformaoinun’altra,controllanononsoloilvostropersonalcomputermaancheisistemiperivideogiochi,itelefonicellularieilnavigatoresatellitarenell’automobile.Ilsoftwarecontrollaancheapparecchimenoovvi,comeitelevisoriaLCDeilorotelecomandi,radio,lettoridiDVD,fornieanchequalchefrigoriferodeipiùrecenti.Ancheimotoridelleautomobili,isemafori,ilampioni,isegnalideitreni,itabellonielettroniciegliascensorisonocontrollatidaprogrammi.
Iprogrammisonounpo’comepensieri.Senonavestepensieri,probabilmentevenestarestesedutisulpavimento,conlosguardopersonelvuotoelasalivachevigocciolasullamaglietta.Ilpensiero“alzatidalpavimento”èun’istruzione,ouncomando,chedicealvostrocorpodialzarsi.Allostessomodo,iprogrammidiconoaicomputerchecosafare.
Sesapetescrivereprogrammipercomputer,potetefareognigeneredicoseutili.Certo,magarinonsareteingradodiscrivereprogrammichecontrollanoauto,semaforioilfrigorifero(oalmeno,noninizialmente),mapotretecrearepagineweb,scrivereivostrigiochioaddiritturaunprogrammachevisiad’aiutoneicompitiacasa.
QUALCHEPAROLASULLINGUAGGIOComegliesseriumani,icomputerpossonousaremoltelinguepercomunicare–inquestocaso,linguaggidiprogrammazione.Unlinguaggiodiprogrammazioneèsolounmodoparticolarediparlareauncomputer–unmodoperusareistruzionichesiagliesseriumanisiaicomputersonoingradodicomprendere.
Esistonolinguaggidiprogrammazionecheprendonoilnomedapersone(comeAdaePascal),quellichehannocomenomesempliciacronimi(comeBASICeFORTRAN)eanchequalcunocheprendeilnomedatrasmissionitelevisive,comePython.Sì,illinguaggiodiprogrammazionePythonhapresoilnomedallatrasmissionetelevisivaingleseMontyPython’sFlyingCircus,nondalserpente(pythonèlaparolainglesechesignifica“pitone”,senonl’avevateancoracapito).
ParecchiecaratteristichefannodiPythonunlinguaggiodiprogrammazioneestremamenteutileperchièalleprimearmi.PoteteutilizzarePythonperscriveremoltorapidamenteprogrammisemplicimamoltoefficaci.Nonusamoltisimbolicomplicati,adifferenzadialtrilinguaggidiprogrammazione,edèperciòpiùfaciledaleggereemoltopiù“amichevole”perchièagliinizi.(QuestononvuoldirechePythonnonusisimboli–semplicementeillorousononècosìestesocomeinmoltialtrilinguaggi.)
INSTALLAREPYTHONL’installazionediPythonèmoltosemplice.Quivedremocomelosiinstallain
1.
2.
3.
Windows10,MacOSXeUbuntu.InstallandoPython,trovereteancheuncollegamentoalprogrammaIDLE(chesignificaIntegratedDeveLopmentEnvironment,ambientedisviluppointegrato),chepermettediscrivereprogrammiperPython.SePythonègiàinstallatosulvostrocomputer,potetepassaresubitoalparagrafo“DopoaverinstallatoPython”apagina10.
INSTALLAREPYTHONINWINDOWS10PerinstallarePythonperMicrosoftWindows10,usateilbrowserweb,andateall’indirizzohttp://www.python.org/escaricateilprogrammadiinstallazionepiùrecenteperPython3.NelmenudelsitotrovereteunasezioneintitolataDownloads.Unclicsulnomediquestasezioneviporteràaunafinestracomequesta:
NOTAQualesiaesattamentelaversionediPythonchescaricatenonèimportante,bastacheilsuonumeroiniziconil3.Gliaggiornamentisonofrequenti:quivedeteleindicazioniperlaversione3.5.1,maèprobabilechequandoleggeretequestepaginelaversionepiùrecenteabbiaunnumeropiùalto.
UnavoltascaricatoilprogrammadiinstallazioneperWindows,fateundoppioclicsullasuaicona,poiseguiteleistruzioniperinstallarePythonnellaposizionepredefinita.
SelezionatelacaselladicontrolloInstalllauncherforallusers(senonègiàselezionata).Noncambiateladirectorydidestinazionepredefinita,maannotateviilnomedelladirectory(potrebbeessereC:\Python32,peresempio).IgnoratelasezioneCustomizeinstallationefateclicsuInstallnow.
Allafinedelprocedimento,nelmenuStarttroverete,tralenuoveapp,ofrale
1.
2.
3.4.
appinstallatedirecente,alcunevocirelativeaPython.
Poi,seguitequestipassiperaggiungereuncollegamentoaPython3alvostrodesktop:
Fateclicdestroinunpuntovuotodeldesktop,poiselezionateNuovo,Collegamentodalmenudisceltarapida.NellacasellasottolascrittaImmettereilpercorsoperilcollegamento,scrivete(assicurandovicheilnomedelladirectorysiaquellochevisieteannotatiinprecedenza):
FateclicsuAvantiperpassareallafinestradidialogosuccessiva.InseriteilnomecomeIDLEefateclicsuFinepercreareilcollegamento.
Orapotetepassarea“DopoavereinstallatoPython”apagina10periniziare.
1.
2.
INSTALLAREPYTHONSUMACOSXSeusateunMac,dovresteavereunaversionediPythongiàpreinstallata,maprobabilmentesitrattadiunaversionepiùvecchia.Peresseresicuridiaverelapiùrecente,apriteilbrowsereandateall’indirizzohttp://www.python.org/getit/perscaricareilprogrammadiinstallazionepiùrecenteperilMac.
Iprogrammidiinstallazionesonodiversi:quellochedovetescaricaredipendedallaversionediMacOSXcheavete.(Seavetedubbi,potetescoprireilnumerodiversionedelsistemaoperativofacendoclicsullaMelanellabarradeimenuinaltoescegliereInformazionisuquestoMac.)
SeilvostrocomputerhaunaversionediMacOSXcompresafrala10.3ela10.6,scaricatelaversionea32bitdiPython3peri386/PPC.
SeilvostrocomputerhaunaversionediMacOSX10.6osuperiore,scaricatelaversione64-bit/32-bitdiPython3perx86-64.
Unavoltascaricatoilfile(avràunnomeconestensione.pkgelotroveretenellacartellaDownload),fateundoppioclicsudiessoepartiràilprocessoguidatodiinstallazione.
Inquestafinestra,fatedoppioclicsuPythonmpkg,poiseguiteleistruzioniperinstallareilsoftware.ViverràchiestalapassworddiamministratoredelvostroMac.(Nonconoscetelapassworddiamministratore?Probabilmentedovretechiedereaivostrigenitoridiinserirla.)
Poi,doveteaggiungerealdesktopunoscriptperlanciarel’applicazioneIDLEdiPython,inquestomodo:
Fateclicsull’iconaSpotlight,lalentediingrandimentonell’angolosuperioredestrodellaschermata.Nellafinestrachecompare,scriveteAutomator.
3.4.
5.6.
7.
Fateclicsull’applicazionechehal’aspettodiunrobot,quandocomparenelmenu.SarànellasezioneintitolataPiùutilizzatioinApplicazioni.AvviatoAutomator,selezionateilmodelloApplicazione:
FateclicsuSceglipercontinuare.Nell’elencodelleazioni,trovateEseguiscriptshelletrascinatelonelriquadrovuotoadestra.Vedretequalcosadisimileaquesto:
Nellacaselladitesto,vedretelaparolacat.Selezionatequestaparolae
8.9.
1.
2.3.
4.5.
sostituitelaconiltestoseguente(tutto,daopena-n):
Puòdarsichedobbiatecambiareladirectory,asecondadellaversionediPythoncheaveteinstallato.SelezionateFile,SalvaeinseritecomenomeIDLE.SelezionateDesktopdallafinestradidialogoSituatoin,poifateclicsuSalva.
Orapotetepassarea“DopoavereinstallatoPython”apagina10periniziare.
INSTALLAREPYTHONSUUBUNTUPythonègiàpreinstallatonelladistribuzioneUbuntudiLinux,mapuòdarsichenonsialaversionepiùrecente.PerinstallarePython3suUbuntuprocedetecosì:
Fateclicsulpulsantedell’UbuntuSoftwareCenternellaSidebar(èl’iconachehal’aspettodiunaborsaarancione–senonlavedete,potetesemprefareclicsull’iconaDashHomeeinserireSoftwarenellafinestradidialogo).InseritePythonnellacaselladiricerca(inaltoalcentro)delSoftwareCenter.Nell’elencodelsoftwarechesipresenta,selezionatelaversionepiùrecentediIDLE,cheè,almomentoincuiscrivo,IDLE(usingPython3.5).FateclicsuInstalla.Inseritelapassworddiamministratorequandovivienerichiestaeprocedeteall’autenticazione.(Nonconoscetelapassworddiamministratore?Dovretechiedereaivostrigenitoridiinserirlapervoi.)
NOTAInqualcheversionediUbuntu,puòdarsichevediatesoloPython(v3.5)nelmenuprincipale(anzichéIDLE):poteteinstallarequello.
ConalcuneversionidiUbuntularicercadiPythonattraversoilSoftwareCentersembranondarefrutto.Intalcaso,apriteunafinestradiTerminaleealpromptinseriteilcomandoseguente:
L’installazioneèpoicompletamenteautomatica,tranneunarichiestadiconferma(acuidoveterispondereconunSì).AlterminepotretetrovareIDLE(usingPython3.5)nell’elencodelsoftwareinstallatonelSoftwareCenter,nellasezioneApplicazioni.Seavetedifficoltàatrovarlo,utilizzatelacaselladiricercadiCercasulcomputer(èlaprimaiconainaltonellabarralaterale).
DOPOAVERINSTALLATOPYTHON
Orasuldesktopdelvostrocomputer(seaveteunamacchinaWindowsounMacOSX)dovresteavereun’iconaIDLE.SeusateUbuntu,asecondadellaversionedelsistemaoperativo,troveretel’iconanelmenuApplicazionioppurenelSoftwareCenter.
Fateundoppioclicsull’iconaosceglietel’opzionedamenuevicompariràunafinestracomequesta:
QuestaèlashelldiPython,chefapartedell’ambientedisviluppointegrato.Itresimboli“maggioredi”(>>>)sonoilcosiddettoprompt.
Inseriamoqualchecomandoalprompt,cominciandoconquesto:
Fateattenzioneanondimenticareidoppiapici("").PremeteInviosullatastiera,quandoavetefinitodiscriverequestariga.
Seaveteinseritocorrettamenteilcomando,vedretequalcosadianalogoaquesto:
Saràricomparsoilprompt,perfarvisaperechelashelldiPythonèprontaadaccettarealtricomandi.
Congratulazioni!AveteappenacreatoilvostroprimoprogrammainPython.LaparolaprintfapartediqueltipodicomandiPythonchesonochiamatifunzioni,e“stampa”qualsiasicosasitroviall’internodelleparentesi.
Insostanza,avetedatoalcomputerl’istruzionedivisualizzareleparole“Ciaomondo”–unaistruzionecomprensibilesiaavoichealcomputer.
SALVAREIPROGRAMMIPYTHONIprogrammiPythonnonsarebberomoltoutilisefossenecessarioriscriverliognivoltachelisivuoleusare,oppurevisualizzareinmododapoterliconsultare.Certo,unprogrammamoltobrevesipotrebbeancheriscrivere,maunprogrammadigrandidimensioni,comeunelaboratoreditesto,puòesserecostituitodamilionidirighedicodice.Stampateletutteeviritroveretemagariconunmalloppodaoltre100.000pagine.Difficileportarloacasasottobraccio–sperandochenonarriviunafolatadivento.
Perfortuna,èpossibilesalvareiprogrammiperpoterliriusareinfuturo.Persalvareunnuovoprogramma,inIDLEsceglieteFile,NewFile.Siapriràunanuovafinestra,conilnomeUntitlednellabarradeltitolo.Nellanuovafinestradellashellscrivetequestocodice:
OrasceglieteFile,Save.Quandovienechiestoilnomedelfile,scriveteciao.pyesalvateilfilesuldesktop.PoisceglieteRun,RunModule.Senonavetecommessoerrori,ilprogrammaverràeseguito,conquestorisultato:
Ora,sechiudetelafinestradellashellmalasciateapertalafinestraciao.pyesceglietedinuovoRun,RunModule,ricompariràlashelldiPythoneilvostroprogrammaverrànuovamenteeseguito.(PerriaprirelashelldiPythonsenzaeseguireilprogramma,sceglieteRun,PythonShell.
Dopoavereseguitoilcodice,suldesktoptrovereteunanuovaicona,conilnomehello.py.Sefateundoppioclicsuquell’icona,appariràbrevementeunafinestraconlosfondonero,esubitodoposvanirà.Checosaèsuccesso?
AvetevistolaconsoledarigadicomandodiPython(analogaallashell)chesiavviava,stampava“Ciaomondo”epoisichiudeva.Eccoquellocheviapparirebbe,seavesteunavistaultrarapidadasupereroeeriuscisteavederelafinestraprimachesichiuda:
•
•
Oltreaimenu,poteteusareitastidisceltarapidapercreareunanuovafinestradellashell,salvareunfileedeseguireunprogramma:
InWindowseUbuntu,usateCtrl-Npercreareunanuovafinestradellashell,Ctrl-Spersalvareilfiledopocheavetefinitodiscriverlo,F5pereseguireilprogramma.InMacOSX,usateOpzione-Npercreareunanuovafinestradellashell,Opzione-Spersalvareilfile,mentrepereseguireilprogrammapremeteetenutopremutoiltastofunzione(FN)epremeteF5.
CHECOSAAVETEIMPARATOAbbiamoiniziatoinquestocapitoloconun’applicazioneCiaomondo,ilprogrammaconcuipraticamentetuttiinizianoquandocomincianoastudiarelaprogrammazione.Nelprossimocapitolo,faremoqualchealtracosautileconlashelldiPython.
2CALCOLIEVARIABILI
OracheaveteinstallatoPythonesapetecomeavviarelashell,sieteprontiperfarequalcosa.Inizieremoconqualchesemplicecalcoloepoipasseremoallevariabili.Levariabilisonounmodoperconservarelecoseinunprogrammaepermettonodiscrivereprogrammiutili.
CALCOLARECONPYTHONNormalmente,sevichiedesserodicalcolareilprodottodiduenumeri,peresempio8×3.57(useremoilpuntoalpostodellavirgola,neinumeridecimali,comenell’usoanglosassone:ècosìchelivuolescrittiPython),useresteunacalcolatriceocartaepenna.Beh,cheneditediusarelashelldiPythonperfarequestocalcolo?Proviamo.
AvviatelashelldiPythonconundoppioclicsull’iconaIDLEsuldesktopo,seusateUbuntu,facendoclicsull’iconaIDLEnelSoftwareCenter.Alprompt,inseritel’espressione:
Notateche,perchiedereaPythondieffettuareunamoltiplicazione,siusailsimbolodell’asterisco(*),invecedeltradizionalesegno“per”(×).
Eseprovassimoconuncalcolounpo’piùutile?Supponiamoche,scavandoingiardino,troviateunsacchettocon20monete
d’oro.Ilgiornodopo,viintrufolateincantinaeinfilatelemonetenellamacchinareplicatriceavaporedelnonno(perfortuna,riuscitegiustoainfilarcitutteleventimonete).Sentiteunrisucchioeunoschioccoe,dopoqualcheora,eccocheneesconoaltre10moneteluccicanti.
Quantemoneteavrestenellacassadelvostrotesorosefacestelastessacosaognigiornoperunanno?Sullacarta,leespressionipotrebberoesserequeste:10×365=365020+3650=3670
Certo,èfacilefarequesticalcoliconlacalcolatriceosucarta,mapossiamofarliancheconlashelldiPython.Prima,moltiplichiamole10moneteperi365giorniinunanno,poialrisultatosommiamole20moneteoriginali.
Uncorvovedelebellemoneted’oronellavostracameradalettoeognisettimanaentraeriesceaportarseneviatre.Quantemonetevirimarrannoallafinedell’anno?Eccocomesipresenterebbeilcalcolonellashell:
Prima,moltiplichiamo3moneteper52settimane.Ilrisultatoè156.Sottraiamoquestonumerodalnostrototale(3670)escopriamocheafineannovirimarranno3514monete.
Questoèunprogrammamoltosemplice.Nelcorsodellibro,vedretecomesvilupparequesteideeperscrivereprogrammimoltopiùutili.
GLIOPERATORIDIPYTHONNellashelldiPythonpoteteeseguirelequattrooperazioniaritmetichefondamentali(somma,sottrazione,moltiplicazioneedivisione),oltreamoltealtrecheperilmomentononaffrontiamo.IsimbolifondamentaliutilizzatidaPythonperleoperazionimatematichesonochiamatioperatoriesonoelencatinellaTabella2.1.
Tabella2.1.GlioperatorifondamentalidiPython.
Simbolo Operazione+ Somma- Sottrazione* Moltiplicazione/ Divisione
Siusalabarraperladivisioneperchéèsimileallalineachesiscriveperindicarelefrazioni.Peresempio,seavete100piratie10grandibottievoletecalcolarequantipiratidovetesistemareinciascunabotte,potetedividere100piratiper20botti(100:20)scrivendo100/20nellashelldiPython.
L’ORDINEDELLEOPERAZIONIInunlinguaggiodiprogrammazionesiusanoleparentesipercontrollarel’ordinediesecuzionedelleoperazioni.Unaoperazioneèun’istruzionecheusaunoperatore.Lamoltiplicazioneeladivisionehannolaprecedenzasusommaesottrazione,cioèvengonoeseguiteperprime.Inaltreparole,seinserite
•••
un’espressioneinPython,lemoltiplicazionieledivisionivengonoeseguiteprimadellesommeedellesottrazioni.Peresempio,inquestocaso,primavengonomoltiplicati30e20,poialprodottovienesommato5.
Questaespressioneèilnostromododidire“moltiplica30per20,poisomma5alrisultato”.Iltotaleè605.Possiamomodificarel’ordineincuivengonoeseguiteleoperazioniinserendoleparentesi,peresempiocosì,persommare5e30primachevengaeseguitalamoltiplicazioneper20:
Ilrisultatodiquestocalcoloè700(non605)perchéleparentesidiconoaPythondicalcolareprimalasommafraparentesiesolodopoeseguirel’operazioneindicatafuoridalleparentesi.L’esempiodice“somma5a30,poimoltiplicailrisultatoper20”.
Leparentesipossonoessereannidate,cioèpossonoesserciparentesidentroparentesi,comeinquestocaso:
Inquestocaso,Pythonsvolgeprimal’operazioneindicatadalleparentesipiùinterne,poiquelladentroleparentesiesterne,infinequellafuoridalleparentesi(ladivisione).
Inaltreparole,questaespressionedice“somma5a30,poimoltiplicailrisultatoper20edividiilnuovorisultatoper10”.Eccochecosasuccede:
Sommando5e30siottiene35.Moltiplicando35per20siottiene700.Dividendo700per10siottieneilrisultatofinale,70.
Senonavessimousatoleparentesi,ilrisultatosarebbestatoleggermente
diverso:
Inquestocaso,prima30vienemoltiplicatoper20(risultato:600),poi600vienedivisoper10(risultato:60)einfinevienesommato5,ilchedàcomerisultatofinale65.
ATTENTIRicordatechemoltiplicazioneedivisionevengonoeseguiteprimadisommaesottrazione,amenochevenganousateleparentesipercontrollarel’ordinediesecuzionedelleoperazioni.
LEVARIABILISONOCOMEETICHETTELaparolavariabilenellaprogrammazionedescriveunluogoincuiconservareinformazionicomenumeri,testo,elenchidinumerietestiecosìvia.Sipuòconsiderareunavariabileanchecomeun’etichettacheindicaqualcosa.
Peresempio,percreareunavariabilechesichiamafred,possiamousareunsegnodiuguale(=)epoidireaPythonperchetipodiinformazionequellavariabiledebbaesserel’etichetta.QuicreiamolavariabilefredediciamoaPythoncheèl’etichettadelnumero100(notatechequestononescludecheancheun’altravariabilepossaaverelostessovalore):
Perscoprirediqualevaloreunavariabilesial’etichetta,nellashellscriveteprint,seguitodalnomedellavariabilefraparentesi,inquestomodo:
PossiamoanchedireaPythondimodificarelavariabilefredinmodocheindichiqualcos’altro.Peresempio,eccocomecambiareilvaloredifredin200:
Nellaprimariga,diciamochefredèun’etichettadelnumero200.Nellaseconda,chiediamochecosaetichettafred,tantoperesseresicuridellavariazione.Pythonstampailrisultatosull’ultimariga.
Possiamousareanchepiùdiun’etichetta(piùdiunavariabile)perindicarelastessacosa:
Inquestoesempio,diciamoaPythonchevogliamocheilnome(lavariabile)johnetichettilastessacosadifredutilizzandoilsegnodiugualefrajohnefred.
Ovviamente,fredprobabilmentenonèunnomemoltoutileperunavariabile,perchénoncidicenulladiquellopercuiquellavariabilevieneutilizzata.Chiamiamoalloralanostravariabilenumero_di_moneteanzichéfred,così:
Inquestomodoèchiarocheparliamodi200monete.Inomidellevariabilipossonoesserecostituitidalettere,numeriedalcarattere
underscore(_),manonpossonoiniziareconunnumero.Poteteusareancheunasingolalettera(peresempioa),cosìcomeunalungafrase,comenomedivariabile.(Unavariabilenonpuòcontenerespazi,perciòusatel’underscoreperseparareleparole.)Avolte,sedovetefarequalcosarapidamente,nomibreviperlevariabilisonolasoluzionemigliore.Ilnomechesceglietedipendedaquantovoletechesiasignificativo.
Orachesapetecomecrearevariabili,vediamoinchemodousarle.
USARELEVARIABILIRicordatelanostraespressionepercalcolarequantemoneteavresteavutoallafinedell’anno,potendomagicamentecrearenuovemoneteconlafolleinvenzionedelnonnoincantina?Abbiamoquesteespressioni:
Possiamotrasformarleinun’unicarigadicodice:
Ora,chenediteditrasformareinumeriinvariabili?Provate:
1.
2.
Questerighecreanolevariabilimonete_trovate,monete_magicheemonete_rubate.Orapossiamoriscriverelanostraespressioneinquestomodo:
Comesipuòvedere,siottienesemprelastessarisposta.Eallora,perchédarsitantodafare?Ah,maquistalamagiadellevariabili.Checosasuccedesemetteteunospaventapasseriallafinestraeilcorvorubasoloduemoneteinveceditre?Seusiamounavariabile,possiamosemplicementemodificarlainmodochecontengailnuovonumero,ecosìilcambiamentosicomunicheràintuttiipuntiincuiquelnumeroerausatonell’espressione.Possiamocambiarelavariabilemonete_rubateinquestomodo:
Poipossiamocopiareeincollarel’espressione,percalcolarenuovamenteiltotale,inquestomodo:
Selezionateiltestodacopiarefacendoclicconilmouseepoitrascinandodall’inizioallafinedellariga:
TenetepremutoiltastoCtrl(oiltastoOpzione,seusateunMac)epremeteCpercopiareiltestoselezionato.(D’orainpoi,scriveremosemplicementeCtrl-C.)
3.4.
5.
Fateclicsull’ultimarigadiprompt(dopomonete_rubate=2).TenetepremutoiltastoCtrlepremeteVperincollareiltestoselezionato.(D’orainpoiscriveremosemplicementeCtrl-V).PremeteInviopervedereilnuovorisultato.
Nonèmoltopiùfacilecheriscriveretuttal’espressione?Poteteprovareamodificarelealtrevariabili,poicopiate(Ctrl-C)eincollate
(Ctrl-V)l’espressionepervederel’effettodeicambiamenti.Peresempio,seassestandouncolpoalmomentoopportunosulfiancodell’invenzionedelnonnoquestaemetteognivolta3moneteinpiù,viritrovereteallafinedell’annocon4661monete:
Ovviamente,usarelevariabiliperun’espressionesemplicecomequestanonèdigrandeutilità:nonsiamoancoraarrivatiaqualcosadiveramenteutile.Perilmomento,ricordatesolochelevariabilisonounmodoperetichettarecose,inmododapoterleriutilizzareinseguito.
CHECOSAAVETEIMPARATOInquestocapitoloaveteimparatocomecalcolaresempliciespressionimatematicheconglioperatoridiPythonecomeusareleparentesipercontrollarel’ordinediesecuzionedelleoperazioni(cioèl’ordineincuiPythoncalcolalediversepartidiun’espressione).Poiabbiamocreatodellevariabiliperetichettaredeivalorieabbiamousatoquellevariabilineinostricalcoli.
3STRINGHE,LISTE,TUPLEEMAPPE
NelCapitolo2,abbiamoeseguitoqualchesemplicecalcoloconPython,eavetescopertochecosasonolevariabili.Inquestocapitolo,lavoreremoconalcunideglialtrielementineiprogrammiPython:stringhe,liste,tupleemappe.Useretelestringheperpresentaredeimessaggineivostriprogrammi(peresempio“Preparatevi”o“Gameover”inungioco).Scoprireteanchecomeliste,tupleemappevenganoutilizzateperconservareinsiemidicose.
STRINGHENellaprogrammazione,sidicestringaunasuccessionedicaratteri.Unastringapuòconteneretuttelelettere,inumerieisimbolidiquestolibro,oppureilvostronomeeindirizzo.Ineffetti,ilprimoprogrammaPythoncreatonelCapitolo1usavaunastringa:“Ciaomondo”.
CREARESTRINGHEInPython,sicreaunastringamettendodoppiapiciall’inizioeallafinediuntesto,perchéilinguaggidiprogrammazionedevonodistingueretipidivaloridiversi.(Dobbiamodireseunvaloreèunnumero,unastringaoaltro.)Peresempio,prendiamolavariabilefreddelCapitolo2eusiamolaperetichettareunastringa:
Poi,pervederechecosac’èdentrofred,possiamoscrivere:
Sipossonousareancheapicisingoli,percreareunastringa,inquestomodo:
Però,secercatediinserirepiùrigheditestoperunastringausandosolounapicesingolo(')odoppio(")oseiniziateconuntipodiapiceefiniteconl’altro,lashelldiPythonvimosteràunmessaggiodierrore.Peresempio,provateainserirequestariga:
Vedretequestorisultato:
Lascrittaèunmessaggiodierrorechelamentaunerroredisintassi,perchénonaveteosservatolaregola,cheprescrivelachiusuradiunastringaconunapicesingoloodoppio.[Lascrittasignifica:Erroredisintassi:raggiuntalafinedellariganell’analizzarelastringa.]Sintassisignificailmodoincuisonodisposteeordinateleparoleinunafraseo,
inquestocaso,ilmodoincuisonodispostieordinatiparoleesimboliinunprogramma.SyntaxErrorquindisignificacheavetefattoqualcosainunordinechePythonnonsiaspettava,ochePythonsiaspettavaqualcosacheinvecemancava.EOLsignificaend-of-line(fineriga),perciòilrestodelmessaggiodierroredicechePythonharaggiuntolafinedellarigaenonhatrovatoundoppioapicedichiusuradellastringa.
Perusarepiùdiunarigaditestonellastringa(chesichiamaallorastringamultilinea),iniziatelastringacontreapicisingoli(''')epremeteInviofraunarigael’altra,così:
Proviamooraastampareicontenutidifredpervedereseèandatotuttobene:
TRATTAREPROBLEMICONLESTRINGHEPrendiamoquestoesempiodistringa,cheprovocaunmessaggiodierroreinPython:
Nellaprimariga,abbiamocercatodicreareunastringa(definitaconilnomemoltofantasiosodistringa),racchiusafraapicisingoli,macontenenteunacombinazionediapicieanchedidoppiapici.Unbelpasticcio!
RicordatechePythonnonèintelligentequantounessereumano,perciòtuttoquellochevedeèunastringacontenenteHadettol’,seguitodaunaseriedialtricaratterichenonsiaspettava.QuandoPythonvedeunapice(singoloodoppio)siaspettaunastringacheiniziaconilprimoapice(singoloodoppio)echesiconcludeconilsuccessivoapicecorrispondente.Qui,l’iniziodellastringaèindicatodalprimoapicesingoloprimadiHa,elafinedellastringa,perquelcheconstaaPython,èl’apicesingolodopolaldil'altrasera.IDLEevidenziadovele
coseinizianoanonquadrare:
L’ultimarigadiIDLEcidicechetipodierroresièverificato:inquestocasounerroredisintassinonvalida.
L’usodiapicidoppialpostodiquellisingoliproduceancoraunerrore:
Qui,Pythonvedeunastringadelimitatadaapicidoppieinterpretacorrettamentegliapicisingolicomecaratteri(enoncomedelimitatori),mapoi,doposera,incontraundoppioapicecheinterpretacomefinedellastringa–seguitodaaltricaratterichenonsapiùcomeinterpretare:
Tuttoquestoperché,dalpuntodivistadiPython,tuttiqueicaratteriulteriorisemplicementenondovrebberoesserci.Pythoncercailtipodiapicecorrispondenteaquellodiaperturae,quandoloincontra,pensachelastringasiafinitaenonsachecosafarsenediquellocheseguesullastessariga.
Lasoluzioneèunastringamultilinea,comeabbiamovisto,conl’usoditreapicisingoli('''),chepermettonodicombinareapicisingoliedoppinellastringasenzaprovocareerrori.Ineffetti,sesiusanocomedelimitatoriitreapicisingoli,nella
stringasipuòmetterequalsiasicombinazionediapicisingoliedoppi(bastanontentarediinseriretreapicisingoliinfila).Questaèlaversioneprivadierroridellanostrastringa:
Maaspettate,nonèfinita.SevoletepropriousareunapicesingoloodoppioperdelimitareunastringainPython,invecediusareitreapicisingoli,poteteaggiungereunabarrarovesciata(\)davantiaciascunapiceall’internodellastringa.Questatecnicasichiamaescapingelabarrarovesciataèchiamatacaratterediescape.ÈunmodoperdireaPython“Sì,loso,hodegliapicidentrolamiastringa,evogliochetuliignorifinchénonvedil’apicefinale”.
Lestringheconicaratteridiescapepossonoesserepiùdifficilidaleggere,perciòèmeglio,ingenerale,usarelestringhemultilinea.Puòcapitareperòdiimbattersiinqualcheframmentodicodicecheusaicaratteridiescape,perciòèbenesaperechecosasonoquellebarrerovesciate.
Eccoqualcheesempiodellatecnicadell’escaping:
Prima,in 1 ,abbiamocreatounastringaconl’apicesingolocomedelimitatore,mettendolabarrarovesciatadifronteagliapicisingoliall’internodellastringa.In2 ,abbiamocreatounastringaconildoppioapiceeusatolabarrarovesciatadavantiaidoppiapicidentrolastringa.Nellerighesuccessive,abbiamostampatolevariabiliappenacreate.Notatecheilcaratteredellabarrarovesciatanoncomparenellestringhe,quandovengonostampate.
INCORPORAREVALORINELLESTRINGHESevoletevisualizzareunmessaggiocheusiicontenutidiunavariabile,poteteincorporareivaloriinunastringacon%s,cheèunasortadiindicatorediunvaloredaaggiungereinseguito(siparladiincorporarevaloriodisostituzionedistringa,nelgergodeiprogrammatori).Peresempio,perchéPythoncalcolioricordiilnumerodipuntifattiinungiocoepoiliinseriscainunafrasecome“Hototalizzato___punti”,usate%snellafrasealpostodiquelvalore,poiditeaPythonilvalore,peresempiocosì:
Abbiamocreatolavariabilemiopunteggioconvalore1000elavariabilemessaggioconunastringachecontieneleparole“Hototalizzato%punti”,dove%sèun“segnaposto”perilnumerodipunti,Nellarigasuccessiva,chiamiamoprint(messaggio)conilsimbolo%perdireaPythondisostituire%sconilvaloredellavariabilemiopunteggio.IlrisultatoèlavisualizzazionedelmessaggioHototalizzato1000punti.Nonènecessariousareunavariabileperilvalore:avremmoottenutolostessorisultatoutilizzando(messaggio%1000).
Possiamoanchepassarevaloridiversiperilsegnaposto%s,utilizzandovariabilidiverse,comeinquestoesempio:
Quiabbiamocreatotrevariabili.Laprima,battuta,conservalastringaconilsegnaposto%s.Lealtreduevariabilisonoparte_del_corpo1eparte_del_corpo2.Possiamostamparelavariabilebattutaeusarenuovamentel’operatore%cheverràsostituitodaicontenutidellevariabiliparte_del_corpo1eparte_del_corpo2pergeneraremessaggidiversi.
Poteteusareanchepiùdiunsegnapostoinunastringa,peresempioinquestomodo:
Quandosiusapiùdiunsegnaposto,bisognaricordarediinserireivalori
sostitutivifraparentesi,comenell’esempio.L’ordineincuiivaloricompaionofraleparentesisaràanchel’ordineincuiverrannousatinellastringa.
MOLTIPLICARESTRINGHEQuantofa10moltiplicatoper5?Larisposta,ovviamente,è50.Machecosafa10moltiplicatopera?QuestaèlarispostadiPython:
ProgrammandoinPythonsipuòusarequestometodoperallinearelestringheconunnumerospecificodispazi,quandosivisualizzanomessagginellashell,peresempio.Potremmostampareunaletteranellashell:selezionateFile>NewFileeinseritequestocodice:
Scrittoilcodicenellafinestradellashell,selezionateFile>SaveAs.Datealfileilnomemialettera.py.PotetepoieseguirloselezionandoRun>RunModule.
NOTADaquestomomento,quandovedreteSaveAs:unnomedifile.pyaldisopradiunbranodicodice,sapretechedoveteselezionareFile>NewFile,inserireilcodicenellafinestrachesiapreepoisalvarlocomeabbiamofattoinquestoesempio.
Nellaprimarigadiquestoesempioabbiamocreatolavariabilespaziassegnandolecomevaloreuncaratterespaziomoltiplicatoper25.Poiabbiamousatoquellavariabile,nelletrerighesuccessive,perallineareiltestorientratosulladestradellafinestradellashell.Potetevedereilrisultatodiquestienunciatiprintquisotto:
Oltreausarlaperl’allineamento,possiamousarelamoltiplicazioneperriempireloschermodimessaggiirritanti.Poteteprovaredasoliquestoesempio.
LELISTESONOPIÙPOTENTIDELLESTRINGHE“Zampediragno,ditodirana,occhiodigirino,aladipipistrello,bavadilumaconeeforforadiserpente”:nonèpropriounalistadellaspesanormale(amenochenonsiatemaghi),malauseremocomeprimoesempioperillustrareledifferenzefrastringheeliste.
Potremmoconservarequestalistanellavariabilemago_listaconunastringacomequesta:
Potremmoperòanchecreareunalista,untipodioggettounpo’magicodiPython,chesipuòmanipolaremeglio.Eccocomesipresenterebberoinostriingredientiinformadilista:
Percreareunalistabisognascrivereunpo’dicaratteriinpiùchepercreareunastringa,maunalistaèpiùutileperchépuòesseremanipolata.Peresempio,potremmostampareilterzoelementodellamago_lista(occhiodigirino)indicandolasuaposizionenellalista(ilsuoindice)fraparentesiquadre([]),inquestomodo:
Cosa?Manonerailterzoelementodellalista?Vero,malelisteinizianoconlaposizione0,perciòilprimoelementodiunalistaè0,ilsecondo1,ilterzo2.Forsenonavràmoltosensopergliesseriumani,manehapericomputer.
Possiamoanchemodificareunelementoinunalistamoltopiùfacilmentecheinunastringa.Magari,anzichéunocchiodigirinoavevamobisognodiunalinguadichiocciola.Eccocomepotremmofareconlanostralista:
Inquestomodoabbiamomodificatol’elementodiindice2:primaera“occhiodigirino”,oraè“linguadichiocciola”.
Altrapossibilitàèvisualizzareunsottoinsiemedeglielementinellalista.Losipuòfareusandounsegnodiduepunti(:)dentroleparentesiquadre.Peresempio,pervedereglielementidalterzoalquintodellalista:
Scrivere[2:5]equivaleadire“mostramiglielementidallaposizionediindice2finoaquella(esclusa)diindice5”–inaltreparole,glielementi2,3e4.
Lelistepossonoessereutilizzateperconservareelementidiqualsiasigenere,peresempionumeri:
Possonocontenereanchestringhe:
Possonocontenereanchenumeriestringheallarinfusa:
Lelistepoipossonocontenereanchealtreliste:
Inquest’ultimoesempio,abbiamocreatotrevariabili:numerichecontienequattronumeri,stringhechecontienenovestringheemialistautilizzandonumeriestringhe.Laterzalista(mialista)hasolodueelementi,perchéèunalistadinomidivariabili,nondeicontenutidellevariabilistesse.
AGGIUNGEREELEMENTIAUNALISTAPeraggiungereelementiaunalista,siusalafunzioneappend.UnafunzioneèunbloccodicodicechediceaPythondifarequalcosa.Inquestocaso,appendaggiunge
unelementoallafinediunalista.Peresempio,peraggiungereunruttodiorso(sonosicurocheesisteunacosa
delgenere)allalistadellaspesadelmago:
Potetecontinuareadaggiungereelementimagiciallalista,semprenellostessomodo:
Oralalistadelmagosaràdiventataquesta:
Ilmagoèprontopercompierequalchemagiaimportante!
ELIMINAREELEMENTIDAUNALISTAPereliminareelementidaunalista,siusailcomandodel(abbreviazionedidelete,chesignifica“cancella”).Peresempio,pereliminareilsestoelementonellalistadelmago,laforforadiserpente,sipuòfareinquestomodo:
NOTARicordatechenellelisteleposizionipartonodall’indicezero,perciòmago_lista[5]indicaineffettiilsestoelementodellalista.
Edeccocomeeliminareglielementicheabbiamoappenaaggiunto(mandragora,cicutaegasdipalude):
ARITMETICADELLELISTEPossiamounire(ilterminepiùprecisoèconcatenare)dueopiùlistesemplicementesommandole,comefaremmoconinumeri,medianteunsegnopiù(+).Peresempio,supponiamodiaveredueliste:lista1,checontieneinumerida1a4,elista2,checontienealcuneparole.Possiamounirleusandoprinteilsegno+,inquestomodo:
Èpossibileancheunire(concatenare)duelisteeassegnareilrisultatoaun’altravariabile:
Possiamoanchemoltiplicareunalistaperunnumero.Peresempio,permoltiplicarelista1per5,scriviamolista1*5:
QuestoequivaleineffettiadireaPythondiripeterelista1percinquevolte.Nonsipuòinvecedividereunalistaperunnumeroosottrarreunnumerodauna
lista:siottengonosolomessaggidierrore,comeinquestiesempi:
Perché?Beh,concatenareduelisteconun+eripetereunalistaconun*sonooperazioniabbastanzaimmediate.Questiconcettihannounsensoanchenelmondoreale.Peresempio,seviporgessiduefoglietticonduelistedellaspesaevidicessi,“Sommatequestedueliste”,potrestescrivereleduelistesuunaltrofogliodicartainordine,primal’unaepoil’altra.Allostessomodo,sevidicessi“Moltiplicatequestalistaper3”,potresteimmaginarvidiscriveretuttiglielementidellalistapertrevoltedifilasuunaltrofoglietto.
Macomesipotrebbedividereunalista?Peresempio,pensateacomepotrestedividereunalistadiseinumeri(da1a6)indue.Questisonosolotremodidiversi:
Dividerestelalistaametà,dopoilprimoelementoosceglieresteunpuntoacasoincuidividerla?Nonesisteunarispostasemplicee,seglichiedetedidividereunalista,anchePythonnonsachecosafare.Perquestorispondeconunmessaggiodierrore.
Lostessovalesesitentadisommareaunalistaqualchecosachenonsiaun’altralista.Nonsipuòfareneanchequesto.Peresempio,eccochecosasuccedesetentiamodisommareilnumero50allalista1:
Perchéotteniamounerrore,inquestocaso?Beh,checosavuoldiresommare50aunalista?Significasommare50aciascunelemento?Maseglielementinonsononumeri?Significaconcatenareilnumero50allafinedellalistaoinserirlo
all’inizio?Nellaprogrammazione,icomandidevonofunzionareesattamentenellostesso
modoognivoltachelisiinserisce.Nellasua“stupidità”,ilcomputervedelecosesoloinbiancoenero.Chiedeteglidiprendereunadecisionecomplicata,eluialzalemaniedichiaraunerrore.
TUPLEUnatuplaècomeunalistacheusaleparentesitonde,comeinquestoesempio:
Quiabbiamodefinitolavariabilefibcomecontenenteinumeri0,1,1,2e3.Poi,comenelcasodiunalista,possiamostamparel’elementonellaposizionediindice3nellatuplamedianteprint(fib[3]).
Ladifferenzaprincipalefraunatuplaeunalistaècheunatuplanonpuòesseremodificata,unavoltacheèstatacreata.Peresempio,setentiamodisostituireilprimovalorenellatuplafibconilnumero4(comeabbiamosostituitovalorinellanostramago_lista),otteniamounmessaggiodierrore:
Perchémaiallorausareunatuplainvecediunalista?Fondamentalmenteperchéavoltetornacomodousarequalcosachesisachenoncambieràmai.Sesicreaunatuplacondueelementi,conterràsemprequeidueelementi.
LEMAPPEDIPYTHONNONVIAIUTERANNOATROVARELASTRADA
InPython,unamappa(qualchevoltavienechiamataanchedict,abbreviazionedidictionary,ovverodizionario)èuninsiemedicose,comelelisteeletuple;ladifferenzaècheinunamappaognielementohaunachiave(key)euncorrispondentevalore.
Peresempio,supponiamodiavereunelencodipersoneconillorosportpreferito.PotremmoinseriretuttequesteinformazioniinunalistadiPython,conilnomedellapersonaseguitodallosportpreferito,peresempioinquestomodo:
SevichiedessiqualèlosportpreferitodiRebeccaClarke,potrestescorrerelalistaetrovarelarisposta:netball.Maselalistacomprendessecentopersone(omoltedipiù)?
Seinveceinseriamolestesseinformazioniinunamappa,conilnomedellapersonacomechiaveeilsuosportpreferitocomevalore,ilcodicePythonsarebbecomequesto:
Usiamoilsegnodiduepuntiperseparareciascunachiavedalsuovalore;ciascunachiaveeciascunvaloresonoracchiusifraapicisingoli.Notate,inoltre,cheglielementidiunamappasonoracchiusifraparentesigraffe({}),nontondeoquadre.
Ilrisultatoèunamappa(ciascunachiaveviene“mappata”,ovverofattacorrispondereaunparticolarevalore),comeindicatonellaTabella3.1.
Tabella3.1.Lechiavipuntanoaivalori,inunamappadisportpreferiti.
Chiave ValoreRalphWilliams FootballMichaelTippett BasketballEdwardElgar BaseballRebeccaClarke NetballEthelSmyth BadmintonFrankBridge Rugby
Ora,perscoprirequalesialosportpreferitodiRebeccaClarke,possiamoaccedereallanostramappasport_preferitoutilizzandoilsuonomecomechiave,inquestomodo:
Elarispostaè“netball”.Percancellareunvaloreinunamappa,siusalachiavecorrispondente.Per
esempio,pereliminareEthelSmyth:
Anchepersostituireunvaloreinunamappasiusalachiavecorrispondente:
AbbiamosostituitoHockeyaFootballcomesportpreferitodiRalphWilliamsusandoilsuonomecomechiave.
Lavorareconlemappeèunpo’comelavorareconlisteetuple,manonsipossonounirelemappeconl’operatoresomma(+).Seciprovate,ricevereteunmessaggiodierrore:
Ilmessaggiodierroredicechel’operatore+nonpuòaverecomeoperandiduemappe(dict).L’unionediduemappenonhasensoperPython,perciòcomealsolitoalzalemani.
CHECOSAAVETEIMPARATOInquestocapitolo,aveteimparatocomePythonusalestringheperconservaredeltestoecomeusalisteetuplepergestirepiùelementi.Avetevistocheglielementinellelistesipossonomodificare,echesipuòaccodareunalistaaun’altra,mentreivaloriinunatuplanonsipossonomodificare.Aveteimparatoanchecomeusarelemappeperconservarevaloriidentificatidachiavi.
ROMPICAPODIPROGRAMMAZIONEQuellicheseguonosonoalcuniesperimentichepoteteprovareafaredavoi.Potetetrovarelerisposteall’indirizzohttp://python-for-kids.com/.
1.PREFERITIFateunalistadeglihobbychepreferiteedateallalistailnomedivariabilegames.Orafateunalistadeivostricibipreferitiechiamatefoodslavariabile.Accodateleduelisteedatealrisultatoilnomefavorites.Infine,stampatelavariabilefavorites.
2.CONTAREICOMBATTENTICisonotreedificicon25ninjanascostisuciascuntettoeduetunnelcon40samurainascostiinciascuno.Quantininjaequantisamuraistannoperaffrontarsiinbattaglia?(PotetefareilcalcoloconunaformulanellashelldiPython.)
3.SALUTI!Createduevariabili:unachepuntialvostrocognomeeunachepuntialvostronome.Oracreateunastringaeusateisegnapostoperstampareilvostronomecon
unmessaggio,utilizzandoquelleduevariabili,peresempio“Buonagiornata,BrandoIckett!”.
4DISEGNARECONLETARTARUGHE
InPython,unatartaruga(turtle,ininglese)èunpo’comeunatartaruganelmondoreale.Sappiamocheunatartarugaèunrettilechesispostamoltolentamenteeportalasua“casa”suldorso.NelmondodiPython,unatartarugaèunafreccinanerachesispostasulloschermo.Inrealtà,vistocheunatartarugadiPythonlasciaunatracciaspostandosisulloschermo,assomigliapiùaunachiocciolaoaunalumaca.Latartarugaèunmodoeleganteperimparareglielementifondamentalidellagraficaalcalcolatore,perciòinquestocapitolouseremounatartarugadiPythonperdisegnarelineeefiguresemplici.
USAREILMODULOTURTLEDIPYTHONUnmoduloinPythonèunmodopermettereadisposizioneunbloccodicodiceutile,chepotràessereutilizzatodaunaltroprogramma(fralealtrecose,ilmodulopuòcontenerefunzionichesipossonoimpiegareliberamente).ParleremomegliodeimodulinelCapitolo7,maintantoPythonhaunmodulospeciale,denominatoturtle,chepossiamoutilizzareperimpararecomeicomputerdisegnanoimmaginisuunoschermo.Ilmoduloturtlepermettediprogrammaregraficavettoriale,chefondamentalmentesignificasolodisegnareconlinee,puntiecurvesemplici.
Vediamocomefunzionaturtle.Innanzitutto,avviatelashelldiPythonfacendoclicsull’iconasuldesktop(oppure,seusateUbuntu,selezionateIDLEnelSoftwareCenter).Poi,diteaPythondiusarelatartarugaimportandoilmoduloturtle,inquestomodo:
L’importazionediunmodulodiceaPythonchevoleteusarlo.
NOTASeusateUbuntueaquestopuntovisipresentaunmessaggiodierrore,doveteprobabilmenteinstallaretkinter.ApriteilSoftwareCenterdiUbuntuescrivetepython-tknellacaselladiricerca.Nellafinestradovrebbeapparirelascritta“Tkinter–WritingTkApplicationswithPython”.FateclicsuInstallperinstallarequestopacchetto.
CREAREUNCANVASOracheabbiamoimportatoilmoduloturtle,dobbiamocreareuncanvas(èiltermineingleseperindicareunatela,cioèunospaziosucuidisegnare,comelateladiunpittore).Percrearlo,chiamiamolafunzionePendelmoduloturtle,checreaautomaticamenteuncanvas(vedremomegliopiùavantichecosasiaunafunzione).InseritenellashelldiPythonquantosegue:
•
•
Dovrebbecomparireunafinestravuota(ilcanvas)conunafrecciaalcentro,simileaquesta:
Lafrecciaalcentrodelloschermoèlatartarugaesì,aveteragione,nonassomigliamoltoaunatartaruga.
SelafinestraTurtleGraphicssipresentadietroquelladellaShelldiPython,potrebbedarsichenonsembrifunzionarecorrettamente.SespostateilmousesullafinestraTurtleGraphics,ilcursoresitrasformainunaclessidra:
Questopuòsuccederepervarieragioni:nonaveteavviatolashelldall’iconasuldesktop(seusateWindowsounMac),avetefattoclicsuIDLE(PythonGUI)nelmenuStartdiWindows,oppureIDLEnonèstatoinstallatocorrettamente.Provateauscireeriavviarelashelldall’iconasuldesktop.Seancoranonfunzionatuttocorrettamente,provateausarelaconsolediPythoninvecedellashell,inquestomodo:
InWindows,selezionateStart>Tuttiiprogrammi(oTutteleapp)epoi,nelgruppoPython3.5,fateclicsuPython3.5.InMacOSX,fateclicsull’iconaSpotlightnell’angolosuperioredestrodelloschermoescriveteTerminalenellacaselladiinput.Poiscrivetepythonquandosiapreilterminale.
• InUbuntu,apriteilterminaledalmenuApplicationseinseritepython.
SPOSTARELATARTARUGASiinvianoistruzioniallatartarugautilizzandolefunzionidisponibili,applicateallavariabiletappenacreata,comeabbiamousatolafunzionePennelmoduloturtle.Peresempio,l’istruzioneforwarddiceallatartarugadispostarsiinavanti.Perdireallatartarugadiavanzaredi50pixel,inseritequestocomando:
Dovrestevederequalcosadisimileaquesto:
Latartarugasièspostatainavantidi50pixel.Unpixelèunsingolopuntosulloschermo,l’elementopiùpiccolochepuòessererappresentato.Tuttoquellochevedetesulmonitordelvostrocomputerècostituitodapixel,chesonopiccolipuntiquadrati.Sepotesteingrandireilcanvaseilsegmentodisegnatodallatartaruga,potrestevederechelafrecciacherappresentailpercorsodellatartarugaèsolounaseriedipixel.Questaèsemplicegraficaalcomputer.
•••
Oraditeallatartarugadiruotareasinistradi90gradiconquestocomando:
Senonaveteancorastudiatoigradi,immaginatevidiessereinpiedialcentrodiuncerchio.
Ladirezioneincuisieterivoltiè0gradi.Seestendeteilbracciosinistro,quellisono90gradi(90°)asinistra.Seestendeteilbracciodestro,quellisono90gradi(90°)adestra.
Continuandoaprocederelungoilcerchioadestra,dalpuntoindicatodalvostrobracciodestro,180gradisonodirettamenteallevostrespalle,270gradisonoladirezioneincuipuntailvostrobracciosinistroe360gradiviriportanoalpuntodipartenza:igradivannoda0a360.Eccoquisottoigradiinuncerchiocompleto,ruotandoversodestra(insensoorario),riportatiperincrementidi45gradi.
QuandolatartarugadiPythonsigiraasinistra,sidisponeinmododapuntareversolanuovadirezione(comeaveteruotatoilvostrocorpopervederedovepuntavailvostrobraccioesteso,90gradiasinistra).
Ilcomandot.left(90)fasìchelafrecciapuntiversol’alto(datocheinizialmentepuntavaversodestra).
NOTAIlcomandot.left(90)equivaleat.right(270).Analogamente,t.right(90)equivaleat.left(270).Immaginateviilcerchioeseguitelasuacirconferenzaconigradi.
Oradisegneremounquadrato.Aggiungetequestocodiceallerighecheavetegiàinserito:
Lavostratartarugahadisegnatounquadratoeorasaràrivoltanellastessadirezionedell’inizio.
Percancellareilcanvas,scrivetereset.Questopuliscelatelaeriportalatartaruganellasuaposizioneiniziale.
Poteteusareanchelafunzioneclear,chesilimitaacancellaretuttonellafinestraelascialatartaruganellostessopuntoincuisitrova.
Sipuòfargirarelatartarugaancheadestra(right)ofarlamuoverearitroso(backward).Sipuòusareup(su)persollevarelapennadallapagina(inaltreparole,perdireallatartarugadismetteredidisegnare)edown(giù)periniziareadisegnare.Questefunzionisonoscrittenellostessomododellealtrecheabbiamogiàusato.
Proviamoafareunaltrodisegnoutilizzandoalcunidiquesticomandi.Questavolta,faremodisegnareallatartarugaduesegmenti.
Inseritequestocodice:
Comeprimacosaabbiamoreinizializzatolatelaeriportatolatartarugaalsuopuntodipartenzacont.reset();poiabbiamospostatolatartarugaall’indietrodi100pixelcont.backward(100),poiusatot.up()persollevarelapennaesmetteredidisegnare.
Poi,conilcomandot.right(90),abbiamofattoruotarelatartarugaadestradi90gradi,inmodochesiorientasseversoilbassosulloschermo,poicont.forward(20)l’abbiamofattaspostareinavantidi20pixel.Nonèstatodisegnatonullainquestopasso,perchéavevamodatoilcomandoupnellaterzariga.
Poiabbiamofattoruotarelatartarugaasinistradi90gradi,cont.left(90)inmodochefosseorientataversodestrasulloschermo;abbiamodatoilcomandodownperdireallatartarugadiriabbassarelapennaericominciareadisegnare.Infine,abbiamodisegnatounsegmentoinavanti,paralleloalprimosegmentodisegnato,cont.forward(100).Iduesegmentiparallelicheabbiamodisegnatosipresenterannocosì:
CHECOSAAVETEIMPARATOInquestocapitolo,aveteimparatocomeusareilmoduloturtlediPython.Abbiamodisegnatoalcunisemplicisegmentidiretta,utilizzandoicomandileft(sinistra)eright(destra),forward(avanti)ebackward(indietro).Avetevistocomedireallatartarugadinondisegnare,conilcomandoup(su)ediricominciareadisegnare,conilcomandodown(giù).Aveteanchescopertochelatartarugasigirapergradi.
ROMPICAPODIPROGRAMMAZIONEProvateadisegnareconlatartarugaqualcunadelleformeseguenti.Potetetrovarelerisposteall’indirizzohttp://python-for-kids.com/.
1.UNRETTANGOLOCreateunnuovocanvasconlafunzionePendelmoduloturtleepoidisegnateunrettangolo.
2.UNTRIANGOLOCreateunaltrocanvasequestavoltadisegnateuntriangolo.Riguardateildiagrammadelcerchiosucuiavevamoriportatoigradi(apagina48)perstabilireinqualedirezionefarruotarelatartarugautilizzandoigradi.
3.UNRIQUADROSENZAANGOLI
Scriveteunprogrammachedisegniiquattrosegmentimostratiqui(nonsonoimportantiledimensioni,quellochecontaèlaforma):
5PORREDOMANDECONIFEELSE
Nellaprogrammazione,sipongonospessodomandeacuisipuòrispondereconunsìounno,esidecidedifarequalcosaasecondadellarisposta.Peresempio,potremmochiedervi:“Avetepiùdi20anni?”e,selarispostafossesì,risponderviconun“Sietetroppovecchi!”.Questitipididomandesidefinisconocondizioniecondizionierispostesicombinanoinenunciatiif(ininglese,ifcorrispondealnostrose).Lecondizionipossonoesserepiùcomplessediunasingoladomandaeglienunciatiifsipossonocombinareconpiùdomandeedifferentidecisioniasecondadellarispostaaciascunadomanda.
Inquestocapitolo,vedremocomeusareglienunciatiifnellacostruzionediprogrammi.
ENUNCIATIIFUnenunciatoifpuòesserescrittoinPythoninquestomodo:
Unenunciatoifècostituitodallaparolachiaveif,seguitadaunacondizioneedaunsegnodiduepunti(:),comeinifetà>20:.Lerighecheseguonoiduepuntidevonoessereinunbloccoe,selarispostaalladomandaèsì(overo,comesidicedisolitoquandosiprogrammainPython),icomandipresentinelbloccovengonoeseguiti.Ora,esploriamocomescrivereblocchiecondizioni.
UNBLOCCOÈUNGRUPPODIENUNCIATIDIPROGRAMMAZIONEUnbloccodicodiceèuninsiemedienunciatidiprogrammazioneraggruppati.Peresempio,seifetà>20:èvero,potrestevolerefarequalcosadipiùchestamparesemplicementelafrase“Seitroppovecchio!”.Potresteperesempiostamparequalchealtrafraseopportuna,comeinquestocaso:
Questobloccodicodiceècostituitodatreenunciatiprintchevengonoeseguitisoloselacondizioneetà>20èvera.Ciascunariganelbloccoiniziaconquattrospazi,selaconfrontateconl’enunciatoifprecedente.Riguardiamoilcodice,questavoltavisualizzandoglispazi:
InPython,lospaziobianco(whitespace),peresempiounatabulazione(chesiinseriscepremendoiltastoTAB)ounospazio(inseritoquandosipremelabarraspaziatrice),èdotatodisignificato.Ilcodicechesitrovanellastessaposizione(rientratodellostessonumerodispazirispettoalmarginesinistro)èraggruppatoinunbloccoe,ognivoltachesiiniziaunanuovarigaconpiùspazidellaprecedente,siiniziaunnuovobloccochefapartedelprecedente,inquestomodo:
Siraggruppanoenunciatiinblocchiperchésonoinrelazionefraloroedevonoessereeseguitiinsieme.
Quandosicambiailrientro(ingergosichiamaancheindentazione),ingeneresicreanonuoviblocchi.L’esempioseguentemostratreblocchiseparatichevengonocreatisemplicementemodificandoilrientro.
Qui,ancheseiblocchi2e3hannolostessorientro,sonoconsideratiblocchidiversiperchéinmezzovièunbloccoconunrientrominore(menospazibianchiiniziali).
Unbloccoconquattrospaziinunarigaeseinellasuccessivagenereràunerrore(indentationerror),quandolosiesegue,perchéPythonsiaspettachevengausatolostessonumerodispazipertuttelerighediunblocco.Così,seiniziateunbloccoconquattrospazi,doveteusaresemprequattrospaziperquelblocco.Eccounesempio:
Horesovisibiliglispaziinmodochepossiatevedereledifferenze:notatechelaterzarigahaseispazienonquattro.
Quandosiprovaaeseguirequestocodice,IDLEevidenziaconunrettangolorossolarigaincuivedeunproblemaemostraunmessaggioSyntaxErrorconlaspiegazione(unexpectedindent,ovvero“rientroinatteso”):
Pythonnonsiaspettavadivedereduespaziinpiùall’iniziodellasecondarigaprint.
NOTAL’usodispazicoerentirendepiùfacilelaletturadelcodice.Secominciateascrivereunprogrammaeinseritequattrospaziall’iniziodiunblocco,continuateausarequattrospaziall’iniziodeglialtriblocchi.Inoltre,fateattenzionearientrareognirigadiunostessobloccoconlostessonumerodispazi.
LECONDIZIONIAIUTANOAFARECONFRONTIUnacondizioneèunenunciatocheconfrontacoseecidiceseciòcheèindicatonelconfrontoèTrue(vero,sì)oppureFalse(falso,no).Peresempio,età>10èunacondizione,edèunmodoperchiedere“Ilvaloredellavariabileetàèmaggioredi10?”.Anchequestaèunacondizione:colore_capelli=='rosso',ovvero:“Ilvaloredellavariabilecolore_capellièrosso?”.
InPythonusiamodeisimboli(chiamatioperatori)percrearelecondizioni,come“maggioredi”,“ugualea”,“minoredi”.LaTabella5.1elencaalcunidiquestisimboli.
Tabella5.1Simboliperlecondizioni.
Simbolo Definizione== Ugualea!= Nonugualea(diversoda)> Maggioredi< Minoredi>= Maggioreougualea<= Minoreougualea
Peresempio,seavete10anni,lacondizionetua_età==10restituirebbeTrue;altrimentirestituirebbeFalse.Seavete12anni,lacondizionetua_età>10restituirebbeTrue.
ATTENTIStateattentiausareundoppiosegnodiuguale(==)quandodefiniteunacondizione“ugualea”.
Vediamoqualchealtroesempio.Qui,poniamolavostraetàa10anniepoiscriviamounenunciatocondizionalechestamperà“Seitroppovecchioperlemiebattute!”sel’etàèmaggioredi10.
ChecosasuccedequandoloscriviamoinIDLEepoipremiamoINVIO?
Niente,perchéilvaloredellavariabileetànonèmaggioredi10,quindiPythonnonesegueilbloccoprint.Seavessimoinveceimpostatolavariabileetàalvalore20,ilmessaggiosarebbestatostampato.
Oracambiamol’esempioprecedenteutilizzandounacondizione“maggioreougualea”(>=):
Questavoltavedretestampato“Seitroppovecchioperlemiebattute!”sulloschermo,perchéilvaloredellavariabileetàèugualea10.
Oraproviamoutilizzandounacondizione“ugualea”(==);
Questavoltailmessaggiocompariràsulloschermo.
ENUNCIATIIF-THEN-ELSE
Oltreausareenunciatiifperfarequalcosaquandovienesoddisfatta(èTrue)unacondizione,possiamousarliancheperfarequalcosaquandounacondizionenonèvera.Peresempio,potremmostamparesulloschermounmessaggiosel’etàè12(True)eunaltrosenonè12(False).Iltruccostanell’usareunenunciatoif-then-else(se-allora-altrimenti),chesostanzialmentedice:“Se(if)unacertacosaèvera,allora(then)faquesto;altrimenti(else)faiquest’altro”.
Creiamounenunciatoif-then-else.Scrivetequantoseguenellashell:
Datocheabbiamoimpostatolavariabileetàalvalore12elacondizionechiedesel’etàsiaugualea12,dovrestevederesulloschermoilmessaggiodelprimoprint.Oraprovateacambiareilvaloredell’etàinunnumerodiversoda12,peresempio:
Questavoltavedretestampatoilsecondomessaggio.
ENUNCIATIIFEDELIFPossiamoestendereulteriormenteunenunciatoifconelif(cheèunaabbreviazionedielse-if,“altrimenti-se”).Peresempio,possiamocontrollaresel’etàdiunapersonaè10,11o12anni(ecosìvia)efareinmodocheilprogrammafacciaqualcosadidiversoasecondadellarisposta.Questienunciatisonodiversidagliif-then-else,perchépossonoessercipiùelifnellostessoenunciato:
Inquestoesempio,l’enunciatoifnellasecondarigacontrollaseilvaloredellavariabileetàèugualea10in 1 .L’enunciatoprintcheseguein 2 vieneeseguitoseetàèugualea10.Però,poichéabbiamoattribuitoaetàilvalore12,ilcomputersaltaalsuccessivoenunciatoifin 3 econtrollaseilvaloredietàèugualea11.Nonloè,perciòsaltaalsuccessivoenunciatoifin 4 evedeseetàèugualea12.Loè,perciòquestavoltaesegueilcomandoprintin 5 .
QuandoinseritequestocodiceinIDLE,vieneautomaticamenterientrato,perciòricordatedipremereiltastoCANCoilBACKSPACEdopoaverscrittoglienunciatiprint,inmodochegliif,elifedelseinizinodalmarginesinistro.Questaèlastessaposizioneincuisarebbel’enunciatoifsenoncifosseilprompt(>>>).
COMBINARELECONDIZIONILecondizionisipossonocombinareutilizzandoleparolechiaveandeor(che
corrispondonorispettivamenteallacongiunzione“e”ealladisgiunzione“o”):cosìilcodicepuòesserepiùbreveepiùsemplice.Eccounesempioconor:
Inquestocodice,seunaqualsiasidellecondizioninellaprimarigaèvera(inaltreparole,selavariabileetàhavalore10,11,12o13),vieneeseguitoilbloccodicodicecheiniziaconprintnellarigasuccessiva.Senessunadellecondizioninellaprimarigaèvera(else),Pythonpassaalbloccodell’ultimariga,evisualizzasulloschermoCosa?.
Percompattaredipiù,potremmousareandeglioperatori“maggioreougualea”(>=)e“minoreougualea”(<=):
Qui,seetàèmaggioreougualea10e(and)minoreougualea13(condizionedefinitanellaprimarigaconl’enunciatoifetà>=10andetà<=13:),vieneeseguitoilbloccodicodicecheiniziaconprintsullarigasuccessiva.Peresempio,seilvaloredietàè12,verràstampatosulloschermoCosafa13+49+84+155+97?Unmalditesta!,perché12èmaggioredi10eminoredi13.
VARIABILISENZAVALORE:NONEAunavariabile,comeabbiamovisto,sipossonoassegnarevalori,stringheeliste,masipuòancheassegnareunvalorevuoto,nullo.InPythonunvalorevuotoèindicatocomeNone(“niente”),eindical’assenzadivalore.ÈimportantenotarecheilvaloreNoneèdiversodalvalore0perchéindical’assenzadiunvalore,nonunnumeroconvalore0.L’unicovalorecheunavariabilehaquandolesiassegnailvalorevuotoNoneè…niente.Eccounesempio:
AssegnareunvaloreNoneaunavariabileèunmodoperdirechequellavariabilenoncontienepiùalcunvalore(omeglio,chenonèpiùl’etichettadiunvalore).ImpostareunavariabileaNoneèancheunmodoperdefinireunavariabilesenzaindicarneilvalore.Losipuòfarequandosisachesiavràbisognodiunavariabileinseguitonelcorsodelprogramma,masivuoledefinireinizialmentetuttelevariabili.Iprogrammatoridefinisconospessolelorovariabiliall’iniziodiunprogrammaperché,collocateinquellaposizione,èfacilevedereinomidituttelevariabiliutilizzateinuncertoframmentodicodice.
Sipuòanchecontrollareseunavariabilenonhavaloreinunenunciatoif,comeinquestoesempio:
Un’istruzionedelgenereèutilequandosivuolecalcolareunvaloreperunavariabilesolosenonèstatogiàcalcolato.
LADIFFERENZAFRASTRINGHEENUMERIInputdell’utenteèquellocheunapersonascriveallatastiera–nonimportasesitrattadiuncarattere,dellapressionediuntastofrecciaodiINVIOodiqualsiasialtracosa.
L’inputdell’utentevienerecepitodaPythoncomeunastringa,ilchesignificache,sescrivetesullatastierailnumero10,Pythonsalvail10inunavariabilecomestringaenoncomenumero.
Qualèladifferenzafrailnumero10elastringa'10'?Anoisembranolastessacosa,conl’unicadifferenzachelasecondaèracchiusafraapici.Peruncomputer,però,sitrattadiduecosemoltodiverse.
Peresempio,supponiamodiconfrontareilvaloredellavariabileetàconunnumeroinunenunciatoif:
Poiimpostiamolavariabileetàalnumero10:
Comepotetevedere,l’enunciatoprintvieneeseguito.Oraimpostiamolavariabileetàallastringa'10'(congliapici),inquestomodo:
Orailcodicenell’enunciatoprintnonvieneeseguito,perchéPythonnonvedeilnumerofraapici(unastringa)comeunnumero.Perfortuna,Pythonpossiedealcunefunzionimagichechetrasformanostringheinnumerienumeriinstringhe.Peresempio,sipuòconvertirelastringa'10'inunnumeroconlafunzioneint:
Lavariabileetà_convertitaoracontieneilnumero10.Perconvertireunnumeroinunastringasiusainvecelafunzionestr:
Inquestocaso,età_convertitaconterràlastringa'10'anzichéilnumero10.Ricordatechel’enunciatoifetà==10nonhastampatonullaquandolavariabile
avevacomevaloreunastringa(età='10')?Seperòprimaconvertiamolavariabile,otteniamounrisultatodeltuttodiverso:
Mafateattenzione:setentatediconvertireunnumerodecimale,otterreteunerrore,perchélafunzioneintsiaspettaunintero:
ValueErrorèilmodocheusaPythonperdirvicheilvalorecheavetetentatodiutilizzarenonèappropriato.Incasidelgeneredoveteusarelafunzionefloatalpostodiint.Lafunzionefloatpuòtrattarenumerichenonsonointeri.
OtterreteunValueErroranchesetentatediconvertireincifreunastringachenoncontieneunnumero:
CHECOSAAVETEIMPARATOInquestocapitolo,aveteimparatocomelavorareconglienunciatiifpercreareblocchidicodicechevengonoeseguitisoloquandodeterminatecondizionisonovere.Avetevistocomeestendereglienunciatiifconelifinmododaeseguiresezionidiversedicodiceasecondadelrisultatodicondizionidiverse,ecomeusarelaparolachiaveelsepereseguiredelcodicequandonessunadellecondizionirisultavera.Aveteimparatoancheacombinarecondizioniutilizzandoleparolechiaveandeor,inmododavedereperesempioseunnumeroricadeentrouncertointervallo,ecometrasformarestringheinnumeri(eviceversa)conint,strefloat.Eavetescopertocheilnulla(None)haunsignificatoinPythonepuòessereutilizzatoperriportarelevariabiliallorostatoiniziale,vuoto.
ROMPICAPODIPROGRAMMAZIONEProvatearisolverequestirompicapoutilizzandol’enunciatoifelecondizioni.Potetetrovarelerisposteall’indirizzohttp://python-for-kids.com/.
1.SEIRICCO?Checosapensatechefaccia,ilcodiceseguente?Provateadareunarispostasenzascriverlonellashell,poicontrollatelavostrarisposta.
2.TWINKIES!CreateunenunciatoifcheverifichiseilnumerodiTwinkies(nellavariabiletwinkies)èminoredi100omaggioredi500.Ilprogrammadovràstampareilmessaggio“Troppopochiotroppotanti”selacondizioneèvera.(ChecosasonoiTwinkies?Dateglivoiunsignificato…)
3.ILNUMEROGIUSTOCreateunenunciatoifcheverifichiselaquantitàcontenutanellavariabiledenarosiacompresafra100e500ofra1000e5000.
4.POSSOCOMBATTERECONTROININJACreateunenunciatoifchestampilastringa“Sonotroppi”selavariabileninjacontieneunnumerominoredi50,stampi“Saràunabellalotta,mapossofarcela”,seilvaloreèinferiorea30estampi“Possocombatterecontroqueininja!”seèinferiorea10.Poteteprovareilvostrocodicecon:
6GIRAREINTONDO
Nonc’ènientedipeggiochedoverfarelastessacosapiùepiùvolte.C’èunmotivopercuiqualcunosimetteacontarelepecorequandohadifficoltàadaddormentarsienonhanullaachefareconsuppostedoti“dormitive”diquestiovini:èperchéripeteresenzafinequalchecosaènoioso,elanostramentepuòcaderenelsonnopiùfacilmentesenoncisiconcentrasuqualcosadiinteressante.
Neancheiprogrammatoriamanoparticolarmenteripetersi,amenochenonstianocercandodiaddormentarsi.Perfortuna,lamaggiorpartedeilinguaggidiprogrammazionemetteadisposizionequellocheèchiamatociclofor(forèl’equivalentedell’italiano“per”),cheripetealtrienunciatieblocchidicodiceautomaticamente.
Inquestocapitolo,vedremoicicliforeunaltrotipodiciclochecimetteadisposizionePython:ilciclowhile(parolachecorrispondeall’italiano“mentre”).
USAREICICLIFORPerstamparecinquevolte“ciao”inPython,sipotrebbescrivere:
Sarebbeunpo’noioso.Sipuòusareuncicloforperscriveredimenoeridurreleripetizioni,inquestomodo:
••
Lafunzionerange(intervallo)in 1 siusapercreareunelencodinumerichevannodaquelloinizialefinoaquellocheprecedeilnumerofinale.Puòsembrareunpo’confuso.Combiniamolafunzionerangeconlafunzionelistpervedereesattamentecomefunziona.Lafunzionerangenoncreainrealtàunalistadinumeri,marestituisceuniteratore,cheèuntipodioggettoPythonprogettatospecificamenteperlavorareconicicli.Seperòcombiniamorangeconlist,otteniamounalistadinumeri.
Nelcasodelciclofor,ilcodicenellariga 1 diceinsostanzaaPythondifarequantosegue:
Iniziaacontareda0efermatiprimadiraggiungere5.Perogninumerocheconti,immagazzinailvalorenellavariabilex.
PoiPythonesegueilbloccodicodicein 2 .Notatechecisonoquattrospaziaggiuntiviall’iniziodellariga 2 (rispettoallariga1 ).IDLEhaautomaticamenterientratoquestoblocco.QuandopremiamoINVIOdopolasecondariga,Pythonstampa“ciao”cinque
volte.Potremmoancheusarelaxnell’enunciatoprintpercontarei“ciao”:
Senonavessimousatoilciclofor,ilnostrocodiceavrebbedovutoesserequalcosadiquestogenere:
L’usodelcicloperciòcihaevitatodiscrivereottorigheulterioridicodice.Ibuoniprogrammatoriodianofarelecosepiùdiunavolta,perciòilcicloforèunodeglienunciatipiùutilizzatiinunlinguaggiodiprogrammazione.
Nonènecessariousaresololefunzionirangeelistpercreareciclifor.Poteteusareancheunalistagiàcreata,comelalistadellaspesadelCapitolo3,inquestomodo:
Questocodicesignifica“Perognielementopresentenellamago_lista,memorizzaquelvalorenellavariabilei,poistampaicontenutidiquellavariabile”.Ancheinquestocaso,sevolessimofareamenodelciclofor,dovremmofarequalcosadiquestogenere:
Ancoraunavolta,quindi,ilciclociharisparmiatounbelpo’dilavoro.Proviamoacreareunaltrociclo.Scriveteilcodiceseguentenellashell(il
rientrosaràautomatico):
Nellaprimariga 1 ,abbiamocreatounalistacontenenteleparole'grandi','pantaloni'e'pelosi'.Nellarigasuccessiva, 2 ,abbiamoimpostatounciclochepercorreglielementidellalista,assegnandociascunelementoallavariabilei.Poiabbiamostampatoduevolteicontenutidellavariabile,nelleduerighesuccessive( 3e 4 ).PremendoINVIOsullasuccessivarigavuota 5 ,abbiamodettoaPythoncheilbloccoeracompleto;ilcodiceèstatoeseguitoeciascunelementodellalistaèstatostampatoduevoltein 6 .
Ricordateche,seinseriteunnumeroerratodispaziainizioriga,viritrovereteconunmessaggiodierrore.Seavesteinseritoilcodiceprecedenteconunospazioinpiùsullaquartariga 4 ,Pythonavrebbevisualizzatounerroredirientro(unexpectedindent):
ComeabbiamovistonelCapitolo5,Pythonsiaspettacheilnumerodeglispaziinunbloccosiasemprelostesso.Nonimportaquantispaziinserite,purchésianosemprenellostessonumeroinogniriga(ilcherendeanchepiùfacileleggereilcodice,pergliesseriumani).
Eccounesempiopiùcomplicatodiuncicloforcondueblocchidicodice:
Dovesonoiblocchiinquestocodice?Ilprimobloccoèilprimociclofor:
Ilsecondobloccoècostituitodallasingolarigaprintnelsecondociclofor:
Riusciteaimmaginarechecosacombineràquestopiccoloframmentodicodice?Dopocheèstatacreataunalistaconilnomegrandipantalonipelosiin 1 ,dalledue
righesuccessivepossiamocapirechePythonpercorreràincicloglielementidellalistaestamperàciascunodiessi.In 2 ,però,deveeffettuareunaltrocicloattraversolalista,questavoltaassegnandoilvaloreallavariabilej,poistamperàdinuovociascunelemento,comeprevistodallariga 3 .Ilcodicein 2 e 3 èsemprepartedelprimociclofor,ilchesignificacheverràeseguitoperciascunelementodellalista,
nelprocederedelprimocicloforbasatosullavariabilei.Quandoilcodicevieneeseguito,quindi,dovremmovederegrandiseguitoda
grandi,pantaloni,pelosiepoipantaloniseguitodagrandi,pantaloni,pelosiecosìvia.InseriteilcodicenellashelldiPythonevedeteloconivostriocchi:
Pythonentranelprimocicloestampaunelementodellalistain 1 .Poientranelsecondocicloestampatuttiglielementidellalistain 2 .Poicontinuaconilcomandoprint(i),stampandol’elementosuccessivodellalista,quindistampadinuovotuttalalistaconprint(j).Nell’output,lerigheevidenziateconilsimbolovengonostampatedall’enunciatoprint(i),lealtredaprint(j).
Cheneditediqualcosadipiùutilechestampareparolestupide?RicordateilcalcolocheabbiamofattonelCapitolo2persaperequantemoneted’oroavresteavutoallafinedell’annograzieallafolleinvenzionedelnonnocheduplicamonete?Eraquesto:
Ovvero:20monetetrovate,più10monetemagichealgiornoper365giorniinunanno,meno3moneteallasettimanarubatedalcorvo.
Potrebbeessereutilevederecomeilvostromucchiettodimoneted’oroaumentiognisettimana.Possiamofarloconunaltrociclofor,maprimadobbiamocambiareilvaloredellenostremonete_magiche,inmodocherappresentiilnumerototaledimonetemagichepersettimana,cioè10monetemagichealgiornoper7giorniallasettimana.Quindimonete_magichedeveessere70:
Possiamovederecrescereilnostrotesoroognisettimanacreandoun’altravariabile,chepossiamochiamaremonete,eusandounciclo:
In 1 ,allavariabilemonetevieneassegnatoilvaloredellavariabilemonete_trovate:questoèilnumerodipartenza.Larigasuccessiva, 2 ,impostailciclofor,cheeseguiràicomandinelblocco(costituitodallerighe 3 e 4 ).Ognivoltachevieneeseguitoilciclo,lavariabileassumecomevaloreilnumerosuccessivonell’intervallofra1e52.
Larigain 3 èunpo’piùcomplicata.Fondamentalmente,ognisettimanavogliamoaggiungereilnumerodellemonetecheabbiamocreatomagicamenteesottrarreilnumerodellemoneterubatedalcorvo.Potetepensarelavariabilemonetecomeilvostroforziere.Ognisettimana,lenuovemonetevannoafinirenelforziere.Quindiquestarigasignifica“Sostituisciicontenutidellavariabilemoneteconilnumerodellemonetecheavevo,piùquellechehocreatoquestasettimana”.Fondamentalmente,ilsegno(=)èunasortadicomando,chedice“Faituttoquellochetivienechiestoadestra,poisalvaloperilseguito,usandoilnomequiasinistra”.
Lariga 4 èunenunciatoprintcheusadeisegnapostoestampailnumerodellasettimanaeilnumerototaledellemoneteaccumulatefinoaquelmomento.(Setuttoquestononhamoltosensopervoi,rileggete“Incorporarevalorinellestringhe”apagina30.)Seeseguiteilprogramma,vedretequestorisultato:
APROPOSITODICICLI…Unciclofornonèl’unicotipodiciclochesipuòcreareinPython.Esisteancheilciclowhile.Uncicloforèunciclodilunghezzaspecifica,mentrewhileèunciclousatoquandononsisainanticipoachepuntolaripetizionedeveterminare.
Immaginateviunascalacon20gradini:èdentrocasaesapetedipotersalirefacilmente.Uncicloforèdiquestotipo.
Oraimmaginateunascalachesalelungounamontagna.Lamontagnaèalta,epotresteesaurireleforzeprimadiraggiungerelacima,oiltempopotrebbemettersialbrutto,costringendoviafermarvi.Questaèl’ideadelciclowhile.
1.2.3.
Seprovateainserireeaeseguirequestocodice,otterreteunmessaggiodierrore.Perché?Perchénonabbiamocreatolevariabilistancoecattivotempo.Anchesequinonc’èabbastanzacodiceperfarneunprogrammafunzionante,questoèunesempioelementarediunciclowhile.
Iniziamocreandounavariabilechiamatagradinocongradino=0.Poi,creiamounciclowhilechecontrollaseilvaloredellavariabilegradinoèinferiorea10.000(gradino<10000),cheèilnumerototaledeigradinidallabasedellamontagnafinoallacima.Finchégradinoèminoredi10.000,Pythoncontinueràaeseguireilrestodelcodice.
Conprint(gradino),stampiamoilvaloredellavariabileepoicontrolliamosestancoèTrueconifstanco==True.(Trueèun“valorebooleano”,espressionechechiariremonelCapitolo8.)Seloè,usiamolaparolachiavebreak(equivalea“interrompi”)perusciredalciclo.Laparolachiavebreakèunmodoperusciredaunciclo(inaltreparole,interromperlo),efunzionasiapericicliwhilecheperquellifor.Quihal’effettodifarciusciredalbloccoedipassareaglienunciatichepotrebberocompariredopolarigagradino=gradino+1.
Larigaelifcattivotempo==True:controllaselavariabilecattivotempoabbiailvaloreTrue.Secosìè,breakfausciredalciclo.SenéstanconécattivotemposonoTrue(casoelse),sommiamo1alvaloredellavariabilegradino,conl’enunciatogradino=gradino+1,eilciclocontinua.
Quindiipassidiunciclowhilesonoiseguenti:
Controllalacondizione.Eseguiilcodicenelblocco.Ripeti.
Piùspesso,unciclowhilevienecreatoconunacoppiadicondizioni,invececheconunasola,comeinquestoesempio:
Quiabbiamocreatounavariabilexconilvalore45in 1 eunavariabileyconvalore80in 2 .Ilciclocontrollaleduecondizioniin 3 :secioèxèminoredi50eseyèminoredi100.
Finchéentrambelecondizionisonovere,vengonoeseguitelerigheseguenti,incuisisomma1aentrambelevariabiliepoilesistampa.Eccol’outputprodottodaquestocodice:
Riusciteastabilirecomefunziona?Iniziamoacontareda45perlavariabilexeda80perlavariabiley,poi
incrementiamo(sommiamo1)ciascunavariabileognivoltachevieneeseguitoilcodicenelciclo.Ilcicloandràavantifinchéxèminoredi50eyèminoredi100.Dopocinquepassagginelciclo(ognivoltaaciascunavariabilevienesommato1),ilvaloreinxraggiunge50.Oralaprimacondizione(x<50)nonèpiùvera,perciòPythonsadidoverporreterminealciclo.
Unaltrousocomunediunciclowhileèlacreazionedicicli“quasieterni”.Sonociclichepotrebberocontinuareall’infinito,mainrealtàcontinuanofinchénonsuccedequalcosanelcodicecheliinterrompe.Eccounesempio:
LacondizionedelciclowhileèsemplicementeTrue,cheèsemprevera,perciòilcodicenelbloccocontinueràaessereeseguito(inquestosenso,ilcicloèeterno).Pythonescedalciclosoloselavariabilequalche_valoreèvera.Potetevedereunesempiomigliorediquestoin“Usarerandintperscegliereunnumeroacaso”apagina134,maforseèmegliocheaspettiatediaverlettoilCapitolo7.
CHECOSAAVETEIMPARATOInquestocapitolo,abbiamousatoiciclipereseguireattivitàripetitivesenzadoverciripetere.AbbiamodettoaPythonchecosavolevamofosseripetutoscrivendolerelativeattivitàall’internodiblocchidicodice,cheabbiamoinseritoall’internodicicli.Abbiamousatoduetipidicicli:forewhile,chesonosimilimasipossonousareinmodidiversi.Abbiamousatoanchelaparolachiavebreakperinterrompereicicli,cioèperusciredaunciclo.
ROMPICAPODIPROGRAMMAZIONEEccoqualcheesempiodiciclochepoteteprovareacostruirevoistessi.Lerispostesipossonotrovareall’indirizzohttp://python-for-kids.com/.
1.ILCICLO“CIAO”Checosapensatechefacciailcodiceseguente?Primaprovateadarrivarciragionando,poiscriveteilcodiceinPythonedeseguitelo,pervedereseavevateragione.
2.NUMERIPARICreateunciclochestampiinumeriparifinchénonraggiungeilnumerocorrispondenteallavostraetàoppure,selavostraetàèunnumerodispari,chestampiinumeridisparifinchénonraggiungelavostraetà.Peresempio,potrebbestampareunacosacomequesta:
3.ICINQUEINGREDIENTIPREFERITICreateunalistachecontengacinquediversiingredientiperunbuonpanino,peresempio:
Oracreateunciclochestampilalista(compresiinumeri):
4.ILPESOSULLALUNASeinquestomomentovitrovastesullaLuna,ilvostropesosarebbeparial16,5percentodiquellocheèsullaTerra.Potetecalcolarlomoltiplicandoilvostropesoterrestreper0,165.
Seilvostropesoaumentassediunchilogrammoogniannoneiprossimi15anni,qualesarebbeilvostropesosevisitastelaLunaogniannoeallafinedei15anni?Scriveteunprogrammacheusiuncicloforestampiilvostropesolunareperciascunanno.
7RICICLAREILCODICECONFUNZIONI
EMODULI
Pensatequantecosebuttateviaognigiorno:bottigliedell’acqua,lattine,confezionidipatatine,incartidipanini,sacchettichecontenevanofilettidicarotaofettedimela,borsedellaspesa,giornali,rivisteecosìvia.Oraimmaginatechecosasuccederebbesetuttaquellaspazzaturavenisseammonticchiatadavantiall’ingressodicasavostra,senzasepararecarta,plastica,lattineevetro.
Ovviamente,probabilmentericiclateilpiùpossibile,cheèunabuonacosa,perchénessunovorrebbescalareunamontagnadispazzaturasullastradaperandareascuola.Anzichéstarseneinun’enormepilaallarinfusa,lebottigliedivetrochericiclatevengonofuseetrasformateinnuovicontenitorienuovebottiglie;lacartavienemacerataetrasformataincartariciclata;laplasticavienetrasformatainaltrioggettidiplastica.Cosìriusiamocosechealtrimentibutteremmosemplicementevia.
Nelmondodellaprogrammazione,ilriusoèaltrettantoimportante.Ovviamente,ilvostroprogrammanonscompariràsottounamontagnadirifiuti,masenonriusatequalcosadiquellochefate,allafineleditavisiridurrannoamoncherinidolorantiafuriadiscriverecodice.Latecnicadelriusoinoltrerendeilcodicepiùbreveepiùfaciledaleggere.
USARELEFUNZIONIAbbiamogiàvistounodeimodiperriciclarecodiceinPython.Nelcapitoloprecedente,abbiamousatolefunzionirangeelistperfar“contare”Python.
Sesapetecontare,nonèdifficilecreareunalistadinumericonsecutiviscrivendolidirettamente,ma,piùlungaèlalista,piùdovretescrivere.Invece,seusatelefunzioni,potetecreareconlamassimafacilitàancheunalistadimigliaiadinumeri.Eccounesempiocheusalefunzionilisterangeperprodurreunalistadinumeri:
LefunzionisonopezzidicodicechediconoaPythondifarequalcosa.Sonounmodoperriusareilcodice:poteteusarelefunzionimoltevolteall’internodeivostriprogrammi.
Quandoscriveteprogrammisemplici,lefunzionisonocomode;quandocomincereteascrivereprogrammilunghiepiùcomplessi,comeigiochi,lefunzionidiventanoessenziali(immaginandochevogliatefinirediscrivereilvostroprogrammaentroquestosecolo).
PARTIDIUNAFUNZIONEUnafunzionehatreparti:unnome,parametrieuncorpo.Eccounesempiodiunafunzionesemplice:
Ilnomediquestafunzioneèfunzprova.Haununicoparametro,mionome,eilsuocorpoèilbloccodicodicechesegueimmediatamentelarigacheiniziacondef(abbreviazionedidefine,definisci).
Unparametroèunavariabilecheesistesoloquandovieneusataunafunzione.Poteteeseguirelafunzionechiamandoneilnome,racchiudendopoifraparentesi
ilvaloredelparametro:
Unafunzionepuòaveredue,treounnumeroqualsiasidiparametri,nonunosolamente:
Iduevaloriperquestiparametridevonoessereseparatidaunavirgola:
Potremmoanchecreareprimadellevariabiliechiamarepoilafunzioneconquellevariabili:
Siusaspessounafunzioneperaverediritornounvalore,attraversounenunciatoreturn.Peresempio,potrestescrivereunafunzionechecalcoliquantisoldiaveterisparmiato:
Questafunzioneprendetreparametri:sommaiprimidue(paghettaemancia)esottrael’ultimo(spese).Ilrisultatovienerestituitoepuòessereassegnatoaunavariabile(analogamenteacomeabbiamoassegnatovaloriallevariabiliinaltricasi)oppurestampato:
VARIABILIEAMBITOUnavariabilechesitrovaall’internodelcorpodiunafunzionenonpuòessereusatanuovamente,unavoltaterminatal’esecuzionedellafunzione,perchéesistesoloalsuointerno.Nelmondodellaprogrammazione,sidicechequelloèilsuoambito(scope,ininglese).
Vediamounafunzionecheusaunpaiodivariabilimanonhaalcunparametro:
Inquestoesempio,in 1 abbiamocreatounafunzionechesichiamatest_variabile,chemoltiplicaduevariabili(prima_vareseconda_var)erestituisceilrisultatoin 2 .
Sechiamiamoquestafunzioneutilizzandoprint,otteniamoilrisultato:200.Seperòtentiamodistampareicontenutidiprima_var(odiseconda_var,pocoimporta)all’esternodelbloccodicodicedellafunzione,otteniamounmessaggiodierrore:
Seunavariabileèdefinitaall’esternodellafunzione,haunambitodiverso.Peresempio,definiamounavariabileprimadicrearelafunzione,poicerchiamodiusarladentrolafunzione:
Inquestocaso,ancheselevariabiliprima_vareseconda_varnonpossonoessereusateall’esternodellafunzione,altra_var(cheèstatacreataesternamenteallafunzionein1 )puòessereutilizzataalsuointerno,in 2 .Eccoilrisultatochesiottienechiamandoquestafunzione:
Ora,supponiamochevogliatecostruireunanavicellaspazialeconqualchematerialeeconomico,peresempiolattineusate.Pensatedipoterappiattire2lattineasettimanapercrearelepareticurvedellanavicella,maperfinirelafusolieraviserviranno500lattine.Possiamoscriverefacilmenteunafunzionechecipermettadicalcolarequantocivorràperlavorare500lattine,sepossiamolavorare2lattineasettimana.
Creiamounafunzionechemostriquantelattineabbiamoappiattitoinunanno(52settimane).Lanostrafunzioneprenderàcomeparametroilnumerodellelattine:
Nellaprimarigadellafunzione,abbiamocreatounavariabile,totale_lattine,eabbiamoimpostatoilsuovalorea0.Poiabbiamocreatouncicloperlesettimanedell’annoesommatoognisettimanailnumerodellelattinelavorate.Questobloccodicodicecostituisceilcontenutodellanostrafunzione.Inquestafunzioneperòc’èancheunaltrobloccodicodice:leultimeduerighe,chesonoilbloccodelciclofor.
Proviamoainserirequestafunzionenellashelleachiamarlaconvaloridiversiperilnumerodellelattine:
Questafunzionepuòessereriutilizzataconvaloridiversiperilnumerodellelattinelavorateognisettimana,ilcheèunpo’piùefficientechedoverriscrivereilcicloforognivoltachesivuoleprovarelafunzioneconunnumerodiverso.
Lefunzionipossonoancheessereraggruppateinmoduli:edèquichePythondiventadavveromoltoutile.
USAREIMODULIImoduliraggruppanofunzioni,variabiliealtroancora,utilizzabiliperscrivereprogrammipiùgrandiepiùpotenti.AlcunimodulisonogiàincorporatiinPython;altrisipossonoscaricareseparatamente.Vedretebenel’utilitàdeimoduli(cometkinter,incorporato,ePyGame,cheinvecenonloè)quandoscriveretedeigiochi,operlamanipolazionedelleimmagini(peresempioPIL,PythonImagingLibrary)opercrearegraficatridimensionale(peresempioPanda3D).
Sipossonousaremodulipermoltissimecoseutili.Peresempio,seprogettaateungiocodisimulazione,edesideratecheilmondodelgiococambirealisticamente,potrestecalcolareladatael’oracorrentiutilizzandounmoduloincorporatochesichiamatime:
InquestocasosiusailcomandoimportperdireaPythonchesivuoleusareilmodulotime.Poi,sipossonochiamarelefunzionipresentiinquestomodulo,utilizzandoilsimbolodelpunto.(RicordatecheabbiamousatofunzionidiquestogenereperlavorareconilmoduloturtlenelCapitolo4,peresempiot.forward(50).)Peresempio,eccocomepotremmochiamarelafunzioneasctimeconilmodulotime:
Lafunzioneasctimefapartedelmodulotimeerestituisceladatael’oracorrenti,sottoformadistringa(ininglese:TuestaperTuesday,martedì,Mayèmaggio,inquestoesempio).
Orasupponiamochevogliatechiedereaqualcunocheusailvostroprogrammadiinserireunvalore,magariladatadinascitaol’età.Potetefarloutilizzandounenunciatoprintpervisualizzareunmessaggio,eilmodulosys(abbreviazionedisystem,sistema),checontienefunzionidiservizioperinteragireconilsistemaPythonstesso.Primaditutto,importiamoilmodulosys:
All’internodelmodulosyssitrovaunoggettospecialechiamatostdin(staperstandardinput),chemetteadisposizioneunafunzionemoltoutile,readline.Questafunzionevieneutilizzataperleggere(read)unarigaditestoscrittaallatastierafinoallapressionedeltastoINVIO.(VedremocomefunzionanoglioggettinelCapitolo8.)Perprovarereadline,inseritequestocodicenellashell:
SepoiscrivetequalcheparolaepremeteINVIO,quelleparoleverrannostampatenellashell.
RipensatealcodicecheabbiamoscrittonelCapitolo5,utilizzandounenunciatoif.
Anzichécrearelavariabileetàeattribuirleunvalorespecificoprimadell’enunciatoif,orapossiamochiedereaqualcunodiinserirequelvalore.Prima,però,trasformiamoquelcodiceinunafunzione:
Orapotetechiamarelafunzionescrivendoilsuonomeepoidicendolechenumerousareinserendoquelnumerofraparentesi.Funziona?
Funziona!Orafacciamoinmodochelafunzionechiedal’etàdellapersona.(Potetemodificareoaggiungerequalcosaaunafunzionetuttelevoltechevolete.)
Avetericonosciutolafunzioneintnellariga 1 ,checonverteunastringainunnumero?L’abbiamousataperchéreadline()restituiscetuttoquellochevienescrittoallatastierasottoformadistringa,mentrenoivogliamounnumero,perpoterloconfrontareconinumeri10e13nellariga 2 .Perprovare,chiamatelafunzionesenzaparametri,poiscriveteunnumeroquandoapparelarichiestaQuantiannihai?:
CHECOSAAVETEIMPARATOInquestocapitolo,avetevistocomecrearepezzidicodiceriusabileinPythonconlefunzioniecomeusarelefunzionimesseadisposizionedaimoduli.Aveteimparatochel’ambitodellevariabilicontrollasepossonoesserevisteall’internooall’esternodellefunzioni,ecomecrearefunzioniconlaparolachiavedef.Aveteanchescopertocomeimportaremoduli,perpoterneutilizzareicontenuti.
ROMPICAPODIPROGRAMMAZIONEProvategliesempiseguenti,persperimentarecomesicreanofunzioni.Lerispostesipossonotrovareall’indirizzohttp://python-for-kids.com.
1.FUNZIONEPERILPESOSULLALUNANelCapitolo6,unodeirompicapoeracomecreareuncicloforperdeterminareilvostropesosullaLunanell’arcodi15anni.Quelcicloforpuòesseretrasformatofacilmenteinunafunzione.Provateacreareunafunzionecheprendaunpesoinizialeeloaumentiognianno.Potetechiamarelanuovafunzioneperesempioinquestomodo:
2.FUNZIONEPERILPESOSULLALUNAEGLIANNIPrendetelafunzioneappenacreataemodificatainmodochepermettadistabilireilpesoperperiodidiversi,peresempio5o20anni.Fateattenzioneamodificarelafunzioneinmodocheprendatreargomenti:ilpesoiniziale,ilpesodicuisiaumentaogniannoeilnumerodeglianni:
3.PROGRAMMAPERILPESOSULLALUNAAnzichéunasemplicefunzione,acuipassareivaloricomeparametri,potetecreareunpiccoloprogrammacherichiedaivaloriall’utentemediantesys.stdin.readline().Inquestocaso,chiameretelafunzionesenzaalcunparametro:
Lafunzionepresenteràunmessaggioincuivichiedeilpesodipartenza,unsecondomessaggiochevichiedediquantoaumentailpesoognianno,infineunmessaggiochevichiedeilnumerodeglianni.Dovrestepotervederequalcosadiquestotipo:
Ricordatediimportareilmodulosysprimadicrearelavostrafunzione:
8COMESIUSANOCLASSIEOGGETTI
Perchéunagiraffaècomeunmarciapiedi?Perchéentrambisonocose,quellicheinitalianosidefiniscononomieinPythonoggetti.L’ideadioggettoèimportantenelmondoinformatico.Glioggettisonounmodoperorganizzareilcodiceinunprogrammaesuddividerelecose,inmododasemplificareilragionamentosuideecomplesse.(AbbiamogiàusatounoggettonelCapitolo4,quandoabbiamolavoratoconlatartaruga:eraPen.)
PercapireesattamentecomefunzionanoglioggettiinPython,dobbiamopensareaitipidioggetti.Cominciamoconlegiraffeeimarciapiedi.
Unagiraffaèuntipodimammifero,cheèuntipodianimale.Unagiraffaèancheunacosaanimata(èviva).
Oraprendiamounmarciapiede.Nonc’èmoltodadire,senonchenonèunacosavivente.Chiamiamolounacosainanimata(cioènonèvivo).Iterminimammifero,animale,animataeinanimatasonotuttiterminiperclassificarelecose.
SUDDIVIDERELECOSEINCLASSIInPython,glioggettisonodefinitidaclassi,chepossiamopensarecomeunmodoperclassificareglioggettiingruppi.Eccoundiagrammaadalberodelleclassiacuiapparterrebberogiraffeemarciapiedi,inbaseallenostredefinizioniprecedenti:
LaclasseprincipaleèCose.SottolaclasseCoseabbiamoInanimateeAnimate.QuestesonoalorovoltaarticolateinMarciapiediperInanimate,Animali,MammiferieGiraffeperAnimate.
PossiamousareleclassiperorganizzarepezzidicodicediPython.Peresempio,prendiamoilmoduloturtle.Tuttelecosechepuòfarequestomodulo(peresempioandareavanti,indietro,girareasinistra,adestra)sonofunzionicontenutenellaclassePen.Sipiùpensareunoggettocomemembrodiunaclasse,esipuòcrearequalsiasinumerodioggettiperunaclasse–comefaremofrabreve.
Oracreiamolostessoinsiemediclassirappresentatoneldiagrammaadalbero,partendodallacima.Leclassisidefinisconousandolaparolachiaveclassseguitadaunnome.PoichéCoseèlaclassepiùampia,partiamodaquesta:
ChiamiamoCosequestaclasse,poiusiamol’enunciatopassperfarsapereaPythonchenongliforniremoulterioriinformazioni:siusapassquandosivuolcreareunaclasseounafunzione,manonsivoglionospecificareperilmomentoisuoidettagli.
Poi,aggiungeremolealtreclassiecostruirealcunerelazionifradiesse.
FIGLIEGENITORISeunaclasseècontenutainun’altraclasse,sidicecheèfigliadiquellaclasse(chesaràlasuagenitrice).Unaclassepuòesserefigliadiqualcheclasseegenitricedialtre.Nelnostrodiagramma,laclassechestasopraunacertaclasseèlasuagenitrice.Peresempio,InanimateeAnimatesonoentrambefigliedellaclasseCose,chequindièlalorogenitrice.
PerdireaPythoncheunaclasseèfigliadiun’altra,aggiungiamoilnomedellaclassegenitricefraparentesidopoilnomedellanuovaclasse,inquestomodo:
Abbiamocreatounaclasse,chiamataInanimate,eabbiamodettoaPythonchelasuagenitriceèCose,medianteilcodiceclassInanimate(Cose).PoiabbiamocreatounaclassechiamataAnimateeabbiamodettocheancheinquestocasolagenitriceèCose,medianteilcodiceclassAnimate(Cose).ProviamoafarelastessacosaconlaclasseMarciapiede,figliadiInanimate:
PossiamopoianalogamenteorganizzareleclassiAnimali,MammiferieGiraffe,utilizzandolerelativeclassigenitrici:
AGGIUNGEREOGGETTIALLECLASSIOracheabbiamounaseriediclassi,cheneditediinserireunpo’dicosedentroquelleclassi?SupponiamodiavereunagiraffachesichiamaReginald.SappiamocheappartieneallaclasseGiraffe,machecosapossiamousare,interminidiprogrammazione,perdescriverequellagiraffachesichiamaReginald?DiciamocheReginaldèunoggettodellaclasseGiraffe(sidiceancheavoltecheèunaistanzadellaclasse).Per“presentare”ReginaldaPython,usiamoquestaforma:
QuestarigadicodicediceaPythondicreareunoggettonellaclasseGiraffeediassegnarloallavariabilereginald.Comenelcasodiunafunzione,ilnomedellaclasseèseguitodalledueparentesi.Nelseguitodelcapitolovedremocomecreare
oggettiutilizzandodeiparametrifraleparentesi.Checosafal’oggettoreginald?Beh,niente,perilmomento.Perrendereutilii
nostrioggetti,quandocreiamolenostreclassi,dobbiamodefinireanchedellefunzionichepossanoessereusateconglioggettidiquellaclasse.Anzichéusarelaparolachiavepasssubitodopoladefinizionedellaclasse,possiamoaggiungeredefinizionidifunzioni.
DEFINIREFUNZIONIDICLASSINelCapitolo7abbiamopresentatolefunzionicomeunmodoperriusarecodice.Unafunzioneassociataaunaclassesidefiniscecomequalsiasialtrafunzione,solochesiscriverientratasottoladefinizionedellaclasse.Peresempio,eccounafunzionenormalechenonèassociataaunaclasse:
Eccounpaiodifunzionicheappartengonoaunaclasse:
CARATTERISTICHECOMEFUNZIONIConsiderateleclassifigliedellaclasseAnimatedefinitaap.95.Possiamoaggiungerecaratteristicheaunaclasseperdirechecos’èechecosapuòfare.Unacaratteristicaèuntrattocomuneatuttiimembridellaclasse(editutteleclassifiglie).
Peresempio,checos’hannoincomunetuttiglianimali?Tantopercominciare,tuttirespirano.Poi,tuttisimuovonoemangiano.Eimammiferi?Imammiferiallattanoipiccoli.Erespirano,simuovonoemangiano.Sappiamochelegiraffemangianolefogliedeglialberie,cometuttiimammiferi,allattano,respirano,simuovonoemangiano.Aggiungiamoalnostrodiagrammaquestecaratteristiche:
Questecaratteristichepossonoessereconsiderateazioni,ofunzioni–cosecheunoggettodiquellaclassepuòfare.
Peraggiungereunafunzioneaunaclasse,siusalaparolachiavedef.LaclasseAnimalisipotrebbedefinirequindicosì:
Nellaprimariga,definiamolaclassecomeinprecedenzama,invecediusarelaparolachiavepasssullarigasuccessiva,definiamounafunzionerespiraeleassegniamounparametro:self(letteralmentesignifica“sé”).Ilparametroselfèunmodoperconsentireaunafunzionedellaclassedichiamareun’altrafunzionenellastessaclasse(enellaclassegenitrice).Vedremopiùavanticomevieneusatoquestoparametro.
Sullarigasuccessiva,passdiceaPythoncheperilmomentonongliforniremoaltreinformazionisullafunzionerespira,perchéperoranondovràfarenulla.Poiaggiungiamolefunzionisi_muoveemangia,eanchequesteperoranonfannonulla.Ricreeremoleclassifrabreveeinseriremocodiceutilenellefunzioni.Questoèunmodomoltodiffusodisviluppareiprogrammi:spessoiprogrammatoricreanoclassiconfunzionichenonfannonulla,perstabilirechecosaleclassidebbanofare,primadientrareneidettaglidellesingolefunzioni.
Possiamoaggiungerefunzioniancheallealtredueclassi,MammiferieGiraffe.Ciascunaclassesaràingradodiusarelecaratteristiche(cioèlefunzioni)dellagenitrice.Questosignificachenonènecessariocreareclassimoltocomplicate:poteteinserirelevostrefunzioninellaclassepiùgeneralepercuivalequellacaratteristica,etuttelesuefiglielapotrannousare.(Questoèunbuonmodoperrendereleclassipiùsempliciepiùfacilidacomprendere.)
PERCHÉUSARECLASSIEOGGETTI?Abbiamoaggiuntofunzioniallenostreclassi,maperchéusareclassieoggetti,quandosipotrebberosemplicementescriverefunzioninormalichiamaterespira,si_muove,mangiaecosìvia?
Perrispondere,useremolanostragiraffaReginald,creatacomeoggettodellaclasseGiraffe,inquestomodo:
Poichéreginaldèunoggettopossiamochiamare(eseguire)lefunzionifornitedallasuaclasse(Giraffe)edalleantenatediquesta.Sichiamanolefunzionisuunoggettousandol’operatorepuntoeilnomedellafunzione.PerdireaReginalddimuoversiomangiare,possiamochiamarelefunzionicosì:
SupponiamocheReginaldabbiaunamico(sempreunagiraffa)chesichiamaHarold.CreiamounaltrooggettodellaclasseGiraffeconilnomeharold:
Poichéusiamooggettieclassi,possiamodireaPythonesattamentediqualegiraffastiamoparlandoquandovogliamoeseguirelafunzionesi_muove.Peresempio,sevolessimofarmuovereHarold,malasciarefermoReginald,potremmochiamaresi_muoveutilizzandol’oggettoharold,così:
Inquestocaso,simuoveràsoloHarold.Modifichiamounpo’leclassiperrenderlopiùevidente.Aggiungiamoalle
funzioniunenunciatoprint,invecedipass:
Ora,quandocreiamoreginaldeharoldechiamiamodellefunzionisudiessi,vediamosuccederequalcosadiconcreto:
Nelleprimeduerighe,abbiamocreatolevariabilireginaldeharold,chesonooggettidellaclasseGiraffe.Poi,abbiamochiamatolafunzionesi_muoveperreginald,ePythonhastampatosimuovesullarigasuccessiva.Analogamente,abbiamochiamatolafunzionemangia_foglie_degli_alberiperharoldePythonhastampatomangiafogliedeglialberi.Sesitrattassedigiraffevere,anzichédioggettiinuncomputer,unagiraffastarebbecamminando,l’altrastarebbemangiando.
OGGETTIECLASSINELLEIMMAGINIEseusassimounapprocciopiùgraficoaoggettieclassi?Torniamoalmodulo
turtleconcuiabbiamogiocatonelCapitolo4.Quandousiamoturtle.Pen(),PythoncreaunoggettodellaclassePencheèfornitodalmoduloturtle(assomigliaunpo’ainostrioggettireginaldeharolddellasezioneprecedente).Possiamocrearedueoggettitartaruga(AveryeKate),esattamentecomeabbiamocreatoduegiraffe:
Ciascunoggettotartaruga(averyekate)èmembrodellaclassePen.Quiglioggetticomincianoadimostrarelaloropotenza.Avendocreatoinostri
oggettitartaruga,possiamochiamarelefunzioniperciascunodiessi,edisegnerannoinmodoindipendentel’unodall’altro.Provateconquesteistruzioni:
Conquestaseriediistruzioni,diciamoadAverydiprocedereinavantiper50pixel,poidigirareadestradi90gradiediprocedereinavantiper20pixel,inmodochesiarresticonlapuntaversoilbasso.Ricordatecheletartarugheinizialmentesonosempreorientateversodestra.
OraèilmomentodispostareKate.CosìdiciamoaKatediruotareversosinistradi90gradi,poidiandareavantiper
100pixel:cosìsifermeràconlapuntarivoltaversol’alto.Finqui,abbiamoottenutounalineaconlefreccechesimuovevanoindirezioni
diverse,doveciascunafrecciarappresentaundiversooggettotartaruga:Averychepuntaversoilbasso,Katechepuntaversol’alto.
Oraaggiungiamounaterzatartaruga,Jacob,espostiamola,senzaandarea
intralciareKateoAvery.
AbbiamocreatounnuovooggettoPenchesichiamajacob,poiloabbiamofattoruotaredi180gradiespostareinavantidi80pixel.Ilnostrodisegnooraavràquestoaspetto,contretartarughe:
Ricordateche,ognivoltachesichiamaturtle.Pen()percreareunatartaruga,siaggiungeunnuovooggetto,indipendentedaglialtri.Ciascunoggettoèancoraun’istanzadellaclassePen,esipossonousarelestessefunzionisuciascunoggetto,ma,poichésistannousandodeglioggetti,ciascunatartarugasipuòspostareindipendentementedallealtre.Comeinostrioggettigiraffaindipendenti(ReginaldeHarold),Avery,KateeJacobsonotreoggettitartarugaindipendenti.Secreiamounnuovooggettoconlostessonomedivariabilediunoggettogiàcreato,ilvecchiononnecessariamentescomparirà.Provateci:createun’altratartarugaKateeprovateaspostarlasulloschermo.
ALTRECARATTERISTICHEUTILIDIOGGETTIECLASSIClassieoggettifacilitanoilraggruppamentodifunzioni;sonoancheestremamenteutiliquandosivuoleragionaresuunprogrammaperpartipiùpiccole.
Peresempio,pensateaun’applicazionedavveromoltogrande,comeunelaboratoreditestioungiocoin3D.Perlamaggiorpartedellepersoneèquasiimpossibilecapireprogrammididimensionisimilinellorocomplesso,perchésonocostituitidacosìtantocodice.Masuddividetequestiprogrammimostruosiinpartipiùpiccole,eciascunpezzocominceràadavereunsenso–purchéconosciateillinguaggio,ovviamente!
Quandosiscriveunprogrammadigrandidimensioni,suddividerloinparticonsenteanchedidividereillavorofrapiùprogrammatori.Iprogrammipiùcomplicaticheutilizzate(comeilvostrobrowserweb)sonostatiscrittidamoltepersone,dasquadredipersonechelavoravanocontemporaneamentesupartidiverse,magariinluoghidiversiingiroperilmondo.
Oraimmaginatedivolerespanderequalcunadelleclassicreateinquestocapitolo(Animali,MammiferieGiraffe):avetetroppolavorodafare,evoletecheivostriamicividianounamano.PotrestedividereillavorodiscritturadelcodiceinmodocheunapersonalavorisullaclasseAnimali,un’altrasullaclasseMammiferieun’altraancorasullaclasseGiraffe.
FUNZIONIEREDITATESeavetefattoattenzione,visareteresicontochechiunquefiniscaperlavoraresullaclasseGiraffeèfortunato,perchéquellaclassepotràutilizzareanchetuttelefunzionicreatedachilavorasulleclassiAnimalieMammiferi.SidicechelaclasseGiraffeereditalefunzionidallaclasseMammiferiche,asuavolta,ereditadallaclasseAnimali.Inaltreparole,quandocreiamounoggettogiraffa,possiamousarefunzionidefinitenellaclasseGiraffe,maanchequelledefinitenelleclassiMammiferieAnimali.
Analogamente,secreiamounoggettomammifero,possiamousarelefunzionidefinitenellaclasseMammiferietuttequelledellaclassegenitriceAnimali.
Dateun’occhiatadinuovoallarelazionefraleclassiAnimali,MammiferieGiraffe.LaclasseAnimalièlagenitricediMammiferi,equestaèlagenitricediGiraffe.
AncheseReginaldèunoggettodellaclasseGiraffe,possiamocomunquechiamarelafunzionesi_muovedefinitanellaclasseAnimali,perchétuttelefunzionidefiniteinunaclassegenitricesonodisponibiliallesueclassifiglie:
Ineffetti,tuttelefunzionidefinitenelleclassiAnimalieMammiferipossonoesserechiamatedalnostrooggettoreginald,perchévengonoereditate:
FUNZIONICHECHIAMANOALTREFUNZIONIQuandochiamiamofunzionisuunoggetto,usiamoilnomedivariabilediquell’oggetto.Peresempio,eccocomechiamiamolafunzionesi_muovesull’oggettogiraffaReginald:
PerchéunafunzionedellaclasseGiraffechiamilafunzionesi_muove,bisognausareinveceilparametroself.Questoparametroèunmodoperfarsìcheunafunzionedellaclassechiamiun’altrafunzione.Peresempio,aggiungiamoallaclasseGiraffeunanuovafunzione,cerca_cibo:
Oraabbiamocreatounafunzionechecombinaaltreduefunzioni,cosamoltocomunenellaprogrammazione.Spesso,vicapiteràdiscrivereunafunzionechefaqualcosadiutile,chepoipoteteutilizzareall’internodiun’altrafunzione.(LofaremoanchenoinelCapitolo13,dovescriveremofunzionipiùcomplessepercreareungioco.)
UsiamoselfperaggiungerequalchealtrafunzioneallaclasseGiraffe:
Usiamolefunzionimangiaesi_muovedellaclassegenitriceAnimali(funzioniereditate)perdefinirelefunzionimangia_foglie_degli_alberieballa,perlaclasseGiraffe.Aggiungendofunzionichechiamanoaltrefunzioniinquestomodo,quandosicreanooggettidiquelleclassi,sipuòchiamareunasingolafunzionechefacciapiùdiunacosa.Potetevederequisottochecosasuccedequandosichiamalafunzioneballa:lanostragiraffasimuovequattrovolte(cioè,iltesto“simuove”vienestampatoquattrovolte):
INIZIALIZZAREUNOGGETTOAvolte,quandosicreaunoggetto,sivoglionoimpostareanchedeivalori(dettiancheproprietà)chesiutilizzerannoinfuturo.Quandosiinizializzaunoggetto,losipreparaall’uso.
Peresempio,supponiamodivolerindicarequantemacchiecisonosuinostrioggettigiraffaquandovengonocreati–cioèquandovengonoinizializzati.Perfarlo,creiamounafunzione__init__(notatechecisonoduecaratteridisottolineaturadaciascunaparte,peruntotalediquattro).QuestoèuntipospecialedifunzionenelleclassiPythonedeveaverequestonome.Lafunzioneinitcostituisceunmodoperfissareleproprietàdiunoggettoquandoquestovienecreato,ePythonchiameràautomaticamentequestafunzionequandosicreaunnuovooggetto.Eccocomesiusa:
Quicomeprimacosaabbiamodefinitolafunzioneinitcondueparametri,selfemacchie,conilcodicedef__init__(self,macchie):.Comelealtrefunzionicheabbiamodefinitonellaclasse,anchelafunzioneinitdeveavereselfcomeprimoparametro.Poiabbiamoimpostatoilparametromacchieaunavariabiledioggetto(lasuaproprietà)chiamatamacchie_giraffa,utilizzandoilparametroself,conilcodiceself.macchie_giraffa=macchie.Poteteimmaginarechequestarigadicodicedica“Prendiilvaloredelparametromacchieesalvaloperpiùtardi(utilizzandolavariabiledioggettomacchie_giraffa)”.Comeunafunzioneinunaclassepuòchiamareun’altrafunzioneutilizzandoilparametroself,ancheallevariabilidellaclassesipuòaccedereconself.
Poi,secreiamounpaiodinuovioggettigiraffa(OzwaldeGertrude)estampiamoilnumerodelleloromacchie,possiamovederelafunzionediinizializzazioneall’opera:
Comeprimacosa,abbiamocreatoun’istanzadellaclasseGiraffe,utilizzandoilvalorediparametro100.Questofasìchevengachiamatalafunzione__init__conilvalore100perilparametromacchie.Poiabbiamocreatoun’altraistanzadellaclasseGiraffe,questavoltaconilvalore150.Infine,abbiamostampatolavariabileoggettomacchie_giraffaperciascunodeinostrioggettigiraffa,epossiamovederecheirisultatisono100e150.Hafunzionato!
Ricordate,quandosicreaunoggettodiunaclasse,comeozwaldquisopra,sipuòfarriferimentoallesuevariabilioallesuefunzioniutilizzandol’operatorepuntoeilnomedellavariabileodellafunzionechesivuoleusare(peresempio,ozwald.macchie_giraffa).Quandoinvecesicreanofunzioniall’internodiunaclasse,sifariferimentoaquellestessevariabili(eadaltrefunzioni)utilizzandoilparametroself(self.macchie_giraffa).
CHECOSAAVETEIMPARATOInquestocapitolo,abbiamousatoleclassipercrearecategoriedicoseeabbiamocreatooggetti(istanze)diquelleclassi.Avetevistocomeunaclassefigliaereditilefunzionidellasuagenitriceeche,anchesedueoggettiappartengonoallastessaclasse,nonsononecessariamentedeicloni.Peresempio,unoggettogiraffapuòavereilsuonumerodimacchie.Aveteimparatocomechiamare(eseguire)funzionisuunoggettoecomelevariabilioggettosianounmodopersalvaredeivaloriinqueglioggetti.Infine,abbiamousatoilparametroselfnellefunzioniperfarriferimentoadaltrefunzionievariabili.QuestisonoconcettifondamentalidiPython,eliincontrereteancoramoltevoltecontinuandoaleggerequestolibro.
ROMPICAPODIPROGRAMMAZIONEAlcunedelleideevisteinquestocapitoloacquisterannomaggioresignificatoquantopiùleuserete.Provateasvolgeregliesempiseguenti,poicercatelerisposteall’indirizzohttp://python-for-kids.com/.
1.LADANZADELLAGIRAFFAAggiungeteallaclasseGiraffedellefunzioniperfarspostareavantieindietrolozoccolosinistroedestrodellagiraffa.Peresempio,unafunzioneperfarspostareavantilazampasinistrapotrebbeesserescrittainquestomodo:
PoicreateunafunzionedanzaperinsegnareaReginaldcomesiballa(lafunzionechiameràlequattrofunzioniappenacreateperlezampe).Ilrisultatodellachiamatadiquestanuovafunzionesaràunadanzamoltosemplice:
2.FORCONEPERTARTARUGHECreatequestodisegnodiunforconeutilizzandoquattrooggettitartarugaPen(lalunghezzaesattadeisingolisegmentinonèimportante).Ricordate,comeprimacosa,diimportareilmoduloturtle!
9LEFUNZIONIINTERNEDIPYTHON
Pythonmetteadisposizioneunacassettadegliattrezziperlaprogrammazionebenfornita,incuisitrovano,fralealtrecose,moltefunzioniemoltimoduligiàprontiall’uso.Comeunmartellofidatoounachiaveinglese,questistrumentiincorporati(pezzidicodice,inrealtà)possonorenderemoltopiùfacilescrivereprogrammi.ComeabbiamovistonelCapitolo7,imodulidevonoessereimportati,perpoteressereutilizzati,mentrenonc’èbisognodiimportarelefunzioniinterne;sonodisponibiliappenalashelldiPythonsiavvia.
Inquestocapitolo,esamineremoalcunedellefunzioniinternepiùutili,poiciconcentreremosuunainparticolare:lafunzioneopen,checonsentediaprirefileperpoterneleggereicontenutieperpoterscrivereallorointerno.
COMESIUSANOLEFUNZIONIINTERNEConsidereremoquidodicifunzioniinterne,usatespessodaiprogrammatoriPython.Vedremochecosafannoecomesiusano,efaremoqualcheesempiodicomepossonoaiutarenellascritturadiprogrammi.
LAFUNZIONEABSLafunzioneabsrestituisceilvaloreassolutodiunnumero,cheèilvalorediquelnumerosenzasegno.Peresempio,ilvaloreassolutodi10è10,ilvaloreassolutodi-10è10.
Perusarelafunzioneabs,bastachiamarlaconunnumeroounavariabilecomeparametro:
Poteteusarelafunzioneabsperesempiopercalcolarelaquantitàassolutadimovimentodiunpersonaggioinungioco,indipendentementedalladirezioneincuisièspostato.Peresempio,supponiamocheilpersonaggiofacciatrepassiadestra(3positivo)epoidiecipassiasinistra(10negativo,ovvero-10).Senonciinteressaladirezione(positivaonegativa),ilvaloreassolutodiquestinumerisarebbe3e10,Potresteusarequestivaloriinungiocodatavoloincuilanciateduedadiepoifatespostareilpersonaggiodiunnumeromassimodipassiinqualsiasidirezione,sullabasedelpunteggiototaledeiduedadi.Ora,sememorizzatequelnumerodipassiinunavariabile,potetedeterminareseilpersonaggiosimuoveconilcodicechesegue.Vogliamovisualizzarequalcheinformazionequandoilgiocatorehadecisodispostarsi(qui,visualizzeremosolo“Ilpersonaggiosimuove”):
Senonavessimousatoabs,l’enunciatoifavrebbedovutoesserediquestotipo:
Comepotetevedere,l’usodiabsrendel’enunciatoifunpo’piùbreveepiùfaciledacapire.
LAFUNZIONEBOOLIlnomeboolèabbreviazionedibooleano,l’aggettivocheiprogrammatoriusanoperdescriveuntipodidatichepuòaveresoloduevalori,“vero”(True)o“falso”(False).
LafunzioneboolprendeununicoparametroerestituisceoTrueoFalseasecondadelsuovalore.Sesiusaboolperinumeri,0restituisceFalse,mentreognialtronumerorestituisceTrue.Eccoqualcheesempio:
Sesiusaboolconaltrivalori,peresempiostringhe,restituisceFalseselastringanonhaalcunvalore(ovverolaparolachiaveNone,èunastringavuota).Inognialtro
casorestituisceTrue:
LafunzioneboolrestituiràFalseancheperliste,tupleemappechenoncontengonoalcunvalore,Trueseinvececontengonoqualchevalore:
Poteteusareboolquandodovetedecidereseunvaloresiastatoimpostatoomeno.Peresempio,sechiediamoachiusailnostroprogrammadiinserirel’annoincuiènato,unifpotrebbeusareboolperverificareilvaloreinserito:
Laprimarigausainputperimmagazzinarenellavariabileannociòchel’utenteinseriscedallatastiera.PremendoINVIOsullarigasuccessiva(senzascriverenulla),nellavariabilevienememorizzatoilvalorediINVIO.(NelCapitolo7abbiamousatosys.stdin.readline(),cheèunaltromodoperfarelastessacosa.)
Sullarigasuccessiva,l’enunciatoifcontrollailvalorebooleanodellavariabile,dopoaverutilizzatolafunzionerstrip(cheeliminaicaratterispazioeINVIOallafine
dellastringa).Datochel’utentequinonhainseritonulla,boolrestituisceFalse.Poichél’enunciatoifusalaparolachiavenot,ilsuosignificatoè“faiquestoselafunzionenonrestituisceTrue”,perciòilcodicestampaDeviinserireunvaloreperl’annodinascitasullarigasuccessiva.
LAFUNZIONEDIRLafunzionedir(abbreviazionedidirectory)restituisceinformazionisuqualsiasivalore.Fondamentalmente,vidicequalifunzionipossonoessereusateconquelvalore,elencandoleinordinealfabetico.
Peresempio,pervederequalifunzionisianodisponibiliperunvalorelista,potetescrivere:
Lafunzionedirèutilizzabilesuquasitutto,inparticolareperstringhe,numeri,funzioni,moduli,oggettieclassi.Qualchevoltaleinformazionicherestituisce,però,possonoesserepocoutili.Peresempio,sechiamatedirperilnumero1,visualizzaunaseriedifunzionispeciali(quellecheinizianoeterminanocongliunderscore,itrattinidisottolineatura)usatedaPythonstesso,ilchenonèmoltoutile(disolitosipuòignorarelamaggiorpartediquestefunzioni):
Lafunzionedirpuòessereutilequandosihaunavariabileesivuolecapirerapidamentechecosasipuòfareconquellavariabile.Peresempio,eseguitedirconlavariabilepopcornchecontieneunvalorestringa,eotterretelalistadellefunzionimesseadisposizionedallaclassestring(tuttelestringheappartengonoallaclassestring):
Aquestopunto,poteteusarehelppervedereunabrevedescrizionediqualsiasifunzionenellalista.Eccounesempio:
Leinformazionirestituitepossonorisultarepocochiare,perciòdiamoun’occhiatapiùdavicino.Itrepuntini(…)significanocheupperèunafunzioneinternadellaclassestringe,inquestocaso,chenonassumeparametri(èilsuccodelleparolecheseguonolaparentesiconitrepuntini).Lafreccia(->)sullarigasuccessivasignificachelafunzionerestituisceunastringa(str).L’ultimarigadàunabrevedescrizionediquellochefalafunzione:restituisceunacopiadiS(lastringa)convertitaintuttemaiuscole(uppercase).
LAFUNZIONEEVALLafunzioneeval(abbreviazionedievalutation,valutazione)prendecomeparametrounastringa,elaelaboracomesefosseun’espressionePython.Peresempio,eval('print("wow")')eseguel’enunciatoprint("wow").Lafunzioneevaloperasoloconespressionisemplici,comequesta:
Espressionidispostesupiùrighe(comeglienunciatiif)ingenerenonverrannovalutate,comeinquestoesempio:
Lafunzioneevalsiusaspessoperconvertirel’inputdell’utenteinespressioniPython.Peresempio,sipotrebbescrivereunsempliceprogramma“calcolatrice”cheleggaespressionimatematicheepoinecalcoli(valuti)lasoluzione.
Datochel’inputdell’utenteèlettocomestringa,Pythondeveconvertirloinnumerieoperatori,primadieseguirequalsiasicalcolo.Lafunzioneevalrendefacilelaconversione:
Nell’esempio,usiamoinputperleggerequantoinseritodall’utentenellavariabiletuo_calcolo.Nellarigasuccessiva,inseriamol’espressione32*52,poiusiamoevalpereseguireilcalcolo;ilrisultatovienestampatosullarigaseguente.
LAFUNZIONEEXECLafunzioneexecècomeeval,trannechelasipuòusarepereseguireprogrammipiùcomplessi.Ladifferenzaècheevalrestituisceunvalore(qualcosachesipuòsalvare
inunavariabile),mentreexecno.Eccounesempio:
Nelleprimeduerighe,creiamounavariabileconunastringamultilineachecontienedueenunciatiprint,poiusiamoexecpereseguirelastringa.
SipotrebbeusareexecpereseguirepiccoliprogrammicheunprogrammaPythonleggedafile:programmidentroprogrammi!Puòesseremoltoutile,quandosiscrivonoapplicazionilungheecomplesse.Peresempio,sipotrebbecreareungiocoDuelingRobotsincuiduerobotsispostanosulloschermoecercanodiattaccarsiavicenda.IgiocatoridarebberoistruzioniailororobotsottoformadiminiprogrammiPythoneilgiocoleggerebbeleistruzionieuserebbeexecpereseguirle.
LAFUNZIONEFLOATLafunzionefloatconverteunastringaounnumeroinunnumeroinvirgolamobile(floatingpoint),cioèunnumeroconposizionidecimali(cheèancheunnumeroreale).Peresempio,ilnumero10èunintero,mentre10.0,10.1e10.253(inPythonsiusa,comenelsistemaanglosassone,ilpuntoalpostodellavirgola)sonotuttinumeriinvirgolamobile.Sipossonousareinumeriinvirgolamobile(anzichégliinteri)peresempioquandosiscriveunprogrammachecomporticalcolidisommedidenaro,oppureneiprogrammidigrafica(giochi3D,peresempio)percalcolarecomeedovedisegnarequalcosasulloschermo.
Sipuòconvertireunastringainunnumeroinvirgolamobilesemplicementechiamandofloat:
Sipuòusareancheilpuntodecimalenellestringhe:
Sipuòusarefloatperconvertireinnumeriivaloriinseritinelprogramma,cosaparticolarmenteutilequandosideveconfrontareilvaloreinseritodall’utenteconqualchealtrovalore.Peresempio,perverificaresel’etàdiunapersonaèsuperioreauncertonumero,potremmofarecosì:
LAFUNZIONEINTLafunzioneintconverteunastringaounnumeroqualsiasiinunintero,ilchesignificasostanzialmentechetuttociòcheeventualmentecomparivadopoilpuntodecimalevieneeliminato.Peresempio,eccocomeconvertireunnumeroinvirgolamobileinunsempliceintero:
Questoesempioconverteunastringainunintero:
Provateperòaconvertireinuninterounastringacontenenteunnumeroinvirgolamobileeotterreteunmessaggiod’errore.Peresempio:
Comepotetevedere,ilrisultatoèunmessaggioValueError.
LAFUNZIONELENLafunzionelenrestituiscelalunghezzadiunoggettoo,nelcasodiunastringa,ilnumerodeicaratterichelacompongono.Peresempio,peraverelalunghezzadiquestaèunastringadiprova,sipuòfarecosì:
Seusataconunalistaounatupla,lenrestituisceilnumerodeglielementichelacompongono:
Anchequandoèusataconunamappa,lenrestituisceilnumerodeisuoielementi:
Lafunzionelenèparticolarmenteutilequandosilavoraconicicli.Peresempio,lasipuòusarepervisualizzarel’indicedellaposizionedeglielementiinunalista:
Qui,memorizziamolalunghezzadellalistanellavariabilelunghezzain 1 ,poiusiamoquellavariabilenellafunzionerangepercreareilcicloin 2 .In 3 ,mentresiprocedeciclicamentelungotuttiglielementidellalista,stampiamounmessaggiocheindicalaposizioneeilvaloredell’elementoconsiderato.Sipotrebbeusarelafunzionelenanche,peresempio,sesiavesseunalistadistringheesivolessestampareunelementodellastringaognidueoognitre.
LEFUNZIONIMAXEMINLafunzionemaxrestituiscel’elementopiùgrandeinunalista,unatuplaounastringa.Peresempio,eccolausataconunalistadinumeri:
Lasipuòusareancheconunastringaseparatadavirgoleospazi:
Comesivedeinquestocaso,leletterevengonoordinatealfabeticamente,eleminuscolevengonodopolemaiuscole,perciòtè“piùgrande”diT.
Nonènecessariocomunqueusareliste,tupleostringhe.Sipuòusaremaxanchedirettamente,einserireglielementichesivoglionoconfrontarefraparentesi,comeparametri:
Lafunzioneminsicomportanellostessomodo,trannecherestituiscel’elementopiùpiccolodellalista,tuplaostringa.Eccolaapplicataallanostralistadinumeri:
Supponiamodiavereungioco,conquattrogiocatori,incuiciascunodevetirareaindovinareeindicareunnumerominoredelvostro.Sequalchegiocatoreproponeunnumeromaggioredelvostro,tuttiperdono,masetuttipropongononumeripiùbassi,vincono.Potremmousaremaxperscoprirerapidamentesetuttiinumericheglialtrigiocatorihannopropostosonopiùbassi:
Inquestoesempio,memorizziamoilnumerodaindovinareusandolavariabileindovina_il_numero.Inumeripropostidaigiocatorisonomemorizzatinellalistarisposte_giocatori.L’enunciatoifconfrontalarispostapiùaltaconilnumeroinindovina_il_numero,esequalchegiocatorehapropostounnumeropiùalto,vienestampatoilmessaggio“Ahi!Avetepersotutti”.
LAFUNZIONERANGELafunzionerange,comeabbiamogiàvisto,vieneusatasoprattuttoneiciclifor,perpercorrereunasezionedicodiceunospecificonumerodivolte.Iprimidueparametripassatiarangesonochiamatistartestop.Abbiamovistousatarangeconquestidueparametrinell’esempioprecedente,insiemeallafunzionelen,pereffettuareunciclo.
Inumerigeneratidarangeinizianodaquellodatocomeprimoparametroefinisconoconquellopassatocomesecondoparametro.Peresempio,eccochecosasuccedesestampiamoinumericreatidarangefra0e5:
Lafunzionerangeinrealtàrestituisceunoggettospeciale,chiamatoiteratore,cheripeteun’azioneperuncertonumerodivolte.Inquestocaso,restituisceilnumerosuccessivo,ognivoltachevienechiamata.
Sipuòconvertirel’iteratoreinunalista(mediantelafunzionelist).Sepoisistampailvalorerestituitodallachiamataarange,sivedrannoinumerichecontiene:
Sipuòpassarearangeancheunterzoparametro,chiamatostep(passo).Seilvalorestepnonèincluso,vieneutilizzatocomepasso1.
Checosasuccede,invece,sesiindicailnumero2comepasso?
Ogninumeronellalistaèpiùgrandedidueunitàrispettoalprecedente,elalistafinisceconilnumero28,cheè30–2.Sipuòindicareancheunpassonegativo:
LAFUNZIONESUMLafunzionesumsommaglielementidiunalistaerestituisceiltotale.Eccounesempio:
Sullaprimariga,creiamounalistadinumericompresifra0e500,usandolafunzionerangeconpasso50.Poistampiamolalistapervedereilrisultato.Infine,passandolavariabilelista_numeriallafunzionesumconprint(sum(lista_numeri)),tuttiglielementidellalistavengonosommatievienestampatoiltotale,2250.
1.2.3.4.
5.
6.7.
LAVORARECONIFILEIfilediPythonsonougualiadaltrifilesulvostrocomputer:documenti,immagini,musica,giochi…ineffetti,tuttonelvostrocomputerèsalvatocomefile.
VediamocomeinPythonsiapranoifile,conlafunzioneopen,perpotervilavorare.Primaperòdobbiamocreareunnuovofileconcuifarelenostreprove.
CREAREUNFILEDIPROVAFaremoqualcheesperimentoconunfileditesto,chechiameremotest.txt.Seguitelaproceduraperilsistemaoperativocheutilizzate.
CREAREUNNUOVOFILEINWINDOWSSeusateWindows,seguitequestipassipercrearetest.txt:
SelezionateStart>Tuttiiprogrammi>Accessori>Blocconote.Scrivetequalcherigainunfilevuoto.SelezionateFile>Salva.Quandocomparelafinestradidialogo,selezionatel’unitàC:facendoundoppioclicsuComputerepoisuDiscolocale(C:).FateundoppioclicsullacartellaUtentiepoiundoppioclicsulvostronomeutente.Scrivetetest.txtnellacasellaNomefile,inbassonellafinestradidialogo.Infine,fateclicsulpulsanteSalva.
1.
2.3.
4.5.6.7.8.
9.
1.
2.3.
CREAREUNNUOVOFILEINMACOSXSeusateunMac,seguitequestipassipercrearetest.txt:
Fateclicsull’iconaSpotlightnellabarradeimenunellapartesuperioredelloschermo.ScriveteTextEditnellacaselladiricerca.NellasezioneApplicazionicompariràTextEdit.Fateunclicperaprirel’editor(potetetrovareTextEditanchenellacartellaApplicazionidelFinder).Scrivetequalcherigaditestonelfilevuoto.SelezionateFormato>Solotesto.SelezionateFile>Salva.NellacasellaSalvaconnome,scrivetetest.txt.Nell’elencoSituatoin,fateclicsulvostronomeutente(ilnomeconcuiaveteeffettuatol’accesso,oppureilnomedellapersonachepossiedeilcomputerchestateusando).Infine,fateclicsulpulsanteSalva.
CREAREUNNUOVOFILEINUBUNTUSeusateUbuntu,seguitequestipassipercrearetest.txt:
Apriteilvostroeditor,chepuòessereTextEditorogeditoaltroancora.Nelcaso,cercatelonelSoftwareCenter.Inseritequalcherigaditestonell’editor.SelezionateFile>Salva(ingeditilpulsanteSalva)
4.
5.
NellacasellaNome,scrivetetest.txtcomenomedifile.ComedirectorydisalvataggiopuòdarsisiagiàselezionatalavostradirectoryHome,ma,senonloè,selezionatela.(Eventualmente,ladirectoryhomeèilnomeutenteconcuiaveteeffettuatol’accesso.)FateclicsulpulsanteSalva.
APRIREUNFILEINPYTHONLafunzioneinternaopenapreunfilenellashelldiPythonenevisualizzaicontenuti.Comedireallafunzionequalefileapriredipendedalsistemaoperativo.Guardatel’esempioperunfileWindows,poileggeteiparagrafispecificiperMacoUbuntu,seusateunodiquestisistemi.
APRIREUNFILEINWINDOWSSeusateWindows,inseritequestocodiceperapriretest.txt:
Nellaprimariga,usiamoopen,cherestituisceunoggettofileconlefunzioniperlavoraresuifile.IlparametroutilizzatoconlafunzioneopenèunastringachediceaPythondovetrovareilfile.SeusateWindows,avetesalvatotest.txtnellavostra
directoryhomesull’unitàC:,perciòdovetespecificarelaposizionedelvostrofileconlastringaC:\\Users\\<quiscriveteilvostronome>\\test.txt.
LeduebarrerovesciatenelnomedelfileWindowsdiconoaPythonchelabarrarovesciataèsoloquello,nonqualchetipodicomando.(ComeabbiamovistonelCapitolo3,lebarrerovesciatedasolehannounsignificatospecialeinPython,inparticolarenellestringhe.)Salviamol’oggettofilenellavariabiletest_file.
APRIREUNFILEINMACOSXSeusateMacOSX,dovreteinserireunaposizionediversanellaprimarigadell’esempiodiWindows,perapriretest.txt.Nellastringa,usateilnomeutentesucuiavetefattoclicquandoavetesalvatoilfileditesto.Peresempio,seilnomeutenteeramartarossi,ilparametrodiopendovràesserescrittoinquestomodo:
APRIREUNFILEINUBUNTUSeusateUbuntu,dovreteinserireunaposizionediversanellaprimarigadell’esempiodiWindows,perapriretest.txt.Nellastringa,usateilnomeutentesucuiavetefattoclicquandoavetesalvatoilfileditesto.Peresempio,seilnomeutenteeragiacomo,ilparametrodiopendovràesserescrittoinquestomodo:
SCRIVERENEIFILEL’oggettofilerestituitodaopenhaaltrefunzioni,oltrearead.Possiamocreareunnuovofilevuotousandounsecondoparametro,lastringa'w',quandochiamiamolafunzione:
Ilparametro'w'diceaPythonchevogliamoscriverenell’oggettofile,anzichéleggereisuoicontenuti.
Adessopossiamoaggiungeredelleinformazioniinquestonuovofile,mediantelafunzionewrite(“scrivi”):
Ilnumerochecomparenellarigasuccessivaèilnumerodeicaratterichesonostatiscrittinelfile.
Infine,dobbiamodireaPythoncheabbiamofinitodiscriverenelfile,utilizzandolafunzioneclose:
Ora,seapriteilfileconilvostrotexteditor,vedretechecontieneiltesto“Checosaègrandeerumoroso?Unaranaurlatrice!”.Oppure,poteteusarePythonperleggerlo:
CHECOSAAVETEIMPARATOInquestocapitolo,aveteimparatoaconoscerelefunzioniinternediPython,comefloateint,chepossonoconvertirenumericonilpuntodecimaleininterieviceversa.AvetevistoanchecomelafunzionelenpossarenderepiùfaciliicicliecomesipossausarePythonperaprirefileperleggerneicontenutioperscriverequalcosaallorointerno.
ROMPICAPODIPROGRAMMAZIONEProvatearealizzaregliesempiseguenti,persperimentarelefunzioniinternediPython.Trovatelerisposteall’indirizzohttp://python-for-kids.com/.
1.ILCODICEMISTERIOSOQualesaràilrisultatodell’esecuzionediquestocodice?Provatearicostruirloamente,poieseguiteilcodicepervedereseavetetrovatolarispostagiusta.
2.ILMESSAGGIONASCOSTO
Provateausaredirehelpperscoprirecomesuddividereunastringainparole,poicreateunprogramminoperstampareunaparolasìeunanodellastringaseguente,partendoconlaprimaparola(questo):
3.COPIAREUNFILECreateunprogrammainPythonpercopiareunfile.(Suggerimento:doveteaprireilfilechevoletecopiare,leggerloepoicreareunnuovofile,lacopia.)Verificatecheilvostroprogrammafunzionivisualizzandosulloschermoicontenutidelnuovofile.
•
••
Questocodicegeneraunastellaaottopunte:
Ilcodiceinséèmoltosimileaquelloperdisegnareilquadrato,conqualcheeccezione:
Anzichéeseguireilcicloquattrovolte,conrange(1,5),loesegueottovolteconrange(1,9).Anzichéavanzaredi50pixel,latartarugaavanzadi100.Anzichéruotaredi90gradi,latartarugaruotadi225gradiasinistra.
Proviamoasviluppareancoraunpo’lanostrastella.Utilizzandounangolodi175gradiepercorrendoilciclo37volte,possiamocreareunastellaconunnumeroancoramaggioredipunte:
Eccoilrisultato:
Restandointemadistelle,eccocomeprodurreunastella“aspirale”:
Modificandol’angolodirotazioneeriducendoilnumerodeicicli,latartarugadisegnauntipodistellamoltodiverso:
Utilizzandouncodicesimile,possiamocrearevarieforme,daunsemplicequadratoaunastellaaspirale.Comepotetevedere,grazieaiciclifor,abbiamoresomoltopiùsempliceildisegnodiquesteforme.Senzaicicli,sarebbestatonecessarioscrivereunagranquantitàdicodicenoiosamenteripetitivo.
Ora,proviamoausareunenunciatoifpercontrollarelarotazionedella
tartarugaedisegnareun’altravariantedistella.Inquestoesempio,vogliamochelatartarugaruotidiuncertoangololaprimavolta,poidiunangolodiversolavoltasuccessiva.
Quiabbiamocreatounciclo,chevieneeseguito18volte(range(1,19))ediceallatartarugadispostarsiinavantidi100pixel(t.forward(100).Aquestopuntoarrival’enunciatoifx%2==0,checontrollaselavariabilexcontieneunnumeropari,utilizzandounoperatoremodulo,indicatodalsimbolo%nell’espressionex%2==0,chesostanzialmentesignifica“xmod2”èugualea0.
L’operatoremodulodàilrestodelladivisionediduenumeri,inquestocasoilrestodelladivisionedelvalorecontenutonellavariabilexper2.Peresempio,sedividessimo5pallineinduegruppi,otterremmoduegruppidi2pallineperuntotaledi4palline)eunrestocostituitoda1pallina:
Sedividessimo13pallineindueparti,otterremmoduegruppidi6pallineconilrestodi1pallina:
Quandocontrolliamoseilrestoèugualeazero,dopoaverdivisoper2,sostanzialmentecichiediamosesiapossibiledividereilvalorecheciinteressainduepartisenzaresto.Questoèunmetodoelegantepersapereseilnumerocontenutoinunavariabileèpari:ladivisioneper2diunnumeroparidàsempreresto0,mentreladivisioneper2diunnumerodisparidàsempreresto1(diversodazero).
Nellaquintarigadelnostrocodice,diciamoallatartarugadiruotareasinistradi175gradi(t.left(175))seilnumeroinxèpari(ifx%2==0:);altrimenti(else),nell’ultimariga,lediciamodiruotaredi225gradi(t.left(225)).
Eccoilrisultato:
DISEGNAREUN’AUTOLatartarugapuòfaremoltopiùchedisegnarestelleesempliciformegeometriche.Nelprossimoesempio,disegneremoun’auto,siapurediformaunpo’rozza.
Prima,disegniamoilcorpodellavettura.InIDLE,selezionateFile>NewFile,poiinseritenellanuovafinestraquestocodice:
Poi,disegniamolaprimaruota.
Infine,lasecondaruota:
SelezionateFile>SaveAsedatealfileunnomecomeauto.py.SelezionatepoiRun>RunModuleperprovareilcodice.Edeccolavostraauto:
••••
Avreteprobabilmentenotatochenelnostrocodiceècomparsaqualchenuovafunzione:
colorèusatapercambiareilcoloredellapenna.begin_filleend_fillsiusanoperriempiredicoloreun’areadellatela.circledisegnauncerchiodiunaparticolaredimensione.setheadingfaruotarelatartarugainmodochepuntiinunacertadirezione.
Diamoun’occhiataacomesipossonousarequestefunzioniperaggiungereunpo’dicoloreaidisegni.
COLORARELafunzionecolorprendetreparametri.Ilprimospecificalaquantitàdirosso,ilsecondolaquantitàdiverde,ilterzolaquantitàdiblu.Peresempio,peravereun’autodiunrossoacceso,abbiamousatocolor(1,0,0),chediceallatartarugadiusareunapennarossaal100percento.
Lacombinazionedirosso,verdeebluperotteneretuttiicoloriprendeilnomediRGB(dall’inglesered,green,blue).Èilmodoincuisonorappresentatiicolorisuimonitorelediversecombinazionidiquesticoloriprimariproduconoaltricolori,comequandosimescolanovernicibluerosseperottenereilviolaogialleerosseperottenerel’arancione.Icolorirosso,verdeeblusonochiamatiprimariperchénonsipossonootteneremescolandoaltricolori.
Anchesenonusiamoverniciquandocreiamocolorisuunmonitor(usiamolaluce),puòessereutilepensarequeste“ricette”RGBcomeformatedatrelattedivernice,unarossa,unaverdeeunablu.Ognilattinaèpienaeallalattinapienaattribuiamounvalore1(o100percento).Poimescoliamotuttalavernicerossaetuttaquellaverdeinuncontenitore,ottenendoilgiallo(1e1,100percentodiciascuncolore).
Torniamoalmondodelcodice.Perdisegnareuncerchiogialloconlatartaruga,dovremmousareil100percentodivernicerossaediverniceverde,manienteblu,così:
Laterna1,1,0nellaprimarigarappresentail100percentodirosso,il100percentodiverdeelo0percentodiblu.Nellarigasuccessiva,diciamoallatartarugadiriempireconquestocoloreRGBleformechedisegna(t.begin_fill),poididisegnareuncerchiocont.circle.Nell’ultimariga,end_filldiceallatartarugadiriempireilcerchioconilcoloreRGB.
UNAFUNZIONEPERUNCERCHIOPIENOPerfacilitarcilasperimentazioneconvaricolori,creiamounafunzionedalcodiceutilizzatoperdisegnareuncerchiopieno.
Possiamodisegnareuncerchiodicoloreverdebrillanteutilizzandosololaverniceverde,conquestocodice:
Oppurepossiamodisegnareuncerchiodiverdepiùscurousandosolometàdellaverniceverde(0.5):
PergiocareconicoloriRGBsulloschermo,provateadisegnareuncerchioprimaconil100percentoepoiconil50percentodirosso(1e0.5),poiconilsoloblu,al100epoial50percento:
NOTASelatelacominciaaessereunpo’ingombra,usatet.reset()percancellaretuttiivecchidisegni.Ricordateinoltrechepotetespostarelatartarugasenzadisegnarenullautilizzatot.up()peralzarelapenna,perpoiriabbassarlacont.down().
Variecombinazionidirosso,verdeebluprodurrannotanticoloridiversi,comeilcolororo:
Questoèunrosa:
Edeccoduediversesfumaturediarancione:
Provatearealizzareicolorichepreferite!
CREAREUNBIANCOENEROPUROChecosasuccedequandosispengonotuttelelucilasera?Tuttodiventanero.Lostessosuccedeconicoloridiuncomputer.Nessunalucesignificanessuncolore,cosìuncerchiocon0pertuttiicoloriprimaririsulteràriempitodinero:
Eccoilrisultato:
Succedeilcontrariosesiusail100percentodituttietreicolori:inquelcaso,siottieneilbianco.Scrivetequestaistruzione,percancellareilcerchionero:
UNAFUNZIONEPERDISEGNAREQUADRATIAbbiamovistochesiriempionodicoloreleformedicendoallatartarugadiiniziareilriempimentoconbegin_fill,epoileformevengonoriempitequandosiusalafunzioneend_fill.Orafacciamoqualchealtroesperimentoconleformeeiriempimenti.Usiamolafunzionechedisegnaquadrati(vistaall’iniziodelcapitolo)elepassiamoillatodelquadratocomeparametro.
Provatelafunzionechiamandolaconunlatodi50pixel:
Questoprodurràunpiccoloquadrato:
Oraproviamoconlatidimisuradiversa.Creiamocinquequadraticonsecutividilato25,50,75,100e125.
Questiquadratisarannofattiinquestomodo:
DISEGNAREQUADRATIPIENIPerdisegnareunquadratopieno,bisognaprimareinizializzarelatela,iniziareilriempimentoepoichiamaredinuovolafunzionequadrato,conquestocodice:
Vedreteunquadratovuoto,finoachenonfiniteilriempimento:
Cambiamoquestafunzione,inmodopoterdisegnarequadratipieniovuoti.Abbiamobisognodiunaltroparametro,eilcodicediventaunpo’piùcomplesso:
Nellaprimariga,cambiamoladefinizionedellafunzione,inmodocheprendadueparametrilatoepieno.PoivediamoseilvaloredipienoèTrue,conifpieno==True.Seloè,chiamiamobegin_fill,perdireallatartarugadiriempirelaformachedisegneremo.Poieffettuiamoperquattrovolte(forxinrange(1,5))ilcicloperdisegnareiquattrolatidelquadrato(procedendoinavantieasinistra),primadiverificaredinuovosepienoèTrueconifpieno=True.Seloè,completiamoilriempimentocont.end_fill()elatartarugariempiedicoloreilquadrato.
Orapossiamodisegnareunquadratopienoconquestocodice:
Oppurepossiamocreareunquadratovuotoconquesto:
Dopoquesteduechiamateallafunzionemioquadrato,siottienequestaimmagine,chesembraunpo’unocchioquadrato.
Ovviamentenoncisifermaqui:èpossibiledisegnareeriempiredicoloreognitipodiforma.
DISEGNARESTELLEPIENEComeultimoesempio,aggiungeremounpo’dicoloreallastellacheabbiamodisegnatoprima.Ilcodiceoriginaleeraquesto:
Suquestabase,costruiamooraunafunzionemiastella.Useremoglienunciatiifdellafunzionemioquadratoeaggiungeremoilparametrolato.
Nelleprimeduerighediquestafunzione,verifichiamosepienoèTrue,eseloèiniziamoilriempimento.Verifichiamoancoranelleultimeduerighee,sepienoèTrue,concludiamoilriempimento.Comenellafunzionemioquadrato,passiamoillatodellastellanelparametrolatoeusiamoquelvalorequandochiamiamot.forward.
Orareinizializziamoilcanvas,impostiamoilcoloreadorato(90percentodirosso,75percentodiverdee0percentodiblu),poichiamiamolafunzione.
Latartarugadisegneràlastellacolorata:
Peraggiungereuncontornoallastella,possiamocambiareilcoloreinneroeridisegnarelastellasenzariempimento:
Eoraabbiamounastelladorataconuncontornoinnero:
CHECOSAAVETEIMPARATO
Inquestocapitolo,aveteimparatocomeusareilmoduloturtleperdisegnarealcuneformegeometrichedibase,medianteicicliforeglienunciatiifpercontrollarequellochefalatartaruga.Abbiamomodificatoilcoloredellapennaeriempitoleformedisegnate.Abbiamoancheriusatoilcodicedidisegnopercrearealcunefunzionichesemplificanoildisegnodiformeconcoloridiversiconun’unicachiamataaunafunzione.
ROMPICAPODIPROGRAMMAZIONENegliesperimentiseguenti,dovretedisegnarequalcheformaconlatartaruga.Comesempre,lesoluzionisipossonotrovareall’indirizzohttp://python-for-kids.com.
1.DISEGNAREUNOTTAGONOInquestocapitoloabbiamodisegnatostelle,quadratierettangoli.Checosaneditedicreareunafunzionechedisegniunaformaaottolati,comeunottagono?(Suggerimento:provateafarruotarelatartarugadi45gradi.)
2.DISEGNAREUNOTTAGONOPIENO
Oracheaveteunafunzionechedisegnaunottagono,modificatelainmodochedisegniunottagonopieno.Provateadisegnareunottagonoconuncontorno,comeabbiamofattoconlastella.
3.UN’ALTRAFUNZIONEPERDISEGNARESTELLECreateunafunzioneperdisegnareunastellacheprendadueparametri:illatoeil
numerodellepunte.L’iniziodellafunzionesaràanalogoaquesto:
IMPOSTAREILCOLOREDiamounpo’dicoloreallanostragrafica.Modifichiamolafunzionerandom_rectangleinmododapassarleuncoloreperilrettangolocomealtroparametro(fill_color).Inseritequestocodiceinunnuovofileesalvateloconilnomecolorrect.py:
Lafunzionecreate_rectangleoraprendeunparametrofill_color,chespecificailcoloredausareneldisegnareilrettangolo.
Possiamopassareallafunzioneicoloripernome,comenell’esempiochesegue(utilizzandounateladi400pixelper400pixel)inmododacreareunaseriedirettangolidicolorediverso.Sevoleteprovarequestoesempio,potetecopiaree
incollareperevitarediriscriveremoltevolteglistessicaratteri.Selezionateiltestodacopiare,premeteCTRL+Cpercopiarlo,fateclicsuunarigavuotaepremeteCTRL+Vperincollare.Scrivetelaprimariga,poilacopiate,laincollateemodificatesololapartechevaria.Aggiungetequestocodiceacolorrect.py,subitosottolafunzione):
Moltidiquesticoloriindicatipernomevisualizzerannoicoloricheviaspettate,maaltripotrebberoprodurreunmessaggiodierrore(asecondacheusiateWindows,MacOSXoLinux).
Masevolessimouncolorespecialechenonhaunnome?RicordatedalCapitolo11cheabbiamoimpostatoilcoloredellapennadellatartarugausandopercentualideicolorirosso,verdeeblu.Impostarelaquantitàdiciascuncoloreprimario(rosso,verdeeblu)perottenereunacombinazionedicoloreintkinterèleggermentepiùcomplicato.
Lavorandoconilmoduloturtleabbiamocreatoilcoloredoratousandoil90percentodirosso,il75percentodiverdeenienteblu.Intkinter,sipuòcrearelostessocolorecosì:
Ilsegno#(cancellettoodiesis)davantialvaloreffd800diceaPythonchequellochesegueèunnumeroesadecimale.L’esadecimaleèunsistemadirappresentazionedeinumeriutilizzatocomunementenellaprogrammazioneinformatica.Usaunabase16(comesimbolisiusanolecifreda0a9equindileletteredaAaF)anzichélabase10(simbolilecifreda0a9)delsistemadecimale.Senonaveteancorastudiatolebasiinmatematica,bastasappiatechesipuòconvertireunnormalenumerodecimaleinesadecimaleutilizzandounsegnapostodiformatoinunastringa:%x(tornateavedere“Incorporarevalorinellestringhe”apagina30).Peresempio,perconvertireilnumerodecimale15inesadecimale,potetefarecosì:
Peresseresicuricheilnostronumeroabbiaalmenoduecifre,possiamomodificareleggermenteilsegnapostodiformatoinquestomodo:
Ilmodulotkintermetteadisposizioneancheunmodofacileperottenereunvaloreesadecimaleperuncolore.Provateadaggiungerequestocodiceacolorrect.py(poteteeliminarelealtrechiamateallafunzionerandom_rectangle).
Viverràpresentataunafinestraperlasceltadelcolore.
Se,anzichédafile,dateilcomandodallashell,selezionateuncoloreefateclicsuOK,verràvisualizzataunatupla,checontieneunatuplacontrenumerieunastringa:
Itrenumerirappresentanolequantitàdirosso,verdeeblu.Intkinter,laquantitàdiciascuncoloredausareinuncolorecompostoèrappresentatadaunnumerocompresofra0e255(cheèdiversodall’usareunapercentualeperciascuncoloreprimarioconilmoduloturtle).Lastringanellatuplacontienelaversioneesadecimalediquestitrenumeri.
Potetecopiareeincollareilvalorestringadautilizzareoppurememorizzarelatuplacomeunavariabile,poiusarel’indiceposizionaledelvaloreesadecimale.
Proviamoausarelafunzionerandom_rectanglepervederecomefunziona:
Edeccoilrisultato:
DISEGNAREARCHIUnarcoèunaporzionedicirconferenzaodiqualchealtracurva,maperpoternedisegnareunocontkinter,bisognadisegnarloall’internodiunrettangoloconlafunzionecreate_arc,peresempiocosì:
Seavetechiusotuttelefinestretkinter,oaveteriavviatoIDLE,ricordatedireimportaretkinterediricrearelatela:
Questocodiceposizionailverticesuperioresinistrodelrettangolocheconterràl’arcoallecoordinate(10,10),cioèa10pixeldallatosinistroea10pixeldallatosuperioredellafinestra,eilverticeinferioredestroallecoordinate(200,100).Il
parametrosuccessivo,extent,siusaperspecificareigradidell’arco.RicordatedalCapitolo4cheigradisonounmodopermisurareladistanzapercorsasuunacirconferenza.Eccodueesempidiarchi,checorrispondonoaunospostamentorispettivamentedi90edi270gradisuunacirconferenza:
Ilcodiceseguentedisegnadiversiarchi,inmodochepossiatevederechecosasuccedeutilizzandounnumerodigradidiversoconlafunzionecreate_arc.
NOTANell’ultimocasoabbiamousato359gradianziché360,perchépertkinter360è
ugualea0gradi,eseavessimousato360nonavrebbedisegnatonulla.
DISEGNAREPOLIGONIUnpoligonoèunafigurachiusacontreopiùlati.Esistonopoligoniregolaricometriangoli,quadrati,rettangoli,pentagoni,esagoniecosìvia,eanchepoligoniirregolariconlatidiversi,moltipiùlati,eformestrane.
Perdisegnarepoligonicontkinter,bisognadarelecoordinatediciascunpuntodelpoligono.Eccocomesipuòdisegnareuntriangolo:
L’esempiodisegnauntriangolopartendodallecoordinatexey(10,10),perpoipassareallecoordinate(100,10)efinirein(100,110).Quiadestrasivedeilrisultato.
Possiamoaggiungereunaltropoligonoirregolare(unaformaconangoliolatidiversi)conquestocodice:
Quisiparteconlecoordinate(200,10),poisipassaa(240,30),poia(120,100)einfinea(140,120).Tkinterdisegnaautomaticamentel’ultimolato,checongiungeilpuntoindicatodall’ultimacoppiadicoordinateconquelloindicatodallaprimacoppia.Edeccoilrisultatodell’esecuzionediquestocodice:
VISUALIZZARETESTOOltreadisegnareforme,sipuòanchescriveresulcanvasconlafunzionecreate_text.Questafunzioneprendesoloduecoordinate(leposizionixeydeltesto),insiemeconilparametropernomedeltestodavisualizzare.Nelcodicechesegue,creiamolatela,poivisualizziamounafraseallecoordinate(150,100).Salvateloinunfileconilnometesto.py.
Lafunzionecreate_textprendeanchealcunialtriparametriutili,comeuncolorediriempimentodeltesto.Nelcodicechesegue,chiamiamolafunzionecreate_textconlecoordinate(130,120),iltestochevogliamovisualizzareeuncolorediriempimentorosso.
Sipuòanchespecificarelafont(iltipodicarattereusatopervisualizzareiltesto)comeunatuplaconilnomedellafonteilcorpo(dimensione)deltesto.Peresempio,latuplaperilTimescorpo20è('Times',20).Nelcodiceseguente,visualizziamoiltestovoltaavoltainTimescorpo15,Helveticacorpo20,Couriercorpo20epoi26.
Edeccoilrisultatodiquestefunzioniconletrefontspecificateelediverse
dimensioni:
VISUALIZZAREIMMAGINIPervisualizzareun’immaginesuunatelacontkinter,comeprimacosasidevecaricarel’immagineepoiusarelafunzionecreate_imagesull’oggettocanvas.
QualsiasiimmaginesicarichideveessereinunadirectoryaccessibileaPython.Perquestoesempio,abbiamomessolanostraimmaginetest.gifnelladirectoryC:\,cheèladirectoryradice(quellafondamentale)dell’unitàdiscoC:,mavoipotetemetterladovevolete.
SeusateunsistemaMacoLinux,potetemetterel’immaginenelladirectoryHome.Senonriusciteasalvaredeifilenell’unitàC:,potetemetterel’immaginesuldesktop.
NOTAContkinter,sipossonocaricaresoloimmaginiGIF,cioèfilediimmagineconestensione.gif.Potetevisualizzareanchealtritipidiimmagini,peresempioPNG(.png)eJPG(.jpg),madovreteusareunaltromodulo,peresempiolaPythonImagingLibrary(http://www.pythonware.com/products/pil/).
Possiamovisualizzarel’immaginetest.gifinquestomodo:
Nelleprimequattrorighe,impostiamolatelacomenegliesempiprecedenti.Nellaquintariga,l’immaginevienecaricatanellavariabilemia_immagine.CreiamoPhotoImageconladirectory'c:\\test.gif'.SeavetesalvatolaPhotoImagesuldesktop,dovetecrearelaPhotoImageindicandoquellaposizione,chesaràqualcosadisimileaquesto:
Unavoltachel’immagineèstatacaricatanellavariabile,canvas.create_image(0,0,anchor=NW,image=mia_immagine)lavisualizzaconlafunzionecreate_image.Lecoordinate(0,0)sonoquelledelpuntoapartiredalqualeverràvisualizzatal’immagineeanchor=NWdiceallafunzionediusarel’angolosuperioresinistro(NWstaper“nord-ovest”)dell’immaginecomepuntodipartenzaneldisegnarla(altrimentiuserebbeilcentrodell’immaginecomepuntodipartenza,perimpostazionepredefinita).L’ultimoparametropernome,image,puntaallavariabileperl’immaginecaricata.Eccoilrisultato:
CREAREUN’ANIMAZIONEDIBASEAbbiamovistofinquicomecrearedisegnistatici,cioèimmaginichenonsimuovono.Eseprovassimoacreareun’animazione?
L’animazionenonènecessariamenteunaspecialitàdelmodulotkinter,mapuòcomunqueessereutileperqualcosadisemplice.Peresempio,possiamocreareuntriangolopienoepoifarlomuoverelungoloschermoconilcodiceseguente(nondimenticate:selezionateFile>NewFile,salvateillavoro,poieseguiteilcodiceconRun>RunModule):
Quandoeseguitequestocodice,iltriangolocominceràamuoversisulloschermo,finoallafinedelsuopercorso:
Comefunziona?Comeprima,nelleprimetrerigheabbiamoimportatotkinterevisualizzatouncanvas.Nellaquartariga,abbiamocreatoiltriangoloconquestafunzione:
NOTAQuandoinseritequestariga,sulloschermoverràstampatounnumero:èunidentificatoredelpoligono.Losipuòusareperfareriferimentoallafigura,comevedremonell’esempioseguente.
Poiabbiamocreatouncicloforchecontada0a59,partendodaforxinrange(0,60):.Ilbloccodicodicenelciclofaspostareiltriangolo.Lafunzionecanvas.movespostaqualsiasioggettosiastatodisegnatoaggiungendodeivaloriallesuecoordinatexey.Peresempio,concanvas.move(1,5,0)spostiamol’oggettoconID1(l’identificatoredeltriangolo)di5pixelversodestraedi0pixelversoilbasso.Perriportarloallaposizioneprecedente,potremmousarelafunzioneconunvalorenegativo,canvas.move(1,-5,0).
Lafunzionetk.update()costringetkinteradaggiornareloschermo(ridisegnarlo).Senonavessimousatoupdate,tkinteravrebbeaspettatolaconclusionedelcicloprimadispostareiltriangolo,ilchesignificachel’avrestevistosaltareallaposizionefinale,anzichéspostarsiprogressivamente.Larigafinaledelciclo,time.sleep(0.05),diceaPythondiaspettareunventesimodisecondo(0,05secondi),primadiprocedere.
Perfarspostareiltriangolodiagonalmentesulloschermo,possiamomodificareilcodicechiamandomove(1,5,5).Createunnuovofile(File>NewFile)perquestocodice:
•
•
Questocodiceèdiversodalprecedenteperdueaspetti:
Abbiamocreatounateladialtezza400,anziché200pixel,concanvas=Canvas(tk,width=400,height=400).Sommiamo5allecoordinatexeydeltriangoloconcanvas.move(1,5,5).
Unavoltasalvatoilcodice,lopoteteeseguire,edeccolaposizionedeltriangoloallafinedelciclo:
Perfarspostareiltriangolodiagonalmentedaquestaposizioneaquelladipartenza,usategliincrementinegativi-5,-5.Aggiungetequestocodiceallafinedelfile:
FARREAGIREUNOGGETTOPossiamofareinmodocheiltriangoloreagiscaquandoqualcunopremeuntasto,utilizzandoglieventbinding(collegamentiaeventi).Glieventisonocosechesiverificanomentreunprogrammaèinesecuzione:qualcunomuoveilmouse,preme
untastoochiudeunafinestra.Sipuòdireatkinterdifareattenzioneaquestieventie,quandoseneverificauno,dirispondereinqualchemodo.
Percominciareagestireglieventi(cioèperfarfarequalcosaaPythonquandosiverificaunevento),creiamoprimaunafunzione.Lapartedicollegamento(binding)arrivaquandosidiceatkintercheunaparticolarefunzioneèlegata(oassociata)auneventospecifico;inaltreparole,verràchiamataautomaticamentedatkinterpergestirequell’evento.
Peresempio,perfaresìcheiltriangolosimuovaquandosipremeiltastoINVIO,possiamodefinirequestafunzione:
Lafunzioneprendeununicoparametro(event),chetkinterusaperinviareinformazioniallafunzioneinmeritoall’evento.Oradiciamoatkinterchequestafunzionedeveessereusataperunparticolareevento,utilizzandolafunzionebind_allsulcanvas.Ilcodicecompletoèquesto:
Ilprimoparametrodiquestafunzionedescrivel’eventoacuivogliamochetkinterfacciaattenzione.Inquestocaso,sichiama<KeyPress-Return>,ovvero“pressionedeltastoINVIOORETURN”.DiciamoatkinterchelafunzionemovetriangledeveesserechiamataognivoltachesiverificaquestoeventoKeyPress.Eseguitequestocodice,fateclicsulcanvasconilmouse,poiprovateapremereINVIO.
Esevolessimocambiareladirezionedeltriangoloinbaseaitastipremuti,peresempioitastifreccia?Nonèdifficile.Bastamodificarelafunzionemovetriangleinquestomodo:
L’oggettoeventpassatoamovetrianglecontienediversevariabili.Unaèkeysym(abbreviazionedikeysymbol,simbolodeltasto),unastringacontenenteilvaloredeltastopremuto(Upèlafrecciaversol’alto,Downquellaversoilbasso,LefteRightsinistraedestra).Larigaifevent.keysym=='Up':dicecheselavariabilekeysymcontienelastringa'Up'dobbiamochiamarecanvas.moveconiparametri(1,0,-3),comefacciamonellarigasuccessiva.Sekeysymcontiene'Down',lacondizioneelifevent.keysym=='Down':saràveraeverràchiamatalafunzioneconiparametri(1,0,3),ecosìvia.
Ricordate:ilprimoparametroèilnumeroidentificativodellaformadisegnata,ilsecondoèilvaloredasommareallacoordinatax,ilterzoilvaloredasommareallacoordinatay.
Poidiciamoatkinterdiusarelafunzionemovetrianglepergestireglieventidiquattrodiversitasti(up,down,lefteright).Quidiseguitosivedecomesipresentailcodiceaquestopunto.Perinserirequestocodice,saràtuttopiùfacilesecreateunnuovofile(selezionandoFile>NewFile).Primadieseguireilcodice,salvateilfileconunnomesignificativo,peresempiotriangoloinmoto.py.
Nellaprimarigadellafunzionemovetriangle,controlliamosekeysymcontiene'Up',in 1 .Sesì,spostiamoiltriangoloversol’altoconlafunzionemoveeiparametri1,0,-3,in 2 .Ilprimoèl’identificatoredeltriangolo,ilsecondolospostamentoversodestra(nonvogliamospostarloinorizzontale,perciòè0)eilterzoèlospostamentoversoilbasso(negativo,perchévogliamoandareversol’alto,-3pixel).
Poiverifichiamosekeysymcontiene'Down'in 3 e,sesì,spostiamoiltriangolo
versoilbasso(di3pixel)in 4 .L’ultimocontrolloèseilvaloreè'Left',in 5 e,sesì,spostiamoiltriangoloversosinistra(-3pixel)in 6 .Selavariabilenoncontienenessunodiquestivalori,l’ultimoelsein 7 spostailtriangoloversodestrain 8 .Orailtriangolosimuoverànelladirezioneindicatadaltastofrecciachevienepremuto.
ALTRIMODIPERUSAREL’IDENTIFICATOREOgnivoltachesiusaunafunzionecreate_delcanvas,comecreate_polygonocreate_rectangle,vienerestituitounidentificatore.Questonumeroidentificativopuòessereutilizzatoconaltrefunzioni,comeabbiamofattoinprecedenzaconlafunzionemove:
Ilproblemaèchecreate_polygonnonrestituiscesempre1.Peresempio,seavetecreatoaltreforme,potrebberestituire2,3oanche100(asecondadelnumerodelleformecheavetecreato).Seperòmodifichiamoilcodiceinmododamemorizzareinunavariabileilvalorerestituito,epoiusiamolavariabile(anzichéfareriferimentosemplicementealnumero1),ilcodicefunzionerà,indipendentementedaqualesiailnumerorestituito:
Lafunzionemovecipermettedispostareoggettisulloschermomedianteilloroidentificatore.Esistonoperòaltrefunzionichepossonomodificareinqualchemodoquelcheabbiamodisegnato.Peresempio,lafunzioneitemconfigdelcanvassipuòusarepermodificarequalcunodeiparametridiunaforma,peresempioicoloridiriempimentoedicontorno.
Supponiamodiavercreatountriangolorosso:
Possiamocambiareilcoloredeltriangoloutilizzandoitemconfig,conl’identificarecomeprimoparametro.Ilcodicecheseguedice:“Cambiainbluilcolorediriempimentodell’oggettoidentificatodalnumeroconservatonella
variabilemiotriangolo”:
Possiamoanchedareuncolorediversoalcontornodeltriangolo,sempreconl’identificatorecomeprimoparametro:
Piùavanti,vedremocomeapportareulteriorimodificheaundisegno,peresempionasconderloepoirenderlonuovamentevisibile.Questocisaràutile,quandoinizieremoascriveregiochi,nelprossimocapitolo.
CHECOSAAVETEIMPARATOInquestocapitolo,aveteusatoilmodulotkinterperdisegnaresempliciformegeometriche,visualizzareimmaginiesemplicianimazioni.Avetevistocomeusareglieventbindingperfarsìcheidisegnireagiscanoallapressionedeitasti,ilchesaràutilequandoinizieremoaprogrammareungioco.Avetevistocomelefunzionidicreazionediformeintkinterrestituiscanounnumeroidentificativo,utilizzabilepermodificareleformedopochesonostatedisegnate,peresempioperspostarlesulloschermoopermodificarneilcolore.
ROMPICAPODIPROGRAMMAZIONECimentateviconquestiesercizi,persperimentareancoraconilmodulotkintereconqualchesempliceanimazione.Lesoluzionisitrovanosulsitohttp://python-for-kids.com/.
1.RIEMPIRELOSCHERMODITRIANGOLICreateunprogrammacheusitkinterperriempireloschermoditriangoli.Poimodificareilcodicecosìdariempireloschermocontriangolidicoloridiversi.
2.ILTRIANGOLOMOBILE
Modificateilcodicedeltriangolochesimuove(“Creareanimazionisemplici”apagina183)perchésispostisulloschermoprimaadestra,poiinbasso,poiasinistraeinfineversol’altofinoallaposizionedipartenza.
3.LAFOTOCHESIMUOVEProvateavisualizzarecontkinterunafoto.Ricordate:deveessereun’immagineGIF!Riusciteaspostarlasulloschermo?
AGGIUNGERELARACCHETTANonc’èmoltodichedivertirsiconunapallacherimbalza,senonsihanullaconcuicolpirla.Èvenutoilmomentodicreareunaracchetta!
CominciateaggiungendoilcodiceseguentesubitodopolaclasseBall,percreareunaracchetta(laaggiungeretecreandounanuovarigasottolafunzionedrawdellapalla):
IlcodiceaggiuntoèquasiidenticoaquellodellaclasseBall,trannechechiamiamolafunzionecreate_rectangle(anzichécreate_oval)espostiamoilrettangolonellaposizione200,300(200pixeldasinistrae300pixeldall’alto).
Poi,allafinedellistato,createunoggettodellaclassePaddleemodificateilcicloprincipaleinmodochechiamilafunzionedrawdellaracchetta,così:
Seeseguiteilgiocoaquestopunto,dovrestevederelapallacherimbalzaeunaracchettarettangolareimmobile:
SPOSTARELARACCHETTAPerspostarelaracchettaasinistraeadestra,useremoicollegamentiaeventipercollegareitasticonlefreccesinistraedestraanuovefunzionidellaclassePaddle.Quandoilgiocatorepremeiltastofrecciasinistra,lavariabilexverràimpostataa-2(perspostareasinistra);lapressionedeltastofrecciadestraimpostainvecelavariabilexa2(perspostareadestra).
Ilprimopassoèaggiungerelavariabiled’oggettoxallafunzione__init__dellaclassePaddle,eunavariabileperlalarghezzadelcanvas,comeabbiamofattoperlaclasseBall:
Oraabbiamobisognodellefunzionipercambiaredirezione,versosinistra(turn_left)eversodestra(turn_right).Leaggiungiamosubitodopolafunzionedraw:
Possiamolegarequestefunzionialtastocorrispondentenellafunzione__init__dellaclasse.Abbiamousatoilcollegamento(binding)in“Farreagireunoggetto”apagina186,inmodochePythonchiamasseunafunzioneallapressionediuntasto.Inquestocaso,leghiamolafunzioneturn-leftdellanostraclassePaddlealtastofrecciasinistraconilnomedievento'<KeyPress-Left>'.Poileghiamolafunzioneturn-rightaltastofrecciadestrausandoilnomedievento'<KeyPress-Right>'.Lafunzione__init__oraèfattainquestomodo:
LafunzionedrawperlaclassePaddleèsimileaquellaperlaclasseBall:
Usiamolafunzionemovedelcanvasperspostarelaracchettanelladirezionedellavariabilexconself.canvas.move(self.id,self.x,0).Poiricaviamolecoordinatedellaracchettapervedereseharaggiuntoilbordosinistroodestrodelloschermoutilizzandoilvaloreinpos.
Anzichérimbalzarecomelapalla,laracchettadevesmetteredimuoversi.Così,quandolacoordinataxdisinistra(pos[0])èminoreougualea0(<=0),impostiamolavariabilexa0conself.x=0.Nellostessomodo,quandolacoordinataxdidestra(pos[2])èmaggioreougualeallalarghezzadelcanvas(>=self.canvas_width),impostiamolavariabilexa0conself-x=0.
NOTASeeseguiteilprogrammaora,dovretefareclicsulcanvasperchéilgiocoriconoscaleazionideitastifreccia.Conilclicilcanvasriceveilfocus,cioè“sa”diaverelaresponsabilitàdireagirequandoqualcunopremeuntastosullatastiera.
SCOPRIREQUANDOLAPALLACOLPISCELARACCHETTAAquestopuntodelnostrocodice,lapallanoncolpiràlaracchetta,mavipasseràattraversocomesefosseunfantasma.Lapalladevesaperequandocolpiscelaracchetta,esattamentecomedevesaperequandocolpisceunodeibordi.
Possiamorisolvereilproblemaaggiungendodelcodiceallafunzionedraw(doveabbiamogiàilcodicechecontrollal’arrivoaibordi),maèmegliospostarequestotipodicodiceinnuovefunzioni,persuddividereiltuttoinpartipiùpiccole.Semettiamotroppocodiceinunostessoluogo(all’internodiunafunzione,peresempio),quelcodicediventapiùdifficiledacapire.Facciamoicambiamentinecessari.
Perprimacosa,modifichiamolafunzione__init__dellapalla,perpoterpassare
l’oggettopaddlecomeparametro:
Notatechein 1 abbiamomodificatoilparametrodi__init__inmododaincluderelaracchetta.Poi,in 2 ,assegniamoilparametropaddleallavariabiledioggettopaddle.
Avendosalvatol’oggettopaddle,dobbiamomodificareilcodiceconcuicreiamol’oggettoball.Questocambiamentovainfondoalprogramma,subitoprimadelcicloprincipale:
Ilcodicedicuiabbiamobisognopervedereselapallahacolpitolaracchettaèunpo’piùcomplicatodiquelloconcuisicontrollasesonostatiraggiuntiibordi.Chiameremoquestafunzionehit_paddleelaaggiungeremoallafunzionedrawdellaclasseBall,dovevediamoselapallaharaggiuntoilfondodelloschermo:
Comepotetevederenelnuovocodicecheabbiamoaggiunto,sehit_paddlerestituisceTrue,cambiamoladirezionedellapallaimpostandolavariabileya-3conself.y=-3.Nonprovateaeseguireilgiocoaquestopunto:nonabbiamoancoracreatolafunzionehit_paddle.Facciamoloora.
Aggiungetelafunzionehit_paddlesubitoprimadellafunzionedraw.
Comeprimacosa,definiamolafunzioneconilparametropos,in 1 .Questarigacontienelecoordinateattualidellapalla.Poi,in 2 ,otteniamolecoordinatedellaracchettaeleconserviamonellavariabilepaddle_pos.
In 3 ,abbiamolaprimapartedelnostroenunciatoif-then,ediciamo“Seillatodestrodellapallaèmaggioredellatosinistrodellaracchetta,eillatosinistrodellapallaèminoredellatodestrodellaracchetta…”.Qui,pos[2]contienelacoordinataxperl’estremodestrodellapalla,pos[0]contienelacoordinataxdelsuoestremosinistro.Lavariabilepaddle_pos[0]contienelacoordinataxdell’estremosinistrodellaracchetta,paddle_pos[2]contienelacoordinataxdelsuoestremodestro.ildiagrammaseguentemostraquestecoordinatequandolapallastapercolpirelaracchetta.
Lapallastascendendoversolaracchetta,masivedechel’estremodestrodellapalla(pos[2])nonhaancorasuperatol’estremosinistrodellaracchetta(cheèpaddle_pos[0]).
In 4 ,vediamosel’estremoinferioredellapalla(pos[3])èfralapartesuperioredellaracchetta(paddle_pos[1])elasuaparteinferiore(paddlepos[3]).Neldiagrammaseguente,potetevederechel’estremoinferioredellapalla(pos[3])nonhaancoraraggiuntolapartesuperioredellaracchetta(paddle_pos[1]).
Perciò,inbaseallaposizioneattualedellapalla,lafunzionehit_paddlerestituirebbeFalse.
NOTAPerchédobbiamovedereseilpuntoinferioredellapallasitrovafralapartesuperioreequellainferioredellaracchetta?Perchéognivoltachespostiamolapallasulloschermo,lafacciamospostaredi3pixelallavolta.Secontrollassimosemplicementeselapallaharaggiuntolapartesuperioredellaracchetta(pos[1]),potremmogiàaversuperatoquellaposizione.Inquelcasolapallacontinuerebbelungolasuatraiettoriaepasserebbeattraversolaracchettasenzafermarsi.
AGGIUNGEREUNELEMENTODICASUALITÀÈvenutoilmomentoditrasformareilnostroprogrammainungioco,anzichéinunsemplicemovimentodipallaeracchetta.Inungiocodeveesserciunelementodicasualità,unqualchemodopercuiilgiocatorepuòperdere.Nelnostrogioco,cosìcom’è,lapallarimbalzeràpersempre,perciònonc’ènientedaperdere.
Concluderemoilnostrogiocoaggiungendodelcodicechedicecheilgiocosiconcludeselapallacolpisceilfondodelcanvas(inaltreparole,secadeaterra).
Comeprimacosa,aggiungiamolavariabiledioggettohit_bottominfondoalla
funzione__init__dellaclasseBall:
Poimodifichiamoilcicloprincipale,infondoalprogramma,inquestomodo:
Orailciclocontinuaaverificarehit_bottom,pervedereselapallahacolpitoilfondodelloschermo.Ilcodicecontinueràafarspostarepallaeracchettasoloselapallanonhacolpitoilfondo,comesivedenell’enunciatoif.Ilgiocoterminaquandopallaeracchettasmettonodimuoversi.
L’ultimamodificaènellafunzionedrawdellaclasseBall:
Abbiamomodificatol’enunciatoifinmodochecontrolliselapallahacolpitoilfondodelloschermo(cioèselasuaposizioneèmaggioreougualeacanvas_height).Seècosì,nellarigasuccessiva,impostiamohit_bottomaTrue,anzichémodificareilvaloredellavariabiley,perchénonc’èpiùbisognodifarrimbalzarelapalla,unavoltachehacolpitoilfondodelloschermo.
Seadessoeseguiteilgiocoenonriusciteacolpirelapallaconlaracchetta,ognimovimentosulloschermodovrebbecessare,eilgiocofinirànonappenalapallatoccailfondodelcanvas:
Ilprogrammacompletoorasaràcomenelcodiceseguente.Seavetedifficoltàafarfunzionareilgioco,confrontatequellocheaveteinseritoconquestocodice.
CHECOSAAVETEIMPARATOInquestocapitolo,abbiamofinitodicreareilnostroprimogiococonilmodulotkinter.Abbiamocreatoclassiperlaracchettautilizzatanelgiocoeabbiamousatolecoordinateperverificarequandolapallacolpiscelaracchettaoibordidelcanvasdigioco.Abbiamousatoicollegamentiaeventiperlegareitastifrecciasinistraedestraalmovimentodellaracchettaeabbiamousatoilcicloprincipaleper
chiamarelafunzionedraweanimarelaracchetta.Infine,abbiamomodificatoilcodiceperinserirenelgiocounelementodicasualitàeorailgiocosiconcludequandolapallacolpisceilfondodelcanvas.
ROMPICAPODIPROGRAMMAZIONEPerilmomento,ilnostrogiocoèmoltosemplice.Potetemodificaremoltecose,percreareungiocopiùprofessionale.Provateadarricchireilcodicesecondoisuggerimenticheseguono,poiverificatelevostresoluzionisulsitohttp://python-for-kids.com/.
1.RITARDAREL’AVVIODELGIOCOIlnostrogiocoiniziaunpo’tropporapidamente,ebisognafareclicsulcanvasperchériconoscalapressionedeitastifrecciasullatastiera.Poteteaggiungereunritardoall’avviodelgioco,inmododadarealgiocatoreuntemposufficienteperfareclicsulcanvas?Ancorameglio,riusciteadaggiungereuncollegamentoaeventoperunclicdelmouse,inmodocheilgiocopartasoloinquelmomento?
Suggerimento1:avetegiàaggiuntocollegamentiaeventiperlaclassePaddle:quellopuòessereunpuntodipartenza.
Suggerimento2:ilcollegamentoaeventoperilpulsantesinistrodelmouseèlastringa'<Button-1>'.
2.UNADEGUATO“GAMEOVER”Quandoilgiocofinisce,semplicementetuttosicongela,enonèunmodomoltoamichevoleneiconfrontidelgiocatore.Provateadaggiungereiltesto“GameOver”quandolapallacolpisceilfondodelloschermo.Poteteusarelafunzionecreate_text,mapotrestetrovareutileancheilparametroconnomestate(prendevaloricomenormalehidden,cioè“normale”e“nascosto”).Dateun’occhiataaitemconfigin“Altrimodiperusarel’identificatore”apagina188.Comeulterioresfida,aggiungeteunritardo,perchéiltestononappaiasubito.
3.ACCELERARELAPALLASegiocateatennis,sapeteche,quandounapallacolpiscelaracchetta,avoltesiallontanaaunavelocitàsuperioreaquellaconcuièarrivata,asecondadellaforzadelvostrocolpo.Nelnostrogiocolapallaviaggiasempreallastessavelocità,qualunquecosafaccialaracchetta.Provateamodificareilprogramma,inmodochelavelocitàdellaracchettasiatrasferitaallavelocitàdellapalla.
4.REGISTRAREILPUNTEGGIOCheneditediregistrareilpunteggio?Ognivoltachelapallacolpiscelaracchetta,ilpunteggiodeveaumentare.Provateavisualizzareilpunteggionell’angolosuperioredestrodelcanvas.Poteteriguardarecomesiusaitemconfig,apagina188,perricavarneunsuggerimento.