LERENPROGRAMMERENMETPYTHON CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
INLEIDING
Digitaleleeromgeving
Bijsommigeopdrachtenhebjehulpmiddelennodig.Bijvoorbeeldfilmpjes,formulierenofeenlinknaareen website.Dezestaanallemaalindedigitaleleeromgeving.Diticoontjeverwijstnaardedigitaleleeromgeving.Om hiertekomengajenaardigitaal.boomonderwijs.nl/beroepsonderwijs.
Eerstekeerinloggenindedigitaleomgeving
Voordatjededigitaleleeromgevingkuntgebruiken,moetjejelicentieactiveren.
• Overlegmetjedocentwelktypeaccountjegebruikt.
• Ganaarwww.boomberoepsonderwijs.nl/licentie.
• Bekijkdeinstructiefilmofleeshetstappenplan.
• Volgdestappen.
Daarnakunjeaandeslag!
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Inleiding
InditboekgaanweaandehandvanpraktischevoorbeeldendeprogrammeertaalPythonleren.Erwordtgeen voorkennisophetgebiedvanprogrammerenvereist.Welwordtpraktischeinzetverwacht.Eenprogrammeertaal lerenisalleentheoretischvrijwelniettedoen.Jemoetdecodewerkelijktypenenlerenvandefoutendieje daarbijmaakt.Vankopiërenenplakkenleerjeniets.
Bijelkonderdeelwordenopdrachtengegeven,zodatdestofkanwordengeoefend.Metdeopdrachtenwordt geprobeerdomrealistischevoorbeeldenuitdepraktijkweertegeven.Delaatsteopdrachtiseenrelatiefgrote opdrachtdiealleelementenderevuelaatpasseren.
WaaromPython?
Pythoniseenkrachtigeobjectgeoriënteerdetaaldiemakkelijktelerenis.Dezetaalgroeithardinpopulariteit, zowelbijbeginnendeontwikkelaarsalsbijprofessionals.Pythondraaitopmeerdereplatformen,waaronder MicrosoftWindows,LinuxenMacOS.EenstandaardinstallatievanPythonisergcompleet,waardoorjestandaard alheelveelfunctionaliteittotjebeschikkinghebt.Jehebtdirectalbeschikkingoverzeercompletebibliotheken voordeontwikkelingvandemeestuiteenlopendeapplicaties.Vandaardatzezeggen:'Python,batteriesincluded.'
DetaalisontworpendoordeNederlanderGuidovanRossumenuitgebrachtin1991.Debelangrijksteeiswaseen hogeleesbaarheidvandecode.Ditwordtvooralbereiktdoordezogenoemde‘whitespace’eneeneenvoudige krachtigesyntax.
GrotebedrijvenalsGoogle,Instagram,DropBoxenMozillagebruikenPythonvoorhunbackenden/offrontend applicaties.IndewereldvandewetenschapwordtPythonveelgebruiktvoorbijvoorbeeldonderzoeksprojectenen analysevanbigdata.TerwijlhetdoorDevOps,indeservicemanagementwereld,vooralalsscriptingtaalwordt gebruiktvoorhetautomatiserenenbeherenvanenormeserverparken.Bijvoorbeeldindecloud.
DelageinstapdrempelvanPythonzorgtervoordatjeeenvoudigeenkrachtigescriptskuntmaken.Wanneerde applicatiecomplexerwordtenmeerfunctionaliteitvereist,kunjeeenvoudigopschalennaarmodulair programmeren.Nogeenstapverderisobjectgeoriënteerdprogrammeren.Hetismogelijkomdezemethoden vanontwikkelendoorelkaartegebruiken.Jekuntdaardoorzeereenvoudigescriptsencomplete objectgeoriënteerdeenterpriseapplicatiesontwikkelen.
2
Leerdoelen
1. JekuntnahetmakenvandeopdrachtenuithetboekPythoninzettenomvoorverschillendereallife programmeersituatiesapplicatiesteontwikkelen.
2. JekuntineenIntegratedDevelopmentEnvironment(IDE)Python-applicatiesontwikkelen.
3. JekentdebelangrijkstedatatypeninPythonenweetdezeintezetteninapplicaties.
4. Jekuntzowelindividueleapplicatiesalsgroepsapplicatiesontwikkelen.
5. Jekunttekst-,csv-enExcelbestandenlezenenschrijven.
6. Jekunteenwebserviceaanroepen,deontvangendatalezenendegewenstedataversturen.
7. JekuntmethetFlask-frameworkeendynamischewebpaginamaken.
8. JekuntmethetMQTT-protocolcommunicerenmetandereapplicatiesenInternetofThings(IoT)devices.
Elkblokbestaatuit:
• Theorie, begrippen en opdrachten
Hierbijleerjeprogrammerenenoefenjemetpraktijkgerichteopdrachten.
• Test je kennis
Hiermeekunjezelfjekennisvandetheorietesten.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
3
COLOFON
BoomBeroepsonderwijs info@boomberoepsonderwijs.nl www.boomberoepsonderwijs.nl
Auteurs:RobertSaunders
Eindredactie:<<Vulhierdenaamvandeeindredacteurin.>>
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Titel:LerenprogrammerenmetPython
ISBN:9789037267464
Eerstedruk/eersteoplage
©2024BoomBeroepsonderwijs|Boom
BehoudensdeinofkrachtensdeAuteurswetgesteldeuitzonderingenmagnietsuitdezeuitgaveworden verveelvoudigd,opgeslagenineengeautomatiseerdgegevensbestand,ofopenbaargemaakt,inenigevormof openigewijze,hetzijelektronisch,mechanisch,doorfotokopieën,opnamenofenigeanderemanier,zonder voorafgaandeschriftelijketoestemmingvandeuitgever.
Voorzoverhetmakenvanreprografischeverveelvoudigingenuitdezeuitgaveistoegestaanopgrondvanartikel 16hAuteurswetdientmendedaarvoorwettelijkverschuldigdevergoedingentevoldoenaandeStichtingReprorecht (www.reprorecht.nl).Voorhetovernemenvaneen(ofmeerdere)gedeelte(n)uitdezeuitgaveinbijvoorbeeldeen (digitale)leeromgevingofeenreaderinhetonderwijs(opgrondvanartikel16,Auteurswet1912)kanmenzich wendentotStichtingUitgeversorganisatievoorOnderwijslicenties(Postbus3060,2130KBHoofddorp, www.stichting-uvo.nl).
Deuitgeverheefternaargestreefddeauteursrechtenteregelenvolgensdewettelijkebepalingen.Degenendie desondanksmenenzekererechtentekunnendoengelden,kunnenzichalsnogtotdeuitgeverwenden.
Doorhetgebruikvandezeuitgaveverklaartukennistehebbengenomenvanenakkoordtegaanmetdespecifieke productvoorwaardenenalgemenevoorwaardenvanBoomBeroepsonderwijs,tevindenop www.boomberoepsonderwijs.nl.
INHOUD 2 Inleiding 7 BeginnenmetPython 1 8 Installatie 1.1 12 OpdrachtenInteractiefPython 1.2 12 OpdrachtenPythonInterpreterSessie geen 12 OpdrachtenRekenenmetPython geen 14 OpdrachtenVariabelenindeREPL geen 17 OpdrachtenDatatypen geen 18 OpdrachtenStrings geen 19 OpdrachtenPyCharm 1.3 19 OpdrachtensetInstallatievanPyCharm geen 20 OpdrachtensetProjectaanmaken geen 21 OpdrachtensetDebuggen geen 22 TheorieInteractiefPython 1.4 39 TheoriePyCharm 1.5 55 Begrippen 1.6 56 Oefentoets 1.7 60 Praktijkopdrachten 1.8 61 Terugblik 1.9 62 Toets 1.10 67 Collecties 2 68 OpdrachtensetCondities 2.1 71 OpdrachtensetHerhalingen 2.2 72 OpdrachtensetList 2.3 73 OpdrachtensetTuple 2.4 74 OpdrachtensetDictionary 2.5 74 TheorieCollecties 2.6 110 Begrippen 2.7 110 Testjekennis 2.8 130 Praktijkopdrachten 2.9 132 Terugblik 2.10 132 Toets 2.11 143 Bestanden 3 144 OpdrachtensetFoldersenbestanden 3.1 145 OpdrachtensetTekstbestanden 3.2 146 OpdrachtensetCsv-bestanden 3.3 147 OpdrachtensetExcelbestanden 3.4 147 TheorieBestanden 3.5 179 Begrippen 3.6 179 Testjekennis 3.7 183 Praktijkopdrachten 3.8 184 Terugblik 3.9 185 Toets 3.10 5
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
189 HTTP-requests 4 190 OpdrachtensetRequestsbibliotheek 4.1 191 OpdrachtensetQuotewebservice 4.2 192 OpdrachtensetCryptowebservice 4.3 192 TheorieHTTP-requests 4.4 208 Begrippen 4.5 208 Testjekennis 4.6 211 Praktijkopdrachten 4.7 212 Terugblik 4.8 213 Toets 4.9 217 Flask 5 218 OpdrachtensetFlask 5.1 219 OpdrachtensetRouting 5.2 221 OpdrachtensetJinja 5.3 221 TheorieFlask 5.4 228 Begrippen 5.5 228 Testjekennis 5.6 231 Praktijkopdrachten 5.7 232 Terugblik 5.8 233 Toets 5.9 237 MQTT 238 OpdrachtensetMQTTBasis 6.1 239 OpdrachtensetMQTTPublish 6.2 240 OpdrachtensetMQTTClient 6.3 241 TheorieMQTT 6.4 257 Begrippen 6.5 257 Testjekennis 6.6 260 Praktijkopdrachten 6.7 262 Terugblik 6.8 263 Toets 6.9 267 ObjectOriëntedProgramming 7 268 OpdrachtenObjectOriëntedProgramming 7.1 269 OpdrachtenKlasseinPython 7.2 270 OpdrachtenPyGame 7.3 270 TheorieObjectOriëntedProgramming 7.4 306 Begrippen 7.5 306 Testjekennis 7.6 309 Praktijkopdrachten 7.7 311 Terugblik 7.8 311 Toets 7.9 315 Index 6
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Blok1
(ZONDERBEELD-EN TAALREDACTIE)
CONCEPT
BeginnenmetPython
Pythondraaitopmeerdereplatformen,waaronderMicrosoftWindows,LinuxenMacOS.OminPythontekunnen programmeren,moetenwehetPython-installatieprocesdoorlopen.Ditdoenwedoordelaatsteversievande Python-websitetedownloaden.
NasuccesvolleinstallatiekunnenweapplicatiesmakenindePython-programmeertaal.
Leerdoelen
1. JekuntdePythonversievoorjouwplatformselecterenendownloaden.
2. JekuntPythoninstalleren.
3. JekuntverifiërenofdeinstallatievanPythonisgelukt.
1.1 Installatie
Pythondraaitopmeerdereplatformen,waaronderMicrosoftWindows,LinuxenMacOS.BijdehuidigeMicrosoft Window-versies10,11wordtPythonnietstandaardgeïnstalleerd.BijdehuidigeMacOS-versie14Sonomais Python-versie3.9.6geïnstalleerd.BijdehuidigeUbuntu-versie22.04.3LTSstaatPython-versie3.11opdecomputer.
InzoweldesituatievanMacOSalsUbuntuisditnietdelaatsteversie.
OphetmomentvanschrijvenisdehuidigePython-versie3.12.x.Dezemoetenweinstalllerenoponzesystemen. DaarvoorkunnenwedejuisteinstallatiebestandendownloadenvandeofficiëlePython-website:
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
OmdecorrecteversieteinstallerenselecteerjehetplatformwaarjedePython-installatieopwiltinstalleren.
Volgvervolgensdedownloadinstructies.
Tip:TijdensdeinstallatiekunjekiezenofdeinstallatieaanhetPATHmoetwordentoegevoegd.Wanneerjedeze optieselecteert,kunje(ineenterminal)Pythonenhaartoolsvanuitelkefolderstarten.
Zodrajedeinstallatiestart,wordjeaandehandvaneenwizarddoorhetinstallatieprocesgeleid.Dewizardgeeft opeenaantalschermenoptieswaarmeejedeinstallatiekuntpersonaliseren.
Figuur 1.1 Python-installatie start
IndevoorgaandeafbeeldingziejedestartvaneenPython-installatieophetMicrosoftWindows-platform.Onderaan dewizardziejetweeopties:
1. Pythonmetadministratorrechteninstalleren.DitisalleennoodzakelijkalsjePythoninanderefolderswilt installerendanindefoldervandegebruiker.BijvoorbeelddeC:\Python312-folder.OnderMicrosoftWindows magditalleenmetadministratorrechten.
2. DePython-applicatieaandePATH-variabeletoevoegen.Wanneerjedezeoptieselecteert,kunjePython startenvanuitelketerminal.DitgeldtookvoordetoolsdiebijPythonhoren,onderanderedePythonPackage Index.Diezuljeregelmatiggebruiken.
Deeenvoudigsteoptieisomvervolgensop Install Now teklikken.JekrijgtdaneendefaultPython-installatiemet allenoodzakelijkeopties.De Customize installation geeftruimteomdeinstallatietepersonaliseren.
8
Figuur 1.2 Python-set-upproces is gestart
DePython-installatieisinvollegang.Afhankelijkvanjesysteemduurtditslechtseenpaarminuten.
(ZONDERBEELD-EN TAALREDACTIE)
CONCEPT
Figuur 1.3 Python is sucessvol geïnstalleerd
Pythonissuccesvolgeïnstalleerd.Viaenkelezichtbarelinkskunjeextrainformatiekrijgen.Jekuntookdelimiet opdemaximalepath-lengteopheffen.Ditkanhandigzijnbijdiepefolderinfoldernesting.
Wekunnennudeinstallatiegaantesten.
9 Blok1 BeginnenmetPython
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Figuur 1.4 Command terminal om de Python-installatie te testen
Wetestenonzeversie-installatiedooreencommandterminaltestarten.Zodrawedezehebbengestart,kunnen wePythonstarten.Tik python omdeinterpretertestarten.DePython-interpreteristeherkennenaande">>>" alscommandprompt.VanafhierkunnenwebehalvePython-commando’sPython-programma’sen Python-applicatiesstarten.
WekunnennueenPython-programmamakenwaarinwedeklassieke"HelloWorld!"weergeven.Omditte realiserentikkenwe:
print("Hello World!")
10
Figuur 1.5 Klassieke "Hello World!"
Gefeliciteerd,wehebbennuonseerstePython-programmagemaakt.Zodraweopenterdrukten,werdonze programmaregeldoordePython-interpreteruitgevoerd.Hetresultaatwerderdirectonderweergegeven.
Opdracht1 OriëntatieopdrachtLerenprogrammerenmetPython
Bijhetinstallerenvaneenapplicatiehebjealtijdtemakenmetsysteemvereistenvandeapplicatiediejegaat installeren.
Leesgoedwatbijdeverschillendeplatformenstaat.
a. WatisdeminimaleMicrosoftWindows-versiediejenodighebtomPythontekunneninstalleren?
MicrosoftWindowsVista
MicrosoftWindows8
MicrosoftWindows7
MicrosoftWindows10
b. Welkeandereprogrammeertaalhebjenogmeeropjecomputergeïstalleerd?
PHP
JavaScript
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
C#
C++
Nogniets,ikhebneteennieuwelaptop
c. WieheeftdeprogrammeertaalPythonbedacht?
LinusTorvalds
GraceHopper
GuidovanRossum
RobertSaunders
11 Blok1 BeginnenmetPython
1.2 OpdrachtenInteractiefPython
OpdrachtenPythonInterpreterSessie
Opdracht2 PythonInterpreterSessie
RaadpleegzonodigdetheorieoverdePythonInterpreterSessie.
a. WatisdeREPL?
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
b. WaarstaatdeafkortingREPLvoor?
c. WaarvoorkandeREPLgebruiktworden?
d. HoestopjedeREPLnetjesalsjeklaarbent? quit()
CRTL-Z+enter(Linux) exit() stop end()
CTRL-X+enter(Windows,MacOSenLinux)
e. Gebruikdehelp-functieindeREPLomtezienwatdedir-functiedoet.TikdevolgendecodeindeREPLin:
help(dir)
Watdoetdedir-functie?
OpdrachtenRekenenmetPython
Opdracht3 RekenenmetPython
RaadpleegzonodigdetheorieoverRekenenmetPython.
12
a. GebruikdeREPLalsrekenmachineomdevolgendesommenuitterekenen:
2+3
135-49
2834*632
b. DeREPLkanookrekenenmetgebrokengetallen.Rekendevolgendesommenuit:
848/4
0.35/21.673
563.7783*0.553
0.0345*398.53333
c. DeREPLkanookrekenenmetsamengesteldebewerkingenenprioriteiten.Rekendevolgendesommenuit:
35+9*16-7
35+(9*16)-7
(35+9)*16-7
(35+9)*(16-7)
d. Watvoorsoortgetalkrijgjebijeenberekeningmeteendeling?
Geheelgetal
Grootgetal
Gebrokengetal
Natuurlijkgetal
e. Watgaatfoutbijdevolgendeberekening?
300 / ((68 / 2) - 34)
13 Blok1 BeginnenmetPython
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
f. Maakdevolgendeberekeningen,maarnumetdewetenschappelijkenotatie:
2.432e+02+4.32e-06
149.5978707e+09/8.5
16.783e-03-1.295e+02
g. Wewilleneenstukvideovaneendigitalecameraopnemenenopslaan.DecameraheefteenfullHD-resolutie (datis1920x1080)eneentransfervan30fps(framesperseconde).Ditwilzeggendatdecamera30full HD-beeldenpersecondegeeft.Berekenhetaantalbitsdatwepersecondemoetenopslaan.
(ZONDERBEELD-EN
CONCEPT
TAALREDACTIE)
h. WehebbenteranalyseeenongecomprimeerdevideostreamopeenNASstaanvan22247MB.OnzeNASkan maximaal83MB/skopiëren.Hoeveelsecondenduurthetkopiëren?
Opdracht4 Rekenenmetfloordivision//enmodulo%.
Berekenhoeveelurenenminutendespeelfilm"TheAvengers"duurtalsdezestaataangekondigdals143minuten.
OpdrachtenVariabelenindeREPL
Opdracht5 VariabelenindeREPL
RaadpleegzonodigdetheorieoverVariabelenindeREPL.
a. Watzijnallemaalgeldigenamenvoorvariabelen?Erzijnmeerdereantwoordengoed. naam,leeftijd,_merk,opdracht_nummer35
MAXIM_AFSTAND,aantalPersonen,temp,windsnelheid_ Invoer,for,gebouw,bestands_grootte speler,wapen_lijst,top5,__aantal_kogels
14
b. Welkevariabelenamenvoldoenhetbestaandenaamgevingsconventie? totale_waarde,@maximum,artikelNummer,versie gebruiker1,gebruiker2,gebruik3,3gebruikersTotaal _audio_bestandsnaam,aantal_minuten,bpm_120,AANTAL_KANALEN VideoUploadURL,frames_per_seconde,aantal_fragmenten#,kleurcode
c. Vuldezinaan.Denaamvaneenvariabelemoet... kortenkrachtigzijn,zodatdecodekortblijft. defunctieofdewaardebeschrijven,ookalsdateenlangerenaamoplevert.
d. Zetdejuistevariabelenaambijdejuisteomschrijving.
Eenswitchheeft24poorten.
maximale_communicatie_snelheid
bank_saldo url:https://intranet.zusenzo.org/urenregistratie
Decommunicatiesnelheidvaneendraadloos wifinetwerkis300megabytes/s
Eenbankrekeningheefteensaldovan$5363.93
urenregistratie_link
aantal_poorten
e. Eenvariabeleheeftdewaarde1.48.DewaardesteltdevrijeruimteopeenhardeschijfinGBvoor.Bedenkde naamvandevariabeleentikdezeinindeREPLmetdeopgegevenwaarde.
f. EenvariabeleheeftdewaardeWin-10_Office_23.Dezewaardesteltdenaamvaneencomputerineennetwerk voor.BedenkdenaamvoordevariabeleentikdezeinindeREPLmetdeopgegevenwaarde.
g. Delichtsnelheidis299792458m/s.Bedenkdenaamvoordevariabeleengeefdewaardevandelichtsnelheid aandevariabele.Doeditindewetenschappelijkenotatie,zodatdewaardebegintmet2.9....(Letop:Hetkan zijndatPythonditinternandersopslaat.Datisgeenprobleem.)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
15 Blok1 BeginnenmetPython
h. WehebbeneenSSD-harddiskvan2TBmeteenschrijfsnelheidvan530MB/seneenleessnelheidvan560MB/s.
Berekenhoesneleenbestandvan2.64GBnaardeschijfkanwordengekopieërd.Berekenvervolgenshoesnel hetbestandvandeschijfkanwordengelezen.Beidewaardenuitgedruktinseconden.
Maakvariabelenmeteencorrectenaamaanengeefzedewaardebehorendebijdevariabele.Bereken vervolgensmetgebruikmakingvandevariabelendegevraagdeuitkomsten.
Terinformatie:Eenterrabyteisgelijkaan1000GB.Eengigabyteisgelijkaan1000MB.
i. IneenuitverkoopziejeeenmooielaptopvanhetmerkTrell(modelExtraterestialware)voor€2.873,-.Als bonuskrijgjeeenextrakortingvan15%alsjedelaptopvandaagindewinkelkomtkopen.Berekende uiteindelijkeprijsvandelaptop.
Maakvariabelenmeteencorrectenaamaanengeefzedewaardebehorendebijdevariabele.Bereken vervolgensmetgebruikmakingvandevariabelendegevraagdeuitkomsten.
Opdracht6 Namenvanvariabelenbedenken
(ZONDERBEELD-EN
TAALREDACTIE)
a. Eenvariabeleheeftdewaarde1.48.DewaardesteltdevrijeruimteopeenhardeschijfvoorinGB.Bedenkde naamvandevariabeleentikdezeinindeREPLmetdeopgegevenwaarde.
b. EenvariabeleheeftdewaardeWin-10_Office_23.Dezewaardesteltdenaamvaneencomputerineennetwerk voor.BedenkdenaamvoordevariabeleentikdezeinindeREPLmetdeopgegevenwaarde.
CONCEPT
c. Delichtsnelheidis299792458m/s.Bedenkeenvariabelenaamengeefdewaardevandelichtsnelheidaande variabele.Doeditindewetenschappelijkenotatie,zodatdewaardebegintmet2.9....(Letop:Hetkanzijndat Pythonditinternandersopslaat.Datisgeenprobleem.)
d. WehebbeneenSSD-harddiskvan2TBmeteenschrijfsnelheidvan530MB/seneenleessnelheidvan560MB/s. Berekenhoesneleenbestandvan2.64GBnaardeschijfkanwordengekopieërd.Berekenvervolgenshoesnel hetbestandvandeschijfkanwordengelezen.Beidewaardenuitgedruktinseconden.
Maakvariabelenmeteencorrectenaamaanengeefdezedewaardebehorendebijdevariabele.Bereken vervolgensmetgebruikmakingvandevariabelendegevraagdeuitkomsten.
Terinformatie:Eenterrabyteisgelijkaan1000GB.Eengigabyteisgelijkaan1000MB.
16
e. IneenuitverkoopzienweeenmooielaptopvanhetmerkTrell(modelExtraterestialware)voor€2873,-.Als bonuskrijgjeeenextrakortingvan15%alsjedelaptopvandaagindewinkelkomtkopen.Berekende uiteindelijkeprijsvandelaptop.
Maakvariabelenmeteencorrectenaamaanengeefdezedewaardebehorendebijdevariabele.Bereken vervolgensmetgebruikmakingvandevariabelendegevraagdeuitkomsten.
OpdrachtenDatatypen
Opdracht7 Datatypen
RaadpleegzonodigdetheorieoverDatatypen.
a. WatzijnvalidedatatypenbinnenPython? real float str text bool
b. HoekunjeindeREPLbekijkenwatvoordatatypeeenvariabeleheeft?
c. Uitdevolgendeberekeningkomteenantwoord.Welkdatatypeishetantwoord?
antwoord = (100.3 * (11.8 / -33.12) * (11.8 * 13.2) / 33.12 float int str real
d. Zetdejuistebeweringachterelkeregel.
Datatypeint 25>8
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
True "HelloWorld!"
False 536472+8282993494
Datatypestr notTrue
e. Wanneerwedefloatingpoint-waarde3.14159willenomzettenineeninteger,watkrijgenwedanals integerwaarde?
17 Blok1 BeginnenmetPython
ValueError
f. Converteerdeberekening((2.0*3.14159)/360.0)*272.3naareeninteger.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
g. Converteerdevolgendeberekeningnaareenstring,waarbijgeenpuntindestringmagkomen.Welkestappen moetjezetten?
20000 * (4.5 / 100)
antwoord=20000*(4.5/100)
str(float(int(antwoord)))
antwoord=20000*(4.5/100)
antwoord_int=int(antwoord)
tekst=str(antwoord_int)
antwoord=20000*(4.5/100)
antwoord_float=float(antwoord)
tekst=str(antwoord_float)
antwoord=20000*(4.5/100)
antwoord_int=int(antwoord)
tekst=float(antwoord_int)
h. Maakdevolgendecodekloppend.
(15 / 3) * (7 − 4) + (2**2)
OpdrachtenStrings
Opdracht8 Strings
RaadpleegzonodigdetheorieoverStrings.
a. Welkebeweringiscorrect?
InPythonkunnenalleenaanhalingstekens("")wordengebruiktomstringstedefiniëren.
Hetgebruikvantriplequotes('''''')istoegestaanommeerdereregelstekstineenstringoptenemen.
Hetisnietmogelijkomescape-tekenstegebruikenbinneneenstringdieisgedefinieerdmetenkelequotes ('').
F-strings(formattedstrings)inPythonmoetenaltijdwordengedefinieerdmettripleaanhalingstekens(""" """).
b. WatgebeurteralsjedevolgendePython-codeuitvoert?
tekst = 'Python is "geweldig"!'
3.1 3 3.0
18
Erzaleensyntaxfoutoptredenvanwegehetgebruikvanquotesenaanhalingstekensindezelfdestring.
HetgebruikvanquotesbinnenaanhalingstekensisniettoegestaaninPython,duszaleenfoutoptreden.
Decodezalzonderfoutenwordenuitgevoerd,maartextzalalleen'Pythonis'bevattenvanwegededubbele quotes.
Decodezalzonderfoutenwordenuitgevoerdentextzaldewaarde'Pythonis"geweldig"!'bevatten.
Opdracht9 Formattedstrings
a. Maakeenvariabelemetjenaam.Printvervolgensdetekst: Welkom op onze site, <jouw naam>!
Vervang <jouw naam> doordetekstvandevariabele.
b. DeBelastingdienstheeftbepaalddatdebijtellingopeenleaseauto24%vandenieuwwaardeis.Berekende bijtellingvooreenleaseautometeenverkoopwaardevan€43.689,88.Gebruikhiervoordevolgendeformule: bijtelling=(verkoopwaarde/100)*24.
Geefdevolgendetekstophetschermweer:
De bijtelling voor een auto met de verkoopwaarde van x bedraagt euro y.
Daarbijwordendexendeyvervangendoordeverkoopwaardeenhetberekendebedrag.Beideafgerondop tweecijfersachterdekomma.
c. Geefdeeersteregelvaneentabelweer.Ditisderegeldieaangeeftwatelkekolombetekent.Devolgende kolommenzijnaanwezig:Index,Snelheid_1,Koppel_1,Snelheid_2,Koppel_2.
Geefderegelweer,waarbijtussendekolommenééntabafstandzit.Deeerstvolgenderegelbevatdevolgende informatie:0,95,33,95,25.
Zorgdatdezeregelnetjesuitlijntmetdeeersteregel.Gebruikdetaben-waarnodig-eennieuweregel escape-sequenties,zodathetresultaatongeveeralsvolgtwordtweergegeven.
Index Snelheid_1 Koppel_1 Snelheid_2 Koppel_2
0 95 33 95 25
d. Printdevolgendedriekolommen:naam,adres,woonplaats.
Zorgervoordatelkekolomtwintigtekensinbeslagneemt.Enzorgervoordatdeeerstekolomlinksuitlijnt, demiddelstekolomgecentreerdisendelaatstekolomrechtsuitgelijndis.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
1.3 OpdrachtenPyCharm
OpdrachtensetInstallatievanPyCharm
Opdracht10 InstallatievanPyCharm
RaadpleegzonodigdetheorieoverdeInstallatievanPyCharm.
19 Blok1 BeginnenmetPython
a. WaarvoorstaatdeafkortingIDE?
IntelligentDevelopmentEnvironment
IsolatedDevelopmentEnvironment
InnovativeDevelopmentEnvironment
IntegratedDevelopmentEnvironment
b. WelkebeweringoverPyCharmisjuist?
PyCharmCommunityEditionisdeenigeversiediegratiskanwordengeïnstalleerdzonderbeperkingen.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
BijdeinstallatievanPyCharmopLinuxishetnoodzakelijkomPythonhandmatigteinstallerenvoordat
PyCharmwordtgeïnstalleerd.
PyCharmbiedtslechtsééninstallatieoptie,ongeachthettypeprojectdatwordtontwikkeld.
PyCharmkanalleenwordengeïnstalleerdopWindows-besturingssystemen.
c. WatisdemeesteenvoudigemanieromPyCharmteinstalleren?
OpdrachtensetProjectaanmaken
Opdracht11 Projectaanmaken
RaadpleegzonodigdetheorieovereenProjectaanmaken.
a. WatiseenbelangrijkeredenomeennieuwprojectaantemakeninPyCharminplaatsvansimpelweglosse Python-bestandentegebruiken?
PyCharmvereistprojectenvoorhetgenererenvaneenuitvoerbarePython-code.
Hetisalleennodigomprojectentemakenalsjevanplanbentommeteenteammensentewerken.
ProjecteninPyCharmstellenjouinstaatombronbestandenteorganiserenenafhankelijkhedentebeheren enbiedeneengestructureerdeomgevingvoorontwikkeling.
Projectenzijnalleenrelevantalsjevanplanbentomgrafischegebruikersinterfaces(GUI)teontwikkelen.
b. Watisdebetekenisvandeterm'syntaxhighlighting'indecontextvaneenprogrammeeromgevingzoals PyCharm?
Hetiseenfunctiedieautomatischfoutenindesyntaxisvanjecodecorrigeert.
Hetiseenvisuelefunctiediedelenvandecodeinverschillendekleurenmarkeertomdeleesbaarheidte vergroten.
Hetverwijdertongebruiktesyntaxisuitdecodeomdeleesbaarheidteverbeteren.
Hetiseensyntactischeregeldievoorschrijfthoecommentaarmoetwordengeschrevenindecode.
c. Watishetvoordeelvanhetwelkomstprogrammaaanmaken?
20
Opdracht12 Debuggen
RaadpleegzonodigdetheorieoverDebuggen.
a. Waaromishetgebruikvandebugtools,zoalsbreakpointseninspectiemogelijkheden,handigbijhetdebuggen vaneenPython-programma?
Omdesnelheidvandecode-uitvoeringteverbeteren.
OmdecodeteformatterenvolgensPEP8-richtlijnen.
Omvariabelentebekijkenendeuitvoeringvandecodestapvoorstaptevolgen.
Omautomatischfoutenindecodetecorrigeren.
b. BijhetdebuggenvaneenPython-programmazijnverschillendetoolsentechniekenbeschikbaar.Welkevan devolgendeoptieszijngebruikelijkemethodenvoorhetdebuggeninPython?Erzijnmeerdereantwoorden goed.
Gebruikvanbreakpointsomdeuitvoeringopspecifiekeregelsteonderbreken.
Afdrukkenvanvariabelenentussenresultatenmetbehulpvandeprintfunctie.
Complexeconditiesindecodeschrijvenomautomatischfoutenoptesporen.
GebruikvaneenIDEmeteeningebouwdedebugger.
c. GeeftweespecialevariabelenvanPythondiejemetdedebuggerhebtgezien.
TAALREDACTIE)
d. Hoekunjeervoorzorgendatjegeenaltelangeregelscodekrijgt?
e. Pashetprogrammametdeberekeningvandetransportkostenaandooreenextraprintstatementtoete voegen.Onzecollegaheeftgevraagdofnogevenkanwordengetoonddatdetotalekosten+debelastinghet transportkostenbedragis.
CONCEPT (ZONDERBEELD-EN
f. Waaromisloggingbelangrijk?
Omdecodeefficiëntertemaken.
Ominformatieoverdeuitvoeringvandesoftwarevastteleggenenproblemenoptesporen.
Omtevoorkomendatandereontwikkelaarstoegangkrijgentotdecode.
Omdegebruikersinteractieteverbeteren.
g. Pashetprogrammametdeloggingaan,zodanigdathetloggingslevelINFOwordt.Voerhetprogrammauit enziehetverschilinuitvoer.
OpdrachtensetDebuggen
21 Blok1 BeginnenmetPython
1.4 TheorieInteractiefPython
PythonInterpreterSessie
WezulleninditblokkijkenwatdeREPLis,waarwedezevoorgebruikenenhoeweditzelfkunnendoen.
ReadEvaluateProcessLoop
DeinteractievePythonInterpreterSessieiseenhandigetoolomPython-programma’stestarten,stukken Python-codeuitteproberenendetaaltelerenbegrijpen.OmdatjeviadeinteractievePythonInterpreterSessie heeleenvoudigPython-applicatieskuntstarten/testen/evalueren,gebruikenprofessionalsdezevaak.
(ZONDERBEELD-EN TAALREDACTIE)
WehebbenvlaknadeinstallatiealeenkeergebruikgemaaktvandeinteractievePythonInterpreterSessieom tecontrolerenofPythonfunctioneerde.
DeinteractievePythonInterpreterSessiewerktvolgenshetprincipevan:
• Read:leesdeingevoerdetekstvanafde>>>(commandprompt).
• Evaluate:evalueerdeingevoerdetekst.ControleerofditgeldigePython-codeis.
• Process:verwerkdeingevoerdePython-code.
• Loop:herhaalallesdooropnieuween>>>tetonen.
DoordezemaniervanverwerkenwordtdeinteractievePythonInterpreterSessieookweldeREPL(spreekuit: rèpel)genoemd.
WijzulleninheteerstedeelvaakgebruikmakenvandeREPLomdetaalPythontelerenbeheersen.
Handigecommando'sindeREPL
BinnendeREPLkunnenverschillendefunctieswordenaangeroepen.Eenaantalervanzullenwebehandelen.
exit()
CONCEPT
EenmaalindeREPLvanPythonkunjedezeverlatendoordefunctie exit() aanteroepen.DeREPLwordtdan geslotenenjekeertterugindeomgevingvanwaaruitjedeREPLhebtgestart.Bijvoorbeeld:jestartPythonvanuit deLinux-terminal.Nahetuitvoerenvande exit() functiekomjeweerterugindeLinux-terminal.
EenanderemanieromdeREPLteverlatenisdoorgebruiktemakenvaneentoetscombinatie.Ditverschiltechter perOS.OnderMicrosoftWindowsisdit CRTL-Z gevolgddooreenenter.BijMacOSenLinuxisdit CTRL-D.
help()
De helpfunctiegeeftjouhulpbijallemogelijkePython-gerelateerdezaken,waaronderkeywords,functiesen modules.Zodrajedehelpfunctie(help()start,komjeineeninteractievehelpshell.Vanhieruitkunjehulpkrijgen voorPython-elementen.Bijvoorbeeld:wanneerjeindeinteractievehelpshellhetwoord“modules”typt,krijgje eenlijstvanallebeschikbaremodules.
De helpfunctiegeeftookinformatievaneenspecifiekemoduleoffunctieweerdoordenaamtussendehaakjes optegeven.Bijvoorbeelddeinternefunctie bin (debetekenisvandezefunctiekomtlateraandeorde):
>>>help(bin)
Help on built-in function bin in module builtins:
bin(...)
bin(number)->string
22
Return the binary representation of an integer.
>>>
Ditwerktookvoorzelfgemaaktemodulesenfuncties.Hierkomenwelateropterugalswehetgaanhebbenover documentatiestrings.
Jeverlaatdeinteractievehelpshelldoor quit gevolgddoor enter tetypen.Ofdoordeletter q gevolgddoor enter tekiezen.
DeZenvanPython
StriktgenomengaathethiernietomeenhandigefunctievandeREPL,maarwelombelangrijkgedachtegoed vanPython.Deregelskunnenvoorelkeprogrammeertaalwordentoegepast.Eigenlijkzoudenwemoetenzeggen: “Deregelszoudenvoorelkeprogrammeertaalmoetenwordentoegepast.”Sterkernog,zezijnzelfsbrederdan programmeertalentetrekken.Denkbijvoorbeeldaanuserinterfacedesign.
WanneerjeimportthisindeREPLtypt,krijgjedeZenvanPythontezien.
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
23 Blok1 BeginnenmetPython
DeNederlandsevertalingvandeZenvanPython: The Zen of Python, by Tim Peters
Mooi is beter dan lelijk
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Expliciet is beter dan impliciet
Eenvoudig is beter dan complex
Complex is beter dan gecompliceerd
Plat is beter dan genest
Met leegruimte is beter dan op elkaar gepropt
Leesbaarheid telt
Speciale situaties zijn niet speciaal genoeg om de regels te breken
Praktisch zijn verslaatpuristisch zijn
Fouten mogen nooit onopgemerkt voorbijgaan
Tenzij ze expliciet worden tegengehouden
In het licht van ambiguïteit: weiger de neiging om te gissen
Er moet maar één -- en bij voorkeur alleen maar één – duidelijke manier zijn om het te realiseren
Hoewel die manier misschien niet direct duidelijk is op het eerste gezicht, tenzij je Nederlands bent
Nu is beter dan nooit
Hoewel nooit vaak beter is dan *nu* direct
Als een implementatie moeilijk is om uit te leggen, is het een slecht idee
Als de implementatie eenvoudig is om uit te leggen, kan het een goed idee zijn
Namespaces zijn een verschrikkelijk goed idee – laten we er daar meer van doen
Naarjecodekijkenmetdezeregelsingedachtengeeftjoudeeersteindrukvanofjeeenmooistukwerkhebt geleverdofdaternogeensnaarmoetwordengekeken.Kijkhierregelmatignaarterugalsjeverdergaatinje Python-ontwikkeling.
RekenenmetPython
WegaankijkenwatdemogelijkhedenzijnomdeREPLalsrekenmachinetegebruiken.
DeREPLalsrekenmachine
MetbehulpvandeREPLzullenwegaankijkennaarderekenmogelijkhedenvanPython.DeREPLleentzich namelijkuitstekendalsrekenmachine.Daarnaastisheteenmooiemanieromdeverschillendedatatypenvan getallenbinnenPythonteleren.
Een som maken
Wanneerwetweegetallenbijelkaarwillenoptellen,schrijvenwebijvoorbeeld2+3=5.IndeREPLtypenwe 2 + 3 gevolgddoor enter:
>>>
24
>>>2 + 35>>>
WehebbenaandeREPLgevraagd:
Tel de getallen 2 en 3 bij elkaar op en geef het antwoord.
DitzijninstructiesvoorPython,maarhetisnoggeenprogramma.Watwehebbeningetyptiseenexpressie bestaandeuit 2 + 3,waarbij 2 en 3 operandenzijn.Eenoperandiseendeelvaneeninstructie.Hiermeewordt aangegevenwaarPythonmeekanwerken.
Decijfers2en3zijndeletterlijkewaarden2en3.Het+-tekenwordteenopteloperatorgenoemd.Ditiseenbinaire operator,wantdezegebruikttweeoperanden.
BehalveoptellenkunjeinPythonnatuurlijkbijvoorbeeldaftrekken,vermenigvuldigenendelen.Bijvoorbeeld:
>>>2 * 1632>>>17 / 5 3.4
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Inhetlaatstevoorbeeldgebeurtietsbijzonders.Daarwordtinteger17gedeelddoorinteger5,waarbijhetantwoord eenfloatingpoint-waardevan3.4is.Pythonherkentdathetantwoordeengebrokengetalgaatopleverenen heefthetresultaatomgezetineenfloatingpointmethetcorrecteantwoord.
Integers en floating points
Decijfers2en3zijngehelegetallen,netals-26739,772en10020.DezegetallenzijnbinnenPythonvanhettype integer.Eenintegeriseengeheelgetal.Erstaandusgeenpuntenin.
Figuur 1.6 Opbouw van een optelsom
>>>
25 Blok1 BeginnenmetPython
Wanneerwekijkennaar2.5,3.14en-3654.876,zijnditgebrokengetallen.DezevallenbinnenPythononderhet typefloatingpoint.PythonmaaktgebruikvandeEngelsegetalsnotatie.Decijfersachterdekommawordenin Pythongescheidendooreenpunt.Daarwaarwijeenkommahebbenstaanstaatereenpunt(.).Zeseurovijfenzestig schrijfjedanals6.65ennietzoalswijdatgewendzijnals6,65.
Floatingpoint-getallenkunnenookwordengeschrevenopeenwetenschappelijkemanier,bijvoorbeeld1.345e+03 (1345.0)of2.387e-05(0.00002387).Hetdeele+03geeftaandatdepuntdriecijfersnaarrechtsmoetworden geschovenomdewerkelijkewaardetekrijgen.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Bije-05betekentditdatdepuntvijfcijfersnaarlinksmoetwordengeschovenomdewerkelijkewaardetekrijgen. Alsernietgenoegcijferszijn,wordennullentoegevoegd(bijvoorbeeld0.00002387).Hieraanzijnviernullen toegevoegd.
Deletter e magzowelmetdekleineletter e alsmetdehoofdletter E wordengeschreven.
Operatoren
DerekenoperatoreninPythonzijndezelfdealsdiewekennenvanonzevroegerereken-/wiskundelessen.Ookin Pythonhebbenwe: optellen + aftrekkenvermenigvuldigen *
delen / machtsverheffen **
Wezullenlaternogmeeroperatorenlerenwaarmeeweinteressantedingenkunnendoen.
Prioriteiten
Wanneerberekeningenwordengemaaktwaarinbijvoorbeeldmeerdereoptellingen,aftrekkingen, vermenigvuldigingenendelingendoorelkaarwordengebruikt,moetrekeningwordengehoudenmetdevolgorde waarineenberekeningplaatsvindt:dezogenoemdeprioriteiten.
Pythonmaaktgebruikvandegeldenderekenregels.Machtsverheffenenworteltrekkengaanvoorvermenigvuldigen endelen,dieophunbeurtweervooroptellenenaftrekkengaan.Wiljeeenbepaalderekenkundigebewerking eerstlatenuitvoeren,danplaatsjedezetussenhaakjes.
>>> 4 - 3 * 7-17>>> (4 - 3) * 77>>>
Inhetvoorgaandevoorbeeldzienwedathetvermenigvuldigenvoorrangheeftwanneergeenhaakjesworden gebruikt.Eerstwordt3vermenigvuldigdmet7.Datlevert21op.Vervolgenswordter4minus21afgetrokken,wat alsantwoord-17oplevert.
Doordehaakjesdwingenweafwelkebewerkingmoetwordenuitgevoerdvoordatdestandaardprioriteitenregels wordentoegepast.Ditistezieninhettweedevoorbeeld.Eerstwordtdeberekening4–3uitgevoerd,wat1 oplevert.Ditwordtmet7vermenigvuldigd,metalsresultaat7.
>>> 25 + 4 * 2 - 627>>>
26
Inhetvoorgaandevoorbeeldwordteerstdevermenigvuldiginguitgevoerd.Vervolgenswordtdewaarde25 opgeteldbijhetantwoordvandevermenigvuldiging,namelijk8.Vandezewaarde33wordt6afgetrokken, waardoorhetantwoord27wordt.
Doorhetgebruikvanhaakjeskandeprioriteitwordenafgedwongen.Voordeleesbaarheidwordtaangeraden ommethaakjestewerken.Desomzoudanalsvolgtmoetenwordeningetypt:
>>> 25 + (4 * 2) - 627>>>
Naastde+-operatorkentPythonnoganderebinaireoperatoren.Indevolgendetabelstaandezeweergegeven indevolgordevanhunprioriteit.Debinaireoperatorenmetdezelfdekleurhebbeneengelijkeprioriteit,waardoor geldtdatzeinvolgordevanlinksnaarrechtswordenuitgevoerd.
Tabel 1.1
Bewerking Operator
Exponent **
2**4=16
Ditishetzelfdeals2*2*2*2=16
Vermenigvuldigen
3*5=15
Delen /
//
CONCEPT
3/2=1.5
Delen,waarbijdecijfersachterdekommaworden afgekapt
3//2=1
Ditwordtookweleenintegerdelinggenoemd
Modulo,ditisderestnaeendeling %
23%5=3
5past4xin23
(ZONDERBEELD-EN TAALREDACTIE)
5*4=20
23–20=3
Optellen +
6+3=9
Aftrekken
13–6=7
*
-
27 Blok1 BeginnenmetPython
VariabelenindeREPL
WegaankijkenhoewewaardeninPythonkunnenonthouden.
Variabelen
IndeREPLkunjeprimarekenen.Somshebjeeenberekeningdiejealhebtuitgevoerdweernodig.Jekuntmet depijltjestoetsenomhoogenomlaagstappendooreerderuitgevoerderegels.Wekunnenhetantwoordvaneen berekeningookopslaanineenvariabele.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Eenvariabelekunjezienalseenopslagplaatsvoorwaarden.Devariabeleheefteennaam,zodatwedewaarde diewehebbenopgeslagenterugkunnenvinden.EenvariabelekanelkewaardebinnenPythonopslaan,dusniet alleengetallen.Enkelevoorbeeldenvanvariabelenzijn:
>>> aantal_studenten = 15>>> prijs = 34.95
>>> domeinnaam = "mijnbedrijf.nl"
Dewaardewordtaaneenvariabeletoegewezendoorhet"="-teken.Ditwordthetassignmentstatementgenoemd.
Wanneerweheteerstevoorbeeldnemen,staatdaar:aandevariabelemetdenaam aantal_studenten wordt dewaarde 15 toegekend.Vanafditpuntzaldevariabeleaantal_studentendewaarde15hebben.
Regels voor variabelen
Nietelkenaamkanwordengebruiktalsnaamvooreenvariabele.Ditisgebondenaanregels.Dieregelszijn eenvoudig.
Denaamvaneenvariabelemoetbeginnenmeteenletterofeenunderscore.Bijvoorbeeld: domein of _domein
Hetgebruikvaneenunderscoreaanhetbeginvaneenvariabelezienweterugbijclassesenbij objectgeoriënteerd programmeren.
>>> domein = "python.org"
>>> domein
python.org
>>>
>>> _domein = "python.org"
>>> _domein
python.org
>>>
Nadeeersteletterofeenunderscoremagjeletters,cijfersenunderscoresgebruiken.Bijvoorbeeld: domein2 of _verbonden_met_de_server
>>> domein2 = "google.com"
>>> domein2
google.com
28
>>> _verbonden_met_de_server = True
>>> _verbonden_met_de_server
True
>>>
>>> domeinnaam = "mijnbedrijf.nl"
Namenzijnhoofdlettergevoelig.Ditbetekentdat inlognaam en Inlognaam voorPythontweeverschillende namenvoorvariabelenzijn.
>>> inlognaam = "jwillem"
>>> inlognaam jwillem
>>> Inlognaam = "ppietersen"
>>> Inlognaam ppietersen
>>> inlognaam jwillem
Namendiebeginnenmeteenwhitespace(spaties,tabs)ofwaarinopeenandereplekeenwhitespacewordt gebruikt,zijnniettoegestaanalsnaamvooreenvariabele.Jekrijgtdaneenfoutmelding.
>>> communicatie snelheid = 9600
File "<stdin>", line 1
Communicatie snelheid = 9600 ^
SyntaxError: invalid syntax >>>
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Conventies voor variabelen
Naastregelszijnerconventies.Conventieszijnafsprakendiegemaaktzijnomookcodevanandereneenvoudig tekunnenlezenofonderhouden.Goedenamenvoorvariabelenzijnergbelangrijk.Deleesbaarheidvande applicatiehangtervanaf.Alsslechtenamenvoordevariabelenwordtgebruikt,isdewerkingvaneenapplicatie alheelsnelnietmeerteachterhalen.Zekerwanneerjeeenprogrammamoetaanpassen,isditheelvervelend.
Hetwordtsterkaangeradenombeschrijvendenamentegevenaanvariabelen.Ditverhoogtdeleesbaarheidvan decode.InPythonisdeconventieafgesprokenomnamenvanvariabelenmeteenkleinelettertebeginnen.
Bijvoorbeeld: gemiddelde of totaal.
29
1 BeginnenmetPython
Blok
Wanneerdenaamuitmeerderewoordenbestaat,wordendeverschillendewoordendoormiddelvaneen underscoremetelkaarverbonden.Bijvoorbeeld: naam_van_gebruiker of ontvangen_data_pakketten.
Datatypen
Eenvaakonderschatonderdeelvanprogrammerenishetbegripvandatatypenenhetjuistegebruikervanop hetjuistemoment.Wezullennaareenpaarbasisdatatypenkijken.Laterzullenwemeerdatatypentegenkomen.
Verschillendesoortendata
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
InternwerktPythonmetdatatypen.Integers,floatingpoints,stringsenbooleanszijndatatypen.Elkewaarde heefteenbepaalddatatype.Afgekortalsint,float,strofbool.
Integers
Integerszijngehelegetallen.Ditzijngetallenzondereenkomma.Hetbereikervanisenormenalleengelimiteerd doorhetbeschikbaregeheugen.
>>> groot_getal = 567890345673456756789232342347898345678912345678
>>> type(groot_getal)
<class 'int'>
>>> negatief_getal = -12345567898765434567
>>> type(negatief_getal)
<class 'int'>
>>> Floating point
Floatingpoint-getallenzijngebrokengetallen.Datzijngetallenmetcijfersachterdepunt(komma).Ditkomtveel voorbijberekeningen.Pythonzalautomatischeenantwoordalseenfloatingpointbewarenalsdekansbestaat dathetantwoordvandeberekeningeengebrokengetaloplevert.
>>> gebroken_getal = 3.1415
>>> type(gebroken_getal)
<class 'float'>
>>> negatief_gebroken_getal = -129754.34635372567
>>> type(negatief_getal)
<class 'float'>
>>>
Floatingpoint-getallenwordenookwelindewetenschappelijkenotatieweergegeven.Ditiseenhandigevorm voorheelgroteofjuistheelkleinewaarden.
30
>>> lichtsnelheid = 299792458.0
>>> lichtsnelheid
29979258.0
>>> lichtsnelheid = 2.99792458e+08
>>> lichtsnelheid
299792548.0
>>> golflengte_groen_licht = 0.00000055
>>> golflengte_groen_licht
5.5e-07
>>> golflengte_groen_licht = 5.5e-07
>>> golflengte_groen_licht
5.5e-07
>>>
TAALREDACTIE)
Inhetvoorgaandevoorbeeldwordtdelichtsnelheidweergegevenalseenfloatingpoint-waardeenvervolgens indewetenschappelijkenotatie.Dewetenschappelijkenotatieheeftdeletter‘e’gevolgddooreen+ofeen–en eengetal.Hetgetalgeeftaanhoeveelpositiesdekommamoetwordenopgeschoven.Bijeen+wordtdekomma naarrechtsgeschovenenbijeen–naarlinks.Bijhetvoorbeeldvandelichtsnelheidwordtdekommaaposities naarrechtsgeschoven.Bijhetvoorbeeldvandegolflengtevangroenlichtwordtdekommazevenpositiesnaar linksgeschoven.
Strings
Stringszijnrijendiebestaanuitletters,cijfers,whitespacesofcombinaties.Ditzijnvaaknamen,tekstenvoor gebruikersofvoorregelsineenlogbestand.Detekensvaneenstringmoetentussentripleaanhalingstekens(''' of"""),enkelvoudigeaanhalingstekens("")ofquotes('')wordengezet.Wekomenlaterterugopdetriple aanhalingstekens.
Alsweineenzinooktripleaanhalingstekens,enkelvoudigeaanhalingstekensofquotesnodighebben,moeten weervoorzorgendatdebuitenstevariantvandeaanhalingstekensandersisdandeversiedieweindestringzelf gebruiken.Steldatwedezin'sAvonds koelt het snel af. willeninvoereninPython.Danhebbenweindeteksteen apostrofnodig.Datkanalleenalsonzestringwordtgerealiseerddoorde""of""".Hiernavoorbeeldenvanhet combinerenvandetekens.
tekst = "'s avonds koelt het snel af."
CONCEPT (ZONDERBEELD-EN
andere_tekst = 'De run op de kaartjes voor het concert "was wat overdreven", vond ik.'
combineren = """De bel ging en ik riep: "'t is het nieuwe Python boek!" """
Bijhetlaatstevoorbeeldisdespatietussendeaanhalingstekensnoodzakelijk.AndersweetPythonnietwaarde aanhalingstekensstoppenenwaardeandereaanhalingstekensstarten.
31 Blok1 BeginnenmetPython
>>> inlognaam = "petersen"
>>> type(inlognaam)
<class 'str'>
>>> help_tekst = "Geef de naam van het logbestand op."
>>> type(help_tekst)
<class 'str'>
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
>>> Booleans
Booleanskunnenalleenwaarofnietwaarzijn.InPythonisditTrueofFalse.Vanelkdatatypekanwordengevraagd ofdatTrueofFalseis.EenstringisFalsealsdezeleegis.Eenlegestringiseenstringzonderkarakters.Letop:een whitespaceisookeenkarakter.Zodraeenkarakterineenstringzit,wordtdestringalsTruegezien.Bijintegers wordt0enbijfloatingpointswordt0.0gezienalsFalse.ElkeanderegetalswaardewordtgezienalsTrue.
>>> paswoord_geldig = False
>>> type(paswoord_geldig)
<class 'bool'>
>>> verbonden = True
>>> type(verbonden)
<class 'bool'>
>>> Converteren
Somsmoetjevandatatypewisselen.Bijvoorbeeldwanneerjehetantwoordvaneenberekeningophetscherm wiltweergeven.Stel,deberekeningisuitgevoerdenheeftalsresultaathetantwoordinhetdatatypefloating point.Eriseenconversienodigomditophetschermweertegeven,omdatweergavenophetschermalleenvan hetdatatypestringkunnenzijn.WehebbenalgeziendatPythonautomatischhetantwoordvaneen integerberekeningkanomzettenineenfloatingpoint.Jekuntookzelfeenconversieforcerendooringebouwde conversiefunctiestegebruiken.
Van floating point naar integer
Omeenfloatingpointomtezettenineenintegergebruikjedeingebouwdefunctie int() Tussendehaakjes plaatsjedefloatingpoint-waarde.
>>> int(3.14159)3>>>
Defloatingpoint-waardewordtvanafdepuntafgekapt.Erwordtdusnietafgerond!Afrondenkanmetdefunctie round().
32
Dezefunctieheeftalseersteparameterhetafterondengetal:defloatingpoint-waardediejewiltafronden. Vervolgenshetaantaldecimalenachterdepunt.Wanneerjeereenintegervanwiltmaken,moetdit0zijn.Het resultaatvande round()-functiestopjeinde int()-functie.
>>> round(7.5, 0)
8.0
>>> int(round(7.5))
8
>>> round(7.2, 0)
7.0
>>> int(round(7.2, 0))
7
>>>
Van integer naar floating point
Deanderekantopkannatuurlijkook.Eenintegerconverterennaareenfloatkanmetdeingebouwdefunctie float() Tussendehaakjesplaatsjedeintegerwaarde.
>>> float(63)
63.0
>>> float(-736482901)
-736482901.0
>>>
Van een datatype naar string
Floatingpoints,integers,booleansenanderedatatypenkunnenwordengeconverteerdnaareenstring.Ditgaat metdeingebouwdefunctie str().
>>> str(3.14159)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
'3.14159'
>>> str(928374)
'928374'
>>> str(True)
'True'
33 Blok1 BeginnenmetPython
Rekenenkunjenietmetstrings,behalvealsjesnelveelrepeterendetekensoftekstennodighebt.Danishet handig.
>>> 10 * "+"
'++++++++++'
>>> 5 * "genereer"
'genereergenereergenereergenereergenereer'
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Stringsoptelleniseigenlijkstringsaanelkaarplakken.Ditwordtookwelconcatenatiegenoemd:strings samenstellentoteennieuwestring.
>>> "Hallo" + "Jan"
'HalloJan'
>>> "Hallo " + "Jan"
'Hallo Jan' >>>
Overigensisditnietdebestemanieromstringsaanelkaartekoppelenalshetgaatomveelstringsdievaak aanelkaarmoetenwordengekoppeld.Daarzijnbeteremethodenvoor.Diekomenlateraanbod.
Wanneerjeeenberekeningophetschermwiltweergeven,komthetvaakvoordatjeditmettweecijfersachter dekommawiltweergeven.Defunctie str() geefteenfloatingpoint-getalweermetdewaardezoalsdezeis. GeformatteerdzoalsPythonditdoet.Jezultdestringzelfmoetenformaterenalsjeietsanderswilt.Ditiseen uitgebreidonderwerp,waarwelateropterugkomen.
Strings
Eenstringiseenveelgebruiktdatatype.Stringswordengebruiktominformatieaandegebruikertegeven. Bijvoorbeeldviahetscherm,eendisplayopeenmicroboard,eenlogbestandofeenrapportage.Ditkunnen antwoordenzijnvanberekeningen,maarooktekstendieindecodevastliggen:zogenoemdeletterlijke tekenreeksen.
Daarnaastwordenstringsveelgebruiktbijhetinlezenvanbestandenomdaaruitinformatietehalen.Denk bijvoorbeeldaaneenconfiguratiebestand,waaronderdebekendebestandenmetdeextensie.iniof.log.Een veelgebruiktformaatishetJSON-formaat.
>>>
>>>
34
Stringsformatteren
Stringswordenvaakgebruiktombijvoorbeeldinformatievoordegebruikerweertegeven,inlogbestandeneen logischestructuuraantebrengenofconfiguratiebestandenleesbaartehouden.Hiervoormoetdeuitvoervaak wordengeformatteerd,bijvoorbeeldstukkentekstdierechtsuitgelijndmoetenworden.
Metdeformatfunctiekunnenstringswordengeformatteerd.Jekuntzeeenopmaakgeven,waarbijantwoorden vanbijvoorbeeldberekeningenkunnenwordenweergegeven.Degetallenwordendanomgezetineentekstuele weergave.Hetisdanookmogelijkomdeprecisievanfloatingpoint-getallentebepalenbijdeweergave, bijvoorbeeldmettweecijfersachterdekommavoorgeldbedragen.Naastgetallenkunnenditstringszijn.Zokan eentekstwordenuitgebreidmeteendynamischeweergave.Denaamvaneengebruikerdieopeenbepaald momentisingelogd.
Wegebruikenhiervoordegeformatteerdestring.Ditiseenstringmetervoordeletterf.Denormalestringzien wehierna.Wegeveneenvariabeledewaardevandestring"Hallowereld!".Metdefunctieprint()wordtde expressietussenderondehakenalstekstopdeconsoleweergegeven.
>>> een_tekst = "Hallo wereld!"
>>> print(een_tekst)
Hallo wereld!
>>>
Eengeformatteerdestringbegintdusmetdeletterf.Opzichzelfheeftditnietechtzichtbarevoordelen.
>>> een_tekst = f"Hallo wereld!"
>>> print(een_tekst)
Hallo wereld!
>>>
CONCEPT
(ZONDERBEELD-EN TAALREDACTIE)
Maarwanneerweditcombinerenmetvariabelen,heefthetheelveelvoordelen.Hetisdanvelemalenbeter leesbaarder.Ineenf-stringwordenaccolades({})gebruiktomvariabelenofexpressies,zoalseenberekening,in tevoegen.Deaccoladesinhetvolgendevoorbeeldbevattendevariabele({gebruiker}).Tijdensdeuitvoeringvan decodewordendezeaccoladesvervangendoordewaardevandecorresponderendevariabele.Hierdoorwordt deresulterendestring:Ingelogd:J0nbekend
>>> gebruiker = "JOnbekend"
>>> print(f"Ingelogd: {gebruiker}")
Ingelogd: JOnbekend >>>
Eenanderehandigheidvanhetgebruikvandef-stringsishetautomatischlatenconverterenvangetallennaar eentekstweergave.Ditmogenconstantenofvariabelenzijn.
35 Blok1 BeginnenmetPython
>>> print(f"Aantal beschikbare netwerkpoorten: {6}")
Aantal beschikbare netwerkpoorten: 6
>>> max_communicatie = 54
>>> print(f"De communicatie = {max_communicatie}Mb/s.")
De communicatie = 54 MB/s.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Jekuntafdwingenhoeveeldecimalenjeachterdepuntwilthebben.Dathangtafvandetoepassing.Bij geldbedragenishetbijvoorbeeldgebruikelijkomtweecijfersachterdekommatehanteren.Door{:.2f}tegebruiken zeggenwedatwetweecijfersachterdekommaeneenfloatingpointalsdatatypewillenhebben.
>>> licentie_kosten_per_device = 3500.0 / 67.0
>>> print(f"De licentiekosten per device bedragen: euro {licentie_kosten_per_device}")
De licentiekosten per device bedragen: euro 52.23880597014925
>>> print(f"De licentiekosten per device bedragen: euro { licentie_kosten_per_device:.2f}")
De licentiekosten per device bedragen: euro 52.24
Hetismogelijkommeerderevariabelenaaneenstringtoetevoegendoorteformatteren.Jekuntzelfseen constantestringgebruiken.Jemoeterdanweloplettendatje''gebruiktvoordestringsbinnendehoofdstring.
print(f"E-mail box van user: {'JOnbekend'} is {'1.456'} Gb groot " f"wat overeenkomt met {(1.456 / 1.5) * 100.0:.2f}% van het maximum.")
E-mail box van user: JOnbekend is 1.456Gb groot wat overeenkomt met 97.07% van het maximum.
>>>
>>>
>>>
>>>
>>> 36
Specialekarakters
Wanneerweeentabwillentoepassenofnaareenvolgenderegelwillengaan,kunnenweookgebruikmakenvan specialecodes.Despecialekarakterswordenmeteenzogenoemdeescape-sequentieweergegeven.Ditishet \-teken(backslash)gevolgddooréénofmeertekens.WanneerPythondebackslashtegenkomtineenstring, wordtgekekennaarwaternakomt.Afhankelijkdaarvanwordteenbepaaldeactieondernomen.
>>> print("Totaal: 24 aansluitingen")
Totaal: 24 aansluitingen
>>>
Inhetvoorgaandevoorbeeldisdeescape-sequentievoorhettabkaraktergebruikt.Decursorwordtvervolgens eentabafstandverdergeplaatstvoordatderestvandetekstwordtweergegeven.
>>> print("Geachte heer/mevrouw,\nWij danken u.\n\nGraag tot ziens.\n")
Geachte heer/mevrouw, Wij danken u.
Graag tot ziens!
>>> Uitlijnenbinneneentekstblok
Ommeercontroleoverhetformatterenvantekstentekrijgengebruikenwevullingstekens,bijvoorbeeldspaties ofstreepjes,omdeteksteenaantalkaraktersopzijteschuiven.Wanneerwerechtswillenuitlijnen,gevenwedit aanmethet>-tekengevolgddoorhetaantaltekensdathettekstblokbreedmoetworden.
Hiernagevenweaandatdetekst"Servernaam","Afdelingonderzoek","Domein"binneneentekstblokvan vijftientekensrechtsmoetwordenuitgelijnd.
>>>print(f"{'Servernaam':>15}:{'AfdelingOnderzoek'}\n{'Domein':>15}:{'Onderzoek'}\n{'IP-adres':>15}:{'192.168.1.1'}")
Server naam: Afdeling Onderzoek
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Domein: Onderzoek
IP-adres: 192.168.1.1
>>>
Naarlinksuitlijnenbinneneentekstblokdoenwedoorhet<-tekentegebruiken.
37 Blok1 BeginnenmetPython
>>> print(f"{'Server naam':<15}: {'Afdeling Onderzoek'}\n{' Domein':<15}:
{'Onderzoek'}\n{'IP-adres':<15}: {'192.168.1.1'}")
Server naam : Afdeling Onderzoek
Domein : Onderzoek
IP-adres : 192.168.1.1 >>>
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Centrerenbinneneentekstblokdoenwedoorhet^-tekentegebruiken.
>>> print(f"{'Server naam':^15}: {'Afdeling Onderzoek'}\n{' Domein':^15}:
{'Onderzoek'}\n{'IP-adres':^15}: {'192.168.1.1'}")
Server naam : Afdeling Onderzoek
Domein : Onderzoek
IP-adres : 192.168.1.1
>>>
Stringsalsdocumentatie
Dezogenoemdedocumentatiestringdocstring.Inonzeeigencodekunnenweookhelptekstenaanbrengen. Daarvoorgebruikenwedriedubbeleaanhalingstekens(""").Driedubbeleaanhalingstekensgebruikenweookals wegrotereletterlijketekstindecodewillentonen.
>>> print("""kopie [drive:][path][filename] [/A[[:]attributes]] [/B]
[/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]]
[drive:][path][filename]
Specifies drive, directory, and/or files to list.""")
kopie [drive:][path][filename] [/A[[:]attributes]] [/B]
[/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]]
[drive:][path][filename]
Specifies drive, directory, and/or files to list.
>>> 38
Daarnaastkunnenweonzeeigenfunctiesenmodulesvoorzienvandocumentatiestrings.IndeREPLzagenwe datjediekuntopvragen.Wekomenterugopdedocumentatiestringsalswefunctiesenmodulesbehandelen.
1.5 TheoriePyCharm InstallatievanPyCharm
TotnutoehebjewaarschijnlijkgewerktmetIDLE,diestandaardmetPythonwordtgeïnstalleerd.Dezewerkt primavoorkleineapplicaties.Deapplicatiesdieweinditblokgaanmaken,wordeneenstukgroterdandiein hetvorigedeel.Omtochoverzichttehoudenenmakkelijkertekunnenwerken,kaneengeïntegreerde ontwikkelomgeving(IDEinhetEngels)behoorlijkhelpen.
EenIDEbiedtvaakmogelijkhedentothetaanmakenvaneenproject,waarbijeenprojectkanwordengezienals verschillendebestandendiesameneenapplicatievormen.DemeesteIDE’shebbensyntaxhighlighting,code completionenuitgebreidedebugmogelijkheden.
AfhankelijkvandegebruikteIDEhebjemeerofmindermogelijkhedentothetuitbreidenvandeomgevingmet plug-insofadd-ons.Naarmatejemeerervaringhebtmetprogrammereneneenbepaaldemaniervanwerken hebtontwikkeld,kandebehoefteaanbepaaldeplug-ins/add-onsontstaan.VaakzijndeIDE’sstandaardal behoorlijkuitgebreid.
PyCharmIDE
CONCEPT
HoewelveelverschillendegoedeIDE’sinomloopzijnvoorhetprogrammerenvanPython,isPyCharmeenIDE diebekendstaatomzijngebruiksgemak.AnderegoedeIDE’szijnonderandereSublime,VisualStudio(Windows)en VisualStudioCode.DemeesteIDE’szijnverkrijgbaaralseengratisvariantofopensourcevariant.Daarnaastzijn commerciëlevariantenverkrijgbaar.Daarbijzitdemeerwaardevaakinextraprofessionelefunctiesensnelle professioneleondersteuningbijproblemen.
PyCharmwordtontwikkelddoorJetBrains.Zijbiedeneencommerciëlevarianteneenopensourcevariantaan. Voordeontwikkelingvandeapplicatiesinditboekvoldoetdeopensourcevariantruimschoots.DePyCharmIDE heeftdusdanigveelmogelijkhedendateengoedeuitlegeenboekopzichzelfzoukunnenvormen.Wijzullen alleendevooronsdoelbenodigdezakentoelichtenwanneerdezeaandeordekomen.
Installeren
ZorgdatjePythonhebtgeïnstalleerdendatdezewerkt.DithebjenodigvoorhetinteractiefwerkenmetPython omtekunnentesten.
TestenofPythoncorrectisgeïnstalleerd.
PyCharmkanwordengedownloadvandewebsitevanJetBrains: DownloaddegewenstePyCharm-versie.Decommunityeditionkunjevindendoorietstescrollen.
Installatiestappen
(ZONDERBEELD-EN TAALREDACTIE)
JetBrainsheefteenuitgebreidebeschrijvingvoorhoedePyCharmIDEmoetwordengeïnstalleerd.Volgdeze stappenvooreensuccesvolleinstallatie.
InstructiesomPyCharmteinstalleren.
Stapvoorstap
AlsjePyCharmvoordeeerstekeeropstart,kanhetvoelenalsofjevoordeeerstekeerineencockpitvaneen spaceshipstapt.Geenpaniek,wehebbennietallesnodig.Stapvoorstapzullenwemeerfunctiesgaangebruiken naarmateonzeprojectengroterworden.Dezezullenopdatmomentwordentoegelichtenuitgelegd,omdatje pasopdatmomentzietwaartoedefunctionaliteitdient.Jehebtdancontext.
39 Blok1 BeginnenmetPython
JegebruiktduslangnietallefunctiesvandePyCharm-editor.Veelhangtookafvanhetsoortapplicatiesdatje gaatontwikkelen.PyCharmkunjevergelijkenmeteenZwitserszakmes:heelveelfunctionaliteit,maarnietalles hebjealtijdnodig.
Projectaanmaken
WegaanmetPyCharmeennieuwprojectaanmakenviadeoptie‘CreateNewProject’.Wekrijgendandeoptie omaantegevenwaaronsprojectwordtopgeslagen.Destandaardlocatieverschiltperbesturingssysteem (Windows,Linux,MacOSX).Verderishetprincipeopalleplatformengelijk,omdatPyCharmopalleplatformen hetzelfdewerkt.
Watiseenproject?
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
InPyCharmbevindtalleswatjecreëertzichbinnendecontextvaneenproject.Eenprojectiseenverzameling vanverschillendeelementendieaanelkaarzijngerelateerdensameneensoftwareoplossingvormen.Wekunnen nuverschillendedingendoendievoorhetprojectalsgeheelwordengerealiseerd.Inhetbeginzijnbijkleine applicatiesdevoordelenhiervanmindersnelzichtbaar.Later,wanneerwegrotereprojectengaanrealiseren, gaandevoordelenvaneenprojectopvallen.Bijvoorbeeldwanneerwerefactoringgaanrealiserenvaneennaam vaneenfunctie.
Refactoringisdelees-/onderhoudbaarheidvandecodeverbeterenzonderdathierdoordefunctionaliteitverandert. Ingrotereapplicatieshebbenwetemakenmetmeerderebestanden.Wanneerwedenaamvaneenfunctiedie opmeerdereplaatsenvoorkomtwillenaanpassen,ishetheelfoutgevoeligomdaarzelfnaartemoetenzoeken endenaamtewijzigen.Doordatallestothetprojectbehoort,kunnendePyCharm-toolsditsoorttakenvoorje doen.VanwegederelatiestussendeverschillendedelenweetPyCharmwatbijelkaarhoortenkanhetdejuiste actiesondernemen.
Maakeennieuwproject
BijJetBrainshebbenzeeeninstructiegemaaktvooreennieuwprojectaanmaken.Ziehiervoordevolgende website.DezewebsiteheeftextrainformatieoveruitzonderingenalsMacofLinux.
Beschrijvingvanhoejeeennieuwprojectaanmaakt.
Hiernaeenkortstappenplanomeennieuwprojectaantemaken.
40
Figuur 1.7 PyCharm: nieuw project
Klik
(ZONDERBEELD-EN TAALREDACTIE)
CONCEPT
41 Blok1 BeginnenmetPython
opde+ongeveerinhetmiddenvanhetzelfdeschermomeennieuwprojectaantemaken.Jekrijgteennieuw schermomverschillendegegevensvoorhetprojectintevoeren.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Figuur 1.8 Projectgegevens invoeren.
Name:Alseerstegevenwehetprojecteennaam.Inhetvoorbeeldisdit"pythonProject".
Location:Vervolgensbepalenweinwelkefolderhetprojectmoetwordenaangemaakt.Leteropdatdenaam vanhetprojectdehoofdfoldervanhetprojectwordt.Weselecterende"Createamain.pywelcomescript"-optie, zodatwevanPyCharmeenwerkendprogrammakrijgen.Ditprogrammakunnenwedanaanpasseninietswat wijzelfnodighebben.
Git
DeoptieomeenGitrepositoryaantemakenvaltbuitendescopevanhetboek.Hetisechterwelaanteraden omGitofeenandersoftwareversiebeheersysteemtegebruiken.
Interpretertype:Ditkunnenweopdedefaultlatenstaan:"Project venv".Wegaanlaterinhetboekbekijken watditbetekentenwatweermeekunnendoen.
Pythonversion:Ookhierlatenwededefaultstaan.DitisdestandaardPython-installatiediePyCharmheeft gevondentijdenshetopstarten.Wegaanlaterinhetboekbekijkenwatditbetekentenwatweermeekunnen doen.
Wanneerditallemaalnaarwensis,klikjeop"Create"engaatPyCharmaandeslagomhetprojectaantemaken.
42
Figuur 1.9 Nieuw project met een defaultprogramma
CONCEPT
WehebbennudevolledigeIDEgeopendmetaandelinkerkanteentreeviewvanhetproject.Dezekaneriets andersbijjouuitzien,maardatisgeenprobleem.Aanderechterkantzienwehetwelkomstprogrammavan PyCharm.
Wezienhierdatverschillendekleurenwordengebruiktinhetcodedeel.Ditishetzogenoemdesyntaxcolor highlighting.Standaardhebbenbepaaldezakeneenspecifiekekleur,waardoorjedecodeheelsnelkuntlezen. Jeherkentbijvoorbeelddirectdatdegrijzetekstencommentaarzijn.HiermeedoetPythontijdenshetuitvoeren vanhetprogrammaniets.KeywordsinPythonzijnoranjeweergegeven.Functienamenzijninhetblauw,strings inhetgroenenvariabeleninhetwitweergegeven.Inhetbeginisditnogwennen,maaralheelsnelwordtditje tweedenatuur.
Ongeveerhalverwegedecodeziejeeenrodelijneneenroodballetjevoordelijn.Ditiseenbreakpoint.Inde debugmodezalPyCharmopdezeregelstoppenmethetprogrammauitvoeren.Deregelzelfisdannogniet uitgevoerd.Daargaanwelaterinhetboekdieperopin.
(ZONDERBEELD-EN TAALREDACTIE)
TenslottevindjerechtsonderaandeactuelePython-versieentussendehaakjesdegebruiktevenv(virtual environment).
Starthetprogrammadooropdegroeneplaybuttonbovenaanhetschermteklikken.Hiermeewordthetprogramma opeennormalemaniergestart.Onderaanhetschermwordtdeuitvoergetoondineenterminalweergave.
43 Blok1 BeginnenmetPython
Figuur 1.10 Default programmaweergave
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
JeeerstePython-applicatieiseenfeit!
Debuggen
WaarschijnlijkhebjebijhetintikkenvandePython-codeindeinteractievesessiestikfoutengemaakt,waardoor jeniethetresultaatkreegdatjehadverwacht.OfmisschiengebeurdedatineenanderesituatiewaarinPython meteenfoutmeldingkwam.Hopelijkhebjedezefoutensnelherkendenopgelost.
Waaromdebuggen?
Wanneerdeprogramma'sgroterworden,wordthetsteedslastigeromfoutenteherkennen.Zekeralsdefouten hetprogrammaopeenlatermomentpasstoppen.Ofnogerger:hetprogrammadraaitdoor,maarmetverkeerde informatie.Ergensinjecodezittenéénofmeerfouten.Metbehulpvandebuggenkunnenweactiefgaanzoeken naarmogelijkefouteninonsprogramma.
Daarmeehebbenwehetprimairedoelvandebuggentepakken:fouten(bugs)indecodevindenencorrigeren. Foutenkunnenleidentotonverwachtgedrag,crashesofonjuisteresultaten.Doortedebuggenkunnenwede oorzaakvandezeproblemenlokaliserenencorrigeren.
Debuggenhelptonsookomdecorrectheidvaneencodeteverifiëren.Wekunnencontrolerenofdelogicavan hetprogrammaovereenkomtmetdelogicadiewehaddenbedachtenkijkenofdecodedeverwachteresultaten oplevert.
Eenbijeffectvanhetgebruikvandedebuggerisinzichtkrijgeninhoejeprogrammawerkt.Wekunnenmetde debuggerregelvoorregeldecodeuitvoeren,waardoorweinfeitestapvoorstapdooronzecodeheengaan.We kunnendewaardevanvariabelenbijelkeregelbekijkenendevolgordevandeuitvoeringvolgen.Ditiserghandig bijhetproberenbegrijpenvancomplexeofonbekendecode.
Hoedebuggen?
Erzijnverschillendemanierenvandebuggen.Demanierendiewijgaanbekijkenzijn:
• metbehulpvandedebugger
• doormiddelvanprintstatements
• doormiddelvanlogging.
Debugger
Debuggenmetbehulpvandedebuggerishetzwaarsteenkrachtigstemiddel.Wehebbenvolledigecontroleover hetdebugproces.Heteerstewatwemoetendoenisaangevenvanafwaarwewillenbeginnenmetdebuggen.Je bepaaltvantevorenwaarjenaaropzoekbent,vanafwaarjewiltkijkenofwelkewaardedevariabelenhebben. Zeldenbeginjeaanhetbeginvanhetprogramma.
44
Zodrajeditweetzetjedecursoropdedesbetreffenderegel.Viahetmenu,Run->ToggleBreakpoint->Line Breakpoint,wordteenroodballetjevoorderegelgezet.DitkanookmetdetoetscombinatieCtrl+8.Eenandere mogelijkheidisomophetregelnummerteklikken.Danverschijnthetrodeballetjedirect.
Stop op breakpoint
Wehebbennuaangegevendatditdeplekiswaarwehetprogrammawillenlatenstoppenendecontroleviade debuggeraanonswillenlatengeven.Opdatmomentkunnenweervoorkiezenomregelvoorregeldoorhet programmatelopen.
Devolgendecodegaanwegebruikenomeenaantalactiesmetdedebuggeruittevoeren.
#
# Programma waarmee we de functionaliteit van de debugger kunnen
# leren gebruiken.
#
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
# Casus: Gegeven de prijs exclusief btw en het btw-percentage
# Wat kosten dan meerdere laptops exclusief en inclusief btw?
# Laptopgegevens
prijs_laptop_exclusief_btw = 1275.00
btw_percentage = 21.0
aantal_laptops = 7
Figuur 1.11 Debugger: breakpoint op een regel plaatsen.
45 Blok1 BeginnenmetPython
# Bereken de btw
btw_laptop = (prijs_laptop_exclusief_btw / 100.0) * btw_percentage prijs_laptop_inclusief_btw = prijs_laptop_exclusief_btw + btw_laptop
# Bereken de totale order
totale_prijs_exclusief_btw = prijs_laptop_exclusief_btw * aantal_laptops
totale_prijs_inclusief_btw = prijs_laptop_inclusief_btw * aantal_laptops
# Weergeven op het scherm
print(f"Een laptop van €{prijs_laptop_exclusief_btw} kost €\ {prijs_laptop_inclusief_btw} inclusief {btw_percentage}% BTW.")
print(f"Wanneer we {aantal_laptops} laptops kopen, kosten\ deze €{totale_prijs_exclusief_btw} exclusief BTW.")
print(f"Wanneer we {aantal_laptops} laptops kopen, kosten\ deze €{totale_prijs_inclusief_btw} inclusief {btw_percentage}% BTW.")
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Indecodewarensommigeregelstelangomopéénregelophetschermtepassen.PyCharmhanteertdaarvoor eenlimietvan120karakters.Jezietdaarookeenverticalestreep.Jemagverdertikken,maarditwordtgezien als"badpractice".Indecodediehierwordtgegevenishetmaximumnogkortervanwegedruktechnischeredenen. OmeenlangeregelnutochbinnendelimiettekrijgenmagjeinPythoneenbackslash(\)gebruiken.Python interpreteertditdanals'devolgenderegelhoorthiereigenlijkachter'.
Ziebijvoorbeelddevolgendecoderegel:
print(f"Een laptop van €{prijs_laptop_exclusief_btw} kost €\ {prijs_laptop_inclusief_btw} inclusief {btw_percentage}% BTW.")
Naheteurotekenkomtdebackslash.Opdevolgenderegelgaathetgeheelverder.Indeuitvoervanhetprogramma ziejehiervannietsterug.
Breakpoint
Stel,wezetteneenbreakpointopderegel:
btw_laptop = (prijs_laptop_exclusief_btw / 100.0) * btw_percentage
Deregelwordtdaninhetroodweergegevenmeteenroodballetjeaandelinkerkant.
46
Geldigbreakpoint
Eenbreakpointkunjealleenzettenopeenregelmetgeldigecode.Commentaarregelskunjenietselecterenvoor hetplaatsenvanbreakpoints.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
WanneerwehetprogrammanurunnenmetdedebugknopinhetmenuofviadetoetscombinatieAlt+Shift+F9, stoptdatbijonzebreakpoint.Deregelvandebreakpointwordtblauwzodradedebuggerbijhetbreakpointis gestopt.
Onderinhetschermzienwedevariabelenvanonsprogramma.Ditzijndevariabelendiezijnaangemaaktenvan eenwaardezijnvoorzienvoordatonzedebuggerisgestopt.Hetprogrammastaatnustilenwordtnietmeerverder verwerkt.Hetprogrammagaatpasverdernaeenactievanons.
Figuur 1.12 Breakpoint in de code gezet.
47 Blok1 BeginnenmetPython
(ZONDERBEELD-EN TAALREDACTIE)
Figuur 1.13 Variabelen na stop op breakpoint.
Ditgeeftonsdemogelijkheidomrustignaardewaardenvanvariabelentekijken.
• Kloppenzemetwatweverwachten?
• Zijnzehettypedatweverwachthadden?
• Gaathetprogrammadadelijkverdernaarwaarweverwachtendatditnaartoegaat?
Weziendevariabelendieweinonsprogrammahaddenonderinhetschermterug.Althans,alleendevariabelen waarPythonallangsisgeweestvoordatdedebuggerhetprogrammahadgestopt.Weziendathetgaatomeen integerentweefloatingpoints.Dewaardediezehebbenkomtovereenmetdewaardediewehebbentoegekend.
Watweookzienzijn"Specialvariables".Dezekunnenweopenklappen.HierzienwedevariabelendiePython aanmaaktvoordathetprogrammastart.Wezullenlaterziendatwedezevariabelenookinonsprogrammakunnen gebruikenalswedezenodighebben.
Volgende, volgende, etc.
CONCEPT
Wanneerwedevariabelenbekekenhebbenentevredenzijn,kunnenwedoorgaannaardevolgenderegel uitvoerbarecode.DatdoenwemetdetoetsenF7enF8.MetdeF7-toetsstappenweeenfunctieofeenmodule binnen.Somswiljeditniet;eenfunctiekanbijvoorbeeldheelveelregelscodebevatten.Alsjealleengeïnteresseerd bentinhetresultaatvandefunctie,kunjemetdeF8-toetsdefunctielatenuitvoerenenhetresultaatbekijkenin plaatsvanditregelvoorregeluittevoeren.InonzesituatiemaakthetnietuitofwedeF7-ofdeF8-toetsgebruiken, omdatergeenfunctieisdiemoetwordenaangeroepen.
WatookopvalttijdenshetdebuggenisdatachterderegelsindeIDEvariabelenwordengeschreven,inclusiefhun waarden.Naarmateweverderkomen,kunnenweonderinziendaternieuwevariabelenbijkomen.Ditzijn variabelendiezijnaangemaaktenvoorzienvaneenwaardetoenweerlangsstaptenmetdedebugger.
Wanneerwewillenzienwateropdeconsolegebeurt,moetenweonderaanop'console'klikken.
48
1.14
DoorinhetcodedeelteklikkenkunjeweermetdeF7/F8-toetsenverderdoorjeprogrammastappen,totdatje heteindevanhetprogrammahebtbereikt.
CONCEPT
Wanneerjehetprogrammainéénkeerwiltlatendoorlopen,kunjeophetknopje resume klikken,linksnaastde groene run-knop.
Print statements
(ZONDERBEELD-EN TAALREDACTIE)
Wehebbeneenkleinbeetjekunnenzienwatwemetdedebuggerkunnendoen.Dedebuggerheeftveelmeer functies,maarvoornuisditvoldoendekennisvoorheelveelapplicaties.Maarsomswillenwetochsnelwat zienenkunnenwehetprogrammanietstoppenvanwegetimingsproblemen.Ofwewillenbijvoorbeeldachteraf zienwaterwasgebeurd.Vooraldiesituatiesgebruikenweonderandereprintstatements.
Devolgendecodegaanwegebruikenomhetgebruikvanprintstatementstedemonstreren.
#
# Programma waarmee we de functionaliteit van print statements
Figuur
Consoleoutput plaatsen.
Figuur 1.15 Resumeprogramma na stop door debugger.
49 Blok1 BeginnenmetPython
# leren gebruiken.
#
# Casus: Gegeven het aantal producten, de kosten per product en de belasting
# Wat zijn de transportkosten?
# Gegevens
aantal_producten = 159 kosten_per_product = 11.73
belastingtarief = 0.087
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
# Bereken de totale kosten zonder belasting totale_kosten = aantal_producten * kosten_per_product
# Bereken de belasting belasting = totale_kosten * belastingtarief
# Bereken de transportkosten door de belasting toe te voegen transport_kosten = totale_kosten + belasting
print(f"De totale transportkosten voor het transporteren van " f"{aantal_producten} producten a €{kosten_per_product} bij een " f"belastingtarief van {belastingtarief}% bedraagt: " f"€{transport_kosten:.2f}.")
Indecodeziejenogeenmanieromeenlangetekstregeloptebrekeninkleinereregelszonderdathetafbreuk doetaandetekstvoordegebruiker.
Steldatweeenprogrammaaaneencollegagevenendiehetantwoordniethelemaalbegrijpt.Decollegazouhet tussenresultaatvandeberekeningenwillenzienomtekijkenofditovereenkomtmetdewaardendiezein gedachtenhadden.Danwillenwetussenresultatenlatenzienvandeberekeningen.Datkaneenvoudigdoorprint statementstoetevoegennaelketussenberekening.
#
# Programma waarmee we de functionaliteit van print statements
# leren gebruiken.
#
# Casus: Gegeven het aantal producten, de kosten per product en de belasting
# Wat zijn de transportkosten?
50
# Gegevens
aantal_producten = 159
kosten_per_product = 11.73
belastingtarief = 0.087
# Bereken de totale kosten zonder belasting totale_kosten = aantal_producten * kosten_per_product print(f"Totale kosten: €{totale_kosten:.2f}")
# Bereken de belasting belasting = totale_kosten * belastingtarief print(f"Belasting: €{belasting:.2f}")
# Bereken de transportkosten door de belasting toe te voegen transport_kosten = totale_kosten + belasting
print(f"De totale transportkosten voor het transporteren van " f"{aantal_producten} producten a €{kosten_per_product} bij een " f"belastingtarief van {belastingtarief}% bedraagt: " f"€{transport_kosten:.2f}.")
Jezietdeprintstatementstussendecodestaan.Dezegevenwatextrainformatie.Jekuntditschaars(metweinig begeleidendetekst)uitvoeren,maarookheeluitgebreid(metveelbegeleidendetekst).Ditisafhankelijkvande situatieenvanwatjenodighebt.
Wanneerjenuhetprogrammauitvoert,ziejedeprintstatementsteruginjeuitvoer.
Ondankshetfeitdatweonzecolleganiethoevenuitleggenhoededebuggerwerkt,isdezenuinstaatomde tussenwaardentelezen.Enwaarschijnlijkookomnieuwetussenwaardenaantemaken.
Logging
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Wehebbendedebuggerinactiegezienenprintstatementsgebruiktominformatieoveronzeapplicatietetonen. Waaromlogging?Hetgroteverschilmetdevoorgaandemethodenisdatbijlogginggegevenslangdurigkunnen wordenopgeslagen.Daarmeewordtbedoelddatdeinformatieinbijvoorbeeldeentekstbestand,eendatabase ofeenexterneserviceterechtkomt.Dedatazijndanopeenlatermomentweerteanalyseren.
Ditwordtheelveelgebruiktdoorbedrijvendieapplicatiesbijklantenhebbendraaienenwillenwetenhoedeze applicatiespresteren.Doordelogbestandenteanalyserenkunnenzedittewetenkomen.Ookwanneerstoringen optredendiedeontwikkelaarzelfnietkanreproduceren,ishetlogbestandvanonschatbarewaarde.
51 Blok1 BeginnenmetPython
Devolgendecodegaanwegebruikenomhetgebruikvanloggingtedemonstreren.Dezecodebevatelementen dienognietaandeordezijngeweest.Datisopditmomentgeenprobleem.Belangrijkerisdatjezietwathet doet.Aanheteindevanditdeelbenjeinstaatomhetopdezelfdemaniertoetepassenalshoewedatnugaan doen.
#
# Programma waarmee we de functionaliteit van logging
# leren gebruiken.
#
# Casus: Gegeven de reistijden naar de verschillende
# tankstations en de gemiddelde rijsnelheid van de tankauto
# De bevoorraadtijd is bij elk tankstation even lang
# Wat is de totale bevoorradingstijd?
import logging
CONCEPT (ZONDERBEELD-EN
# Configureer het loggingsysteem
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s')
TAALREDACTIE)
# Gegeven waarden: snelheid in km/u en tijd in uren snelheid_tankauto = 60
reistijd_naar_station_1 = 50.0 / snelheid_tankauto
reistijd_naar_station_2 = 30.0 / snelheid_tankauto
reistijd_naar_station_3 = 60.0 / snelheid_tankauto
tanktijd_per_station = 0.5
# Logging
logging.debug(f"Reistijd naar station 1: {reistijd_naar_station_1:.2f} uur.")
logging.debug(f"Reistijd naar station 2: {reistijd_naar_station_2:.2f} uur.")
logging.debug(f"Reistijd naar station 3: {reistijd_naar_station_3:.2f} uur.")
# Bereken de reistijd tussen tankstations
tijd_station_1 = reistijd_naar_station_1 + tanktijd_per_station
tijd_station_2 = reistijd_naar_station_2 + tanktijd_per_station
tijd_station_3 = reistijd_naar_station_3 + tanktijd_per_station
# Logging
logging.info(f"Tijd benodigd voor tankstation 1: {tijd_station_1:.2f} uur.")
52
logging.info(f"Tijd benodigd voor tankstation 2: {tijd_station_2:.2f} uur.")
logging.info(f"Tijd benodigd voor tankstation 3: {tijd_station_3:.2f} uur.")
# Bereken de totale reistijd inclusief tanken
totale_tijd = tijd_station_1 + tijd_station_2 + tijd_station_3
print(f"De tijd om langs 3 tankstations te rijden en deze te bevoorraden is {totale_tijd:.2f} uur.") logging.warning(f"Het bevoorraden van de 3 stations duurt {totale_tijd:.2f} uur.")
Wanneerjehetprogrammauitvoert,krijgjeindeconsoleietswatlijktopdevolgendeafbeelding.
Figuur 1.16 Uitvoer van de logging van het programma.
Deloggingisnuingesteld(datisdedefault)opuitvoernaarhetscherm.Ofnauwkeurigergezegd:opuitvoernaar "standardout".Wepassenditlateraannaareentekstbestand.Maareerst:hoewerktdezecode?
Configureren logger
import logging
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
# Configureer het loggingsysteem logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
InPythonkunnenwegebruikmakenvaneenenormehoeveelheidfunctionaliteitindevormvanmodulesdiedoor anderemensenzijngemaakt.Laterkunookjijmodulesmakendieanderenweerkunnengebruiken.
53 Blok1 BeginnenmetPython
Voordatweeenmodulekunnengebruiken,moetenwedezeimporteren.Datdoenwemetde import-regelinde code.NadieregelkentookPythonalleswatindiemodulegebeurt.Wekunnendusfunctionaliteituitdemodule logginggaangebruiken.Omdittedoenmoetenweaangevendatweietsuitdegewenstemodulewillengebruiken. Datdoenwedoordenaamvandemoduletegebruikenenvervolgenseenpunt.InPyCharmkrijgjedaneenlijst vanonderanderefunctiesenvariabelen.Vooronsvoorbeeldgebruikenwedefunctie basicConfig,dezogenoemde basisconfiguratie.Viadezefunctiegevenwedeloggingparametersop.Inonsvoorbeeldstellenwehetlogginglevel inopdebugengevenweophoedeloggingtekstmoetwordengeformatteerd.
Logginglevels
DeloggingvanPythonheeftmeerderelevels:
Tabel 1.2
CONCEPT (ZONDERBEELD-EN
TAALREDACTIE)
Metonzeinstelling level=logging.DEBUG zeggenweeigenlijkdatelkelogregelmeteenleveldathetzelfdeis (DEBUG)ofhoger(INFO,WARNING,ERRORofCRITICAL)wordtgeregistreerd.Datzagjeookterugindeuitvoer vanonsprogramma.
Methetlevelkunnenwedaninonzecodespelen.WegevenINFObijvoorbeeldominformatiedoortegeven, bijvoorbeeld:programmaisgestart,programmaisgestopt,berekeningenzijnuitgevoerd.TerwijlwevoorWARNING berichtenhebbenalswaardenuitdehandgaanlopen.OpdezelfdemanierkunjebedenkendatjebijERROR echtefoutenwiltweergeven.VoorCRITICALkunjevoorfoutengebruikendiebuitenjouwapplicatieomkomen. Daarophebjegeeninvloed.OmterugtekomenopDEBUG:dezegebruikjeomextrainformatieteregistrerendie tijdenshetontwikkelenhandigkanzijn.Maarwanneerheteenmaalwerkt,hebjedezenietmeernodig.Eventueel welalsiemandlatereenstoringofeenbugheeftgevonden.Doorhetlevelaantepassenkunjemakkelijkschakelen tussendeverschillendeweergaven.
Formatteren van het logbericht
Omdeuitvoervanonzeloggingzinvolenleesbaartekrijgenkunnenwedezeformatteren.Datgeefteenenorme krachtaanhoedeinformatielaterkanwordengeanalyseerd.Inveelgevallenishetvoldoendeomdedatum/tijd, hetlevelendebijbehorendetekstteregistreren.
format='%(asctime)s - %(levelname)s - %(message)s'
Wanneerwevanlinksnaarrechtslezen,zienwedatasctime,denaamvanhetlogginglevelenhetberichtachter elkaaropeenregelwordengezet,gescheidendooreenminteken.Inheelveelgevallenisditwaarschijnlijk voldoende,maarerzijnsituatieswaarinjeietsanderswilt.
Hetkanzijndathetformaatvandedatumnietiszoalsjedatzouwillen.Doormetformatterstewerkenkunje ditaanpassen.Demogelijkhedenomdeberichtenoptemakenzoalsjijdatwiltzijnenorm.Meerinformatie hierovervindjeindePython-documentatie.
Numeriekewaarde Level 0 NOTSET 10 DEBUG 20 INFO 30 WARNING 40 ERROR 50 CRITICAL
54
Bericht naar de logger
Informatienaardeloggersturendoenwealsvolgt:
logging.debug(f"Reistijd naar station 1: {reistijd_naar_station_1:.2f}\ uur.")
Hiersturenwedetekstf"Reistijd naar station 1: {reistijd_naar_station_1:.2f}uur." naarde loggermetalslevelDEBUG.
IndevolgenderegelsturenwedetekstnaardeloggermetalslevelINFO.
logging.info(f"Tijd benodigd voor tankstation 1: {tijd_station_1:.2f} uur.")
Jezietdatheteenvoudigisomtebepalennaarwelkleveljedeinformatiewiltsturen.
Uitvoer wordt tekstbestand
Wanneerwedeuitvoervandeloggingnaareenbestandwillenopslaan,moetenwedeconfiguratievandelogger aanpassen,zodatdezeweetdatdeuitvoernaareenbestandmoetwordengeschreven.Hiervoormoetenwe opgevenwatdenaamvanhetbestandis.Wemoetenopgevenofhetlogbestandelkekeeralsweonzeapplicatie startenwordtoverschreven.
Wepassendeconfiguratiealsvolgtaan:
# Configureer het loggingsysteem
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s', filename='tank_registratie.log', filemode='w')
Hetmooieisnudatweverdernietsaandecodehoevenaantepassen.Deregelsdiewehiervoornaaronzeconsole kregen,krijgenwenuineenbestandgenaamd"tank_registratie.log".Opdeuitvoerzienwealleendetekstvan deprintregel.
Alswenietwillendathetlogbestandsteedswordtgewist,kunnenwede filemode='w' (vanwrite)aanpassen naar filemode='a' (vanappend).Delogregelswordendanonderaantoegevoegd.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
1.6 Begrippen
Operatoren
symbolendiewordengebruiktombewerkingenuittevoerenopwaarden
55 Blok1 BeginnenmetPython
1.7 Oefentoets
Opdracht13
WaaromishetgebruikvandeREPLzobelangrijk?
JekuntdaneenvoudigdetaalPythonlerenbeheersen.
Pythonweetdandatjebeginnerbentenhelptjoumethettypen.
InLinuxwordtookdecommandlinegebruikt.
Jewordtnietoverladenmetfunctiesdiejetochnietgebruikt.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Opdracht14
BerekenindeREPL.Welkeuitkomstisjuist?
(1 / 4) * 26.7 * 26.7
187.552
178.225
-187.552
0.178225
Opdracht15
BerekenindeREPL.Welkeuitkomstisjuist?
(((0.4452 - 1) * 732e-05) / 1.56) + 2.54
-26032920.536923077
2.5373967076923076
25373967076923076
-2.6032920.536923077
Opdracht16
BerekenindeREPL.Welkeuitkomstisjuist?
antwoord_a = -8.97 * (7.4 ** 5.0 - 2.56) / -37.76
antwoord_b = 1.2 + 2.3E-04 + -0.25381
antwoord_c = (64.4 + 2.0) * (0.3262873 - 3.7876) / (0.7777 / 3.1)
56
antwoord_a = 5270.707917711866
antwoord_b = 0.846417777777777
antwoord_c = 916.132964083837
antwoord_a = 5720.707917711866
antwoord_b = 0.946417777777777
antwoord_c = -916.132964083837
antwoord_a = 5270.707917711866antwoord_b = 0.9464199999999999
antwoord_c = -916.132964083837
antwoord_a = 6270.707917711866
antwoord_b = 1.846417777777777
antwoord_c = 416.132964083837
Opdracht17
Wemoeteneenproductinpakkenenverschepen.Hetproductbestaatuit645onderdelen.Ineendoospassen achtonderdelen.Hoeveelonderdelenblijvenoveralsalledozenvolzitten?
Erblijvenzevenonderdelenover.
Erblijvenvijfonderdelenover.
Erblijvenzesonderdelenover.
Erblijvenvieronderdelenover.
Opdracht18
Watzijngoedenamenvanvariabelenvoorhetaantalmensenbijeenwebinar? aantal_attendees aantal
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
bezoekers
webinar_inschrijvers afmelders
Opdracht19
Eenvariabeleheeftdewaarde24.Dezewaardestelthetaantalpoortenopeenswitchvoor.Watiseenpassende naamvoordevariabele?
57 Blok1 BeginnenmetPython
24_poorten
Switchpoorten_24
aantal_poorten switch
Opdracht20
Metwelkecodekunje8.54naareenstringconverterenzodatalleen8indestringkomt?
str(int(8.54))
str(8.54 - 0.54)
str(int(8.54 - 0.54))
int(str(8.54))
Opdracht21
Welkestellingoverdeconversievaneenfloatingpointnaareenintegeriswaar?
Jeraaktprecisiekwijtalsdefloatingpointnietpreciesisafgerond.
Jekrijgtautomatischhetgemiddeldevandefloatingpoint-waarde.
Jekunteenfloatingpointnietconverterennaareeninteger.
Eenfloatingpoint.
Opdracht22
Voorhetuitlijnenvanstringskunjef-stringsgebruiken.Welkecodegebruikjeomeenstring"kandidaten" gecentreerduittelijnenmetruimtevoor25tekens?
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
58
print(f"{'kandidaten':<>25}")
print(f"{kandidaten:<>25}")
print(f"{'kandidaten':-25}")
print(f"{'kandidaten':^25}")
Opdracht23
Welkebeweringisjuist?
EenprojectishandigvoorPyCharm.Dankanhijallesvindenenbijelkaarhoudenbijwijzigingen.
Eenprojectiseenverzamelingvanverschillendeelementendieaanelkaarzijngerelateerd.
MeteenprojectkanPyCharmautomatischbugsreparerenzonderdatjeietshoefttedoen.
Zondereenprojectkunjealleenbestandenviadecommandlinetoevoegen.
Opdracht24
Welkeantwoordmogelijkheidbeschrijfthetbesteendebugger?
Eentooldiewordtgebruiktomfoutenindecodeoptesporen.
Eensoftwarebibliotheekvoorhetuitvoerenvangeautomatiseerdetestsopcode.
Eenframeworkvoorhetontwikkelenvangebruikersinterfacesvoorapplicaties.
Eenprogrammeertaalvoorhetschrijvenvancomplexealgoritmen.
Opdracht25
Kunjedewaardevaneenvariabeleaanpassenalsjemetdedebuggereenbreakpointhebtgeraakt?
Ja,datkanzeker.
Nee,datkanabsoluutniet.
Ja,maaralleenalshetprogrammaisgestopt.
Nee,alleenalsjedatvantevorenaangeeft.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Opdracht26
WelkeuitspraakoverprintstatementsinPythonisjuist?Erzijnmeerdereantwoordengoed.
Printstatementsgevendegebruikerextrainformatieophetscherm.
Printstatementskunnennietwordengebruiktvoorhetdebuggenvancode.
Printstatementskunnenwordengebruiktomvariabelenwaardentetonenentussenresultatenweertegeven tijdenshetuitvoerenvaneenprogramma.
PrintstatementshebbengeeninvloedopdeuitvoeringvaneenPython-programma.
59 Blok1 BeginnenmetPython
Opdracht27
Watiseenbelangrijkdoelvanlogginginsoftwareontwikkeling?
Foutenverbergenvoorgebruikers.
Codeprestatiesoptimaliseren.
Deontwikkelingvannieuwefunctiesversnellen.
Informatieoverdeuitvoeringvandesoftwareenhetopsporenvanproblemenvastleggen.
1.8 Praktijkopdrachten
Inleidingpraktijkopdracht
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Voordepraktijkopdrachtbehandelenwedecasusvaneenfictievebakkerij.BakkerijHetgoudenkorstjeproduceert broodopeenindustriëleschaal.Ditbetekentdatzebroodmaaktvooronderandereverschillende supermarktketens.Elkedagwordenertweemiljoenbrodengebakken.Dezebrodenwordenvervolgensverpakt methetlabelvandebetreffendesupermarktenopgehaalddoordetransporteursvandesupermarkt.
Elkeopdrachtheefteenanderekijkopdewerkzaamhedenenproductievandebakkerij.
Fictiefishetsleutelwoord
Allesindezeopdrachtisverzonnen.Erwordengeenechtereceptendoorgegevenofbakgeheimengedeeld.Het isfictief.
Opdracht28 Brood
Maakeenapplicatievoorhetmakenvanbrood.
Deapplicatiedoethetvolgende:
• Bepaalthetgewichtvandegrondstoffenvoorhetbrood.
• Bepaalthoelanghetmakenduurtals1kilogramgrondstoffen90minutenindeovenbetekent.
• Geeftingoedevolzinnenderesultatenweer.Bijvoorbeeld:'Hetgewichtvaneenheelbroodis1kilogram.Het duurt90minutenvoordathetklaaris.'
# Grondstoffen (in kilogram)
bloem = 0.7
water = 0.5
gist = 0.3
suiker = 0.2
boter = 0.2
Opdracht29 Croissants
Maakeenapplicatiedieberekenthoeveelhetmakenvaneenbestellingcroissantskost.
• Eencroissantkost€0,47omtemaken.
• Wehebbeneenbestellingvan639348croissants.
• Ineendoospassen25croissants.Westurenalleenvolledozen.Deresterendecroissants,dienietverstuurd worden,wordennietgemaakt.
60
• Eendooskost€0,65.
Watzijndetotalekostenvanhetleverenvandegevraagdecroissants?Geefditweeringoedevolzinnen.
Opdracht30 Verkoop
Maakeenapplicatiedieberekenthoeveeldesupermarktverdientaandebrodenencroissants.
• Eenbroodkost€0,69aaninkoopenwordtverkochtvoor€1,81.
• Eencroissantkost€0,47aaninkoopenwordtverkochtvoor€1,21.
• ZehebbeneenbestellingbijBakkerijHetgoudenkorstjevan901662brodenen639348croissants.
• Opeendinsdagverkooptdesupermarkt897362brodenen582533croissants.
Geefingoedevolzinnenweerhoeveelwinstdesupermarktopeendinsdagmaakt.
1.9 Terugblik
Opdracht31 Terugblik
Zeteenkruisjeindekolomdievoorjouvantoepassingis.
Beoordelingscriteria
JekuntdePython-versievoorjouwplatformselecterenendownloaden.
JekuntPythoninstalleren.
JekuntverifiërenofdeinstallatievanPythonisgelukt.
CONCEPT
Opdracht32 Terugblik
Denknaoverwatjehebtgedaaninditblok.
a. Noemtweedingenwaaroverjetevredenbent.
1. 2.
b. Noemtweedingendiejedevolgendekeeranderswiltdoen.
(ZONDERBEELD-EN TAALREDACTIE)
1. 2.
c. Vraagjedocenten/ofleermeesteromfeedback.
Tops:
Tips:
Nee Ja
61 Blok1 BeginnenmetPython
1.10 Toets
Opdracht33
HoesluitjedeREPLnetjesaf? exit() exit
CTRL-C quit
Opdracht34
BerekenindeREPL.Welkeuitkomstisjuist?
2.1 / (3.33 - (1.41 + (1.21 / 4.44) * 0.45) + 3.7)
0.3820012045083025
Opdracht35
BerekenindeREPL.Welkeuitkomstisjuist?
9 / (5 // 2) + (-6.4 ** 1.5)
0.13820012045083025 0.14 0.38
62
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Opdracht36
BerekenindeREPL.Welkeuitkomstisjuist?
antwoord_a = 2.1 / (3.33 - (1.41 + (1.21 / 4.44) * 0.45) + 3.7)antwoord_b = 5.23 ** (4 - 2.34)
antwoord_c = 25 % 3 / 6.98
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
-12
-11.690861620062105 11.690861620062105 12
63 Blok1 BeginnenmetPython
antwoord_a = 15.58521520521654
antwoord_b = 0.3820012045083025
antwoord_c = 0.14326647564469913
antwoord_a = 0.8520012045083025
antwoord_b = 47.58521520521654
antwoord_c = 1.64326647564469913
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
antwoord_a = 3.8930012045083025
antwoord_b = 4.1221520521654
antwoord_c = 0.2864664713
antwoord_a = 0.3820012045083025
antwoord_b = 15.58521520521654
antwoord_c = 0.14326647564469913
Opdracht37
Eenrasterheeft38kolommenen1297rijen.Inelkrastervakjemoeten431itemswordengestopt,waarbijrijvoor rijwordtvolgemaakt.Hoeveelitemshebbenwedannogoveralsallerijenvolzitten?Selecteerhetjuisteantwoord.
Erzijndannog38itemsover.
Erzijndannog13itemsover.
Erzijndannog27itemsover.
Erzijndannog31itemsover.
Opdracht38
Watiseengeldigenaamvooreenvariabele?
aantallogins
_maximale_lengte_4_keer
21_personen
"tijd_datum"
Opdracht39
Eenvariabeleheeftdewaarde"https://".
Watzoueenpassendenaamvoordezevariabelezijn?
64
legeurl
1ste_deel_url
"website" url_scheme
Opdracht40
Metwelkecodeconverteerjedestring "782653" naareengeheelgetal?
int("782653")
float("782653")
bool("782653") get("782653")
Opdracht41
Welkestellingisjuist?
Eenexpressielevertaltijdeenintegerwaardeop.
Eenexpressielevertaltijdeenbooleanwaardeop.
Eenexpressielevertaltijdeenstringop.
Eenexpressielevertaltijdeendecimalewaardeop.
Opdracht42
CONCEPT
TAALREDACTIE)
(ZONDERBEELD-EN
Voorhetuitlijnenvanstringskunjef-stringsgebruiken.Welkecodelevertdevolgendeuitlijningop? |artikel | stuks prijs|
print(f"|{"artikel":20<}|{"stuks prijs":20>}|")
print(f"|{"artikel":<20}|{"stuks prijs":>20}|")
print(f"|{"artikel":^20}|{"stuks prijs":20^}|")
print(f"|{"artikel":20}|{"stuks prijs":20}|")
65 Blok1 BeginnenmetPython
Opdracht43
Welkebeweringiswaar?
Refactoringisdelees-/onderhoudbaarheidvandecodeverbeterenzonderdathierdoordefunctionaliteit verandert.
Refactoringisdelees-/onderhoudbaarheidvandecodeverbeterenenvoegteenverbeteringtoevoorde gebruiker.
Refactoringisalleennodigalsjecodenietwerkt.
Refactoringresulteertaltijdinkorterecode.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Opdracht44
Hoegaanwenadatwemetdedebuggerzijngestoptweerverder?
Klikkenopderesumebutton.
MetdetoetscombinatieShift+F9.
Nahetstoppenopeenbreakpointkunjenietdoorgaanmetdeuitvoeringvanhetprogramma.
Hetprogrammagaatautomatischverderalsjedevariabelenhebtbekeken.
Opdracht45
Kunjededebuggerlatenstoppenopeencommentaarregelvooreeninteressantecoderegel?
Nee,datkanniet.
Ja,datkanzeker.
Ja,datkanalsdeinteressanteregeleenfunctieis.
Nee,datkanalleenineennieuwbestand.
Opdracht46
Jeprogrammaberekenthetverschiltussentweetijdenenberekentdaarvooreenwaarde.Hettijdverschilmag maximaal250millisecondenzijnvoordathetfoutgaat.Nuhebjeeenfout.Watisdebestemethodeomdiete debuggen?
Ikzeteenbreakpointbijdeberekeningenprobeerteberedenerenwatergebeurt.
Ikvoegprintstatementstoeaanmijncode,zodatikkanzienwatergebeurt.
Ikstarthetprogrammaweervoordatde250millisecondenvoorbijzijn.
Ikzetineencommentaarerbijdatereenfoutis.
Opdracht47
Welkestellingiswaar?
Logginglatenaanvullentijdensdeontwikkelingiseengoedidee.
Logginglatenoverschrijventijdensdeontwikkelingiseengoedidee.
Loggingisalleenhandigtijdensdeontwikkelingsfaseenheeftgeenwaardeindeproductie.
Jemoetaltijdallelogniveaus(DEBUG,INFO,WARN,ERROR)gebruikenvoorelkelogboodschapomvolledige informatietebehouden.
66
Blok2
Collecties
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Collectieszijndatastructurendiebedoeldzijnvoorhetopslaanvanmeerdereelementen.Debelangrijkste ingebouwdecollectiesinPythonzijn:
• List(lijst)inPythoniseengeordendeverzameling.Ditbetekentdatdeelementenindelijstindezelfdevolgorde blijvenalsdiewaarinjezeerinhebtgestopt.Delistismutable,watbetekentdaternieuweelementenaan toegevoegdkunnenworden.Elementenkunnenookwordenverwijderd.
• Tuple(tuple)inPythoniseengeordendeverzameling.Detupleisechterinmutable,watonveranderbaar betekent.Elementenkunnennietmeerwordentoegevoegdofverwijderd.
• Dictionary(dictionary)inPythoniseensindsPythonv3.7geordendeverzameling.Vóórv3.7washetonbekend watnatoevoegendevolgordewasvandeelementen.
Leerdoelen
1. Jekuntconditiesgebruiken.
2. Jekuntlists/tuplesgebruikenencorrecttoepassen.
3. Jekuntdictionariesgebruikenencorrecttoepassen.
4. Jekuntloopsgebruikenencorrecttoepassen.
Opdracht1
OriëntatieopdrachtCollecties
Bijcollectieszoalswediehebbengezienhebjemisschiengelijkideeën.Watdenkjebijvoorbeeldwatvoor informatieineenlijstzoukunnenwordengestopt?
Watvoorinformatiezoujeineennietmeerveranderbaretuplewillenstoppen?
Watvoorinformatiezoujeineendictionarywillenstoppen?
a. Geefdrieconcretevoorbeeldenvaneenlijstuithetdagelijksleven.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
b. Geefdrieconcretevoorbeeldenvaneenlijstdiejeineenprogrammazoutegenkomen.Denkdaarbijaande verschillendestukkencodediejealhebtgemaakt.Watzouineenlijstkunnenstaanofwaarzoujeeenlijst voorwillengebruiken?
2.1 OpdrachtensetCondities
Opdracht2 Condities
RaadpleegzonodigdetheorieoverCondities.
a. InwelkdatatypewordtTrueofFalseonthouden?
Boolean Integer
Floatingpoint String
b. Welkebeweringenzijnwaar?Erzijnmeerdereantwoordengoed.
68
if 12:
Blok met code dat wordt uitgevoerd als de expressie True is if temperatuur < -5:
Blok met code dat wordt uitgevoerd als de expressie True is if personen = 5:
Blok met code dat wordt uitgevoerd als de expressie True is if water_niveau() > 35:
Blok met code dat wordt uitgevoerd als de expressie True is
c. Welkebeweringzorgtervoordatdeelsewordtaangesproken?
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
69 Blok2 Collecties
if 12 > 6: Blok dat wordt uitgevoerd als de expressie True is else:
Blok dat wordt uitgevoerd als de expressie False is if True: Blok dat wordt uitgevoerd als de expressie True is else:
Blok dat wordt uitgevoerd als de expressie False is if False:
(ZONDERBEELD-EN TAALREDACTIE)
Blok dat wordt uitgevoerd als de expressie True is elif True:
Blok dat wordt uitgevoerd als de expressie True is else:
Blok dat wordt uitgevoerd als de expressie False is if False:
Blok dat wordt uitgevoerd als de expressie True is elif False:
Blok dat wordt uitgevoerd als de expressie True is else:
Blok dat wordt uitgevoerd als de expressie False is
d. Watisdefunctievan input()?
Drukthetberichtophetschermaf.
CONCEPT
Vraagtdegebruikerominput.
Degebruikerkanhiergetalleninvoeren. Degebruikerkanhierlettersinvoeren.
e. Devolgendecodevraagtdegebruikerwatdeactuelespaarrenteis.Degebruikergeeftalsinvoer1.75endrukt opdeentertoets.
Watishetdatatypevandevariabelerente?
rente = input("Wat is de actuele spaarrente? ")
String
Integer Float
Boolean
f. Vraagdegebruikernaardenaamvandeafdeling.Alsdenaamvandeafdeling“R&D”is,geefdan“Research andDevelopment”ophetschermweer.Wanneerdenaamvandeafdelingietsandersis,geefdandezenaam ophetschermweer.
70
g. Indecloudzijndekostenvooreenharddisk€0.002138/uurenvooreenvirtuelecomputer€4.13/uur.Vraagde gebruikerhoeveeluurdevirtuelecomputeraanstaat.
Berekenvervolgenswatdekostenzijnvoordeopgegevengebruiksduur.Geefdetotalekostenweerineen zin,waarbijslechtstweedecimalenachterdekommamoetenwordengetoond.
2.2 OpdrachtensetHerhalingen
Opdracht3 Herhalingen
RaadpleegzonodigdetheorieoverHerhalingen.
a. Wanneergebruikjeeen for-herhalingslus?
Alsjeweethoeveelelementenjehebt.
Alsjegaatstoppenvoordatjeaanheteindebent.
Alsdewhileloopnietwerkt.
Alsjeeenstringwiltprinten.
b. Waaromgebruikje enumerate() meteen for-herhalingslus?
Alsjeeenindexnodighebtomtewetenwaardeherhalingslusis.
Alsjedeloopprofessioneelwiltmaken.
Alsjeeenfloatingpoint-variabelenodighebtindeherhalingslus.
Alsjeeenextravariabelenodighebt.
c. Vraagdegebruikeromeenbasisgetalengeefvoordeeerstetienregelsdevermenigvuldiging.
Voorbeeld:
Gebruiker heeft 4 opgegeven, weergave is als volgt:
1 x 4 = 4
2 x 4 = 8
3 x 4 = 12
10 x 4 = 40
d. Maakeenlijstmetnamenvankleuren:rood,wit,blauw,geel,groen,zwart,violet,cyaan,geel.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Gameteenfor-herhalingslusdoordelijstengeefdekleurophetschermweer.Alsjedekleurgeeltegenkomt, gajedoormetdevolgendekleur.
e. Maakeenlijstmetsuperhelden:Superman,SuperGirl,Spiderman,Batman,BatWoman,BatGirl,Captain America,WonderWoman,Aquaman,CatWoman.
Geefdeeersteachtsuperheldenindelijstophetschermweermeteenindexnummerervoor,zodatditer ongeveeralsvolgtuitziet.Gebruikhiervoordewhile-herhalingslus.
71 Blok2 Collecties
[0] Superman
[1] Super Girl
f. Maakeenlijstmetsuperhelden:Superman,SuperGirl,Spiderman,Batman,BatWoman,BatGirl,Captain America,WonderWoman,Aquaman,CatWoman.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Gametdewhile-herhalingslusdoordelijstengeefdesuperheldenonderelkaarophetschermweer.Superheld "Captain America" slajeover.Deweergaveiszoalshiernaisweergegeven.
[0] Superman
[1] Super Girl
2.3 OpdrachtensetList
Opdracht4 List
RaadpleegzonodigdetheorieoverList.
a. Maakeenlijstmettypenmobieletelefoons.BijvoorbeeldGooglePixel7a,SamsungS24ofPhiPhoneone14. Geefdezetotalelijstonderelkaarweer.
b. Geefhetderdeenzesdeelementuitdevolgendelijstonderelkaarweer. componenten = ['CPU', 'Geheugen', 'Moederbord', 'Grafische kaart', 'Opslag', 'Voeding']
c. Jehebteenlijstmetboodschappen.DaaraanwiljeinPythonietstoevoegen.Hoedoejedit?
Achteraanmetappend()
Ergensinhetmiddenmetinsert()
Aanhetbeginmetpop()
Inhetmiddenmetextend()
d. Maakeenlijstmetdevolgendecomputeronderdelen:Tower,Muis,Toetsenbord,Monitor.Voegdaarachter vervolgensmetPythonhetvolgendeaantoe:ExterneHD.Geefdeelementenvandelijstonderelkaarophet schermweer.
e. Maakeenlijstmetdevolgendeinternetprotocollen:HTTP,HTTPS,FTP,SFTP,POP3,IMAP,SMTP.Geefdelijst ophetschermweer.VerwijderhetFTP-protocolengeefdelijstophetschermweer.Verwijderhetlaatste elementuitdelijstengeefdeonderdelenvandelijstonderelkaarophetschermweer.
f. Maakeenlijstmetlettersuithetalfabet(atotenmetk).Selecteervervolgensvanafdelettercomdedrie letterseenlettertotheteindevandelijst.Geefdeselectieweerophetscherm.
72
g. WelkeoptieselecteertdewoordenInformatie,OverdrachtenSignaal?
communicatie_woorden=['Bericht','Dialoog','Informatie','Verbinding','Overdracht','Interactie','Signaal','Kanaal']
woorden = communicatie_woorden[2::2]
woorden = communicatie_woorden[3::2]
woorden = communicatie_woorden[3] + communicatie_woorden[5] + communicatie_woorden[7]
woorden = [] for index, communicatie_woord in enumerate(communicatie_woorden): if index == 3 or index == 5 or index == 7: woorden.append(communicatie_woord)
2.4 OpdrachtensetTuple
Opdracht5 Tuple
RaadpleegzonodigdetheorieoverTuple.
a. Erzijntweelijsten: nummers_1 = [1, 2, 3, 4, 5] en nummers_2 = [4, 5, 6, 7, 8]
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Voegdetweelijstensamenindevariabelemetdenaam nummers_3 Verwijdervervolgensheteersteenhet laatsteelement.Maakereentuplevan.
b. Jehebteentuplebestaandeuitdrieelementen:deproductnaam,dehoeveelheidendeprijsperproduct. Berekendeprijsvoordebestelling(aantal * prijs)metdevolgendetuple.Geefdeprijsineenvolzinop hetschermweer.
bestelling = ('TP-Link Archer AX11000', 4, 371.47)
73 Blok2 Collecties
2.5 OpdrachtensetDictionary Dictionary3
Opdracht6 Dictionary
RaadpleegzonodigdetheorieoverDictionary.
a. WelkebeweringoverdictionariesinPythoniswaar?Erzijnmeerdereantwoordengoed.
Dictionarieszijngeordendecollectiesvanelementen.
Eendictionarykanalleennumeriekewaardenbevattenalssleutels.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Dictionarieskunnenwordenaangepast.Ditbetekentdatelementenkunnenwordentoegevoegd,gewijzigd ofverwijderd.
HetisnietmogelijkomeenlegedictionarytemakeninPython.
b. Hiernaeendictionarymetstudentenenhunleeftijd.HoekunjedeleeftijdvanstudentEvaopvragen?
studenten = {'Jan': 18, 'Eva': 20, 'Pieter': 19, 'Linda': 21} studenten['Eva'] studenten[2] studenten[20] studenten['eva']
c. Eenboodschappenlijstheeftdevolgendeitems:
• Jumbo,Tijgerbruinbrood
• Ah,Optimelkers/aardbei
• Lidl,kiwi.
Maakhiervaneendictionaryengeefdeproductenonderelkaarweer.Voegvervolgenshetvolgendeitemtoe:
• Kruitvat,hoestdrank.
Geefdeproductenonderelkaarweer.
d. Hiernadegegevensvanvierfictievebedrijven.Maakeendictionaryomdezegegevenseenvoudigtekunnen opzoeken.
1. Dijkgraaf&ZonenBouwbedrijf,06-12345678
2. TulpenlandBloemenhandel,020-9876543
3. GrachtenGourmetCatering,030-1122334
4. WindmolenEnergieInnovations,071-5554444.
Geefdelijstonderelkaarweerenvraagdegebruikeromeenbedrijfsnaam.Geefmeteenvolzinhet telefoonnummervanhetbedrijfaandegebruiker.
2.6 TheorieCollecties Condities
Wezulleninditblokkijkennaarcollectiesenhoedezeonshelpenomonzedatastructurentestructureren.Om ditefficiënttekunnendoen,moetenweeerstkijkennaarconditiesenloops.Watzijnconditiesenloopsenhoe gebruikenwedeze?
74
Invoervandegebruiker
Zonderinvoeriseenprogrammavrijwelnutteloos.InPythonkunnenwedeinvoervandegebruikerverkrijgen metdefunctie input() Dezefunctielevertaltijdeenstringterug.Omdegebruikertelatenwetenwatwevan diegeneverwachten,kunnenweeentekstmeegevenaandeinputfunctie.
naam = input("Wat is je naam? Naam: ") print(f”Welkom en bedankt voor je invoer {naam}.")
Wanneerjehetprogrammasuccesvolhebtingevoerd,opgeslagenenuitgevoerd,zietdeuitvoereralsvolgtuit. Denaamisuiteraardwatjezelfhebtingevoerd. Wat is je naam? Naam: Robert Welkom en bedankt voor je invoer Robert.
Invoer van getallen
De input()-functielevertaltijdeenstringterug.Ditbetekentdatalswedegebruikeromgetallenvragendeze altijdmoetenwordengeconverteerdnaareengetalvoordatwediealseengetalkunnengebruikeninbijvoorbeeld eenberekening.Ditdoenwemetdeconversiefunctie.Afhankelijkvanhetgewenstedatatypegebruikenwe int() of float().
btw bedrag = (ingevoerde bedrag / 100) * 21 totaal bedrag = bedrag + btw bedrag
TAALREDACTIE)
CONCEPT
Maakeennieuwprogrammawaarinwedebtwgaanberekenenoverhetbedragdatdegebruikerinvoert.Voor deformuleomditteberekenengebruikenwe:
Hierbijishetbtw-percentage21%.
bedrag_invoer = input("Geef het bedrag excl. BTW op: ") bedrag = float(bedrag_invoer)
btw_bedrag = (bedrag / 100.0) * 21.0
print(f"Het BTW bedrag over euro {bedrag:.2f} bedraagt euro {btw_bedrag:.2f}.")
print(f"Het totaal bedrag inclusief BTW bedraagt euro \ {bedrag + btw_bedrag:.2f}.")
(ZONDERBEELD-EN
Wanneerwedecodebekijken,zijnerenkeleopvallendezaken.Alsnaamvoordevariabelediedeinvoervande gebruikergaatonthoudenis bedrag_invoer gebruikt.Dewoorden bedrag en invoerzijnvanelkaargescheiden dooreenunderscore.Eennaamvaneenvariabelemaggeenspatiesbevatten.InPythonishetgebruikelijkom eenunderscoretegebruikenomdewoordenvanelkaartescheidenomdeleesbaarheidteverhogen.Deinput levertaltijdeenwaardevanhetdatatypestringterug.Alsdevariabelebedraghadgeheten,zoujekunnendenken dathetomeengetalgaat.Weesexplicietdooraantegevenwatjebedoelt.
Omdatwewillenrekenen,ishetnoodzakelijkomdeingevoerdestringteconverterennaareendatatypewaarmee wekunnenrekenen.Hierisgekozenvoorhetdatatypefloat,omdatdekansgrootisdatweeengebrokengetal alsuitkomstkrijgen.Wegaannamelijkdelendoor100.
75 Blok2 Collecties
Metdegeconverteerdewaardehebbenweeenvariabelemetdenaambedragvanhetdatatypefloatgekregen, waarindewaardevanhetingevoerdebedragstaat.Hierkunnenwevervolgensdebtwuitrekenenmetdegegeven formule.Indeformulewordtgedeelddoor100.0envermenigvuldigdmet21.0.Erisbewustgebruikgemaaktvan floatingpoint-getallen.Hiermeewordtbewustgezegd:'Ikweetdatergebrokengetallengaankomen.'Wees expliciet.Ziedederderegel:btw_bedrag = (bedrag / 100.0) * 21.0.
Hetresultaatvandeberekeningwordtvervolgensophetschermmettweedecimalenachterdekomma weergegeven.Jekuntbijformattedstringsookeenberekeningtussendeaccoladeszetten.Ditisgedaaninde laatsteprintregel:{bedrag + btw_bedrag:.2f}.Ditissomshandig,maarweegditbewustaf.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Beslissingen:alsdit,dandat
Inprogramma'smoetenwevaakbeslissingennemenopbasisvancondities.Voorbeeldenzijn:
• Alseengebruikereengeldigeinlognaam/geldigpaswoordheeft,danmaghijinloggen.
• AlseenMAC-adresnietisgeregistreerd,danwordendenetwerkpakkettengeweigerd.
• AlseengebruikerisingelogdenrechtenheeftopdeNAS,danwordtdefoldergetoond.
• Alsdedatumvaneenbestandouderisdan180dagenofdebestandsgroottegroterisdan100MBenhetbestand ouderisdan90dagen,danwordthetbestandgearchiveerd.
Zoalsjezietzijnverschillendeconditiesmogelijk.Deconditieswordenexpressiesgenoemd.Expressies vertegenwoordigeniets,zoalsgetallen,tekstenofobjecten.Eenexpressiekanooksamengesteldzijn,bijvoorbeeld 'detemperatuurishogerdan75graden'.Ditiseencombinatievaneenvariabeleeneenconstante.Daarbijisde conditiedatdevariabeleeenhogerewaardemoethebbendan75voordatdeconditiealswaarwordtbeschouwd. InalleanderegevallenwordtdewaardealsFalsebeschouwd.Ditzijnvergelijkingenzoalswedievanwiskunde kennen.
Tabel 2.1
Symbool
Betekenis
Groter >
Groterofgelijkaan >=
Kleiner <
Kleinerofgelijkaan
Gelijkaan
En and
Of or
VoorbeeldvanwatTrueoplevert
3156 > 672
3.14 >= 1.28
90 < 100
8.0 <= 8.0
"test" == "test"
toets_ingedrukt = True gereed = True
toets_ingedrukt and gereed
klaar = True stop = True
klaar or stop
not not klaar
Niet(inverteerthetresultaat:iets watTrueiswordtFalseenwatFalse iswordtTrue)
klaar = False
InPythonkunnenwebeslissingenprogrammerendoormiddelvandevolgendevarianten:
If-constructie
<=
==
76
if <expressie>:
Blok met code dat wordt uitgevoerd als de expressie True is
If / else-constructie
if <expressie>:
Blok met code dat wordt uitgevoerd als de expressie True is
else:
Blok met code dat wordt uitgevoerd als de expressie False is
If / elif-constructie
if <expressie 1>:
Blok met code dat wordt uitgevoerd als expressie 1 True is
elif <expressie 2>:
TAALREDACTIE)
CONCEPT
If / elif / else-constructie
if <expressie 1>:
Blok met code dat wordt uitgevoerd als expressie 2 True is
Blok met code dat wordt uitgevoerd als expressie 1 True is
elif <expressie 2>:
Blok met code dat wordt uitgevoerd als expressie 2 True is
elif <expressie x>:
Blok met code dat wordt uitgevoerd als expressie x True is
else:
(ZONDERBEELD-EN
Blok met code dat wordt uitgevoerd als de expressie x False is Een voorbeeld met beslissingen
Vraageengebruikernaarzijnusername.Vergelijkdezemetbekendegegevens.Dezegegevenszijnzelfbedacht enkunnenhardindecodewordeningevoerd.
77 Blok2 Collecties
gebruikersnaam_invoer = input("Geef uw gebruikersnaam: ")
wachtwoord_invoer = input("Geef uw wachtwoord: ")
if gebruikersnaam_invoer == "Wall-e" and wachtwoord_invoer == "30juli2008":
print(f"Welkom {gebruikersnaam_invoer}, je bent succesvol ingelogd.")
else:
print("Ongeldige gebruikersnaam of paswoord.")
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Inhetvoorbeeldwordtdoormiddelvande input()-functieaandegebruikergevraagdwatzijngebruikersnaam enwachtwoordzijn.Vervolgenswordtgecontroleerdofdegebruikersnaamdieisingevoerddoordegebruiker gelijkisaanwatbinnenhetsysteembekendis.Inditgevalisbinnenhetsysteem Wall-e bekend.Tegelijkertijd moethetwachtwoordkloppenmetwatbinnenhetsysteembekendis,namelijk 30juli2008 Ditwordt afgedwongendoorhetkeyword"and".
Ookkaneenconditievoorkomenwaarbijéénvanbeidegoedis.Ditkanwordengeregeldmethetkeyword“or”.
wifi_invoer = input("Is er wifi beschikbaar [j/n]: ")
4G_invoer = input("Is er 4G beschikbaar [j/n]: ")
if wifi_invoer.upper() == "J" or 4G_invoer.upper() == "J":
print("Internet verbinding wordt opgebouwd. Online.")
else:
print("Geen internet verbinding. Offline.")
Aandegebruikerwordtgevraagdwatvoorverbindingeris.Alsinvoeroptieis “j/n” meegegeven.Omdatde gebruikerzoweleenkleineletteralseenhoofdletterkangebruikenbijdeinvoer,converterenwedeinputnaar eenbekendesituatie.Inplaatsvanbeide,zowelhoofdlettersalskleineletters,tecontrolerenwordtdefunctie upper() vanstringgebruikt.Dezefunctiemaaktvankleinelettershoofdletters.Andersomwasook mogelijkgeweest,namelijkdoordefunctie lower() vanstringtegebruiken.Dezefunctiemaaktvanhoofdletters kleineletters.Wehaddendeinvoervandegebruikerdanmoetenvergelijkenmetdekleineletter “j”
Herhalingen
ErzijntweesoortenherhalingeninPython:de for ende while.
Herhalingenmetde for hebbendoorgaanseenbekendaantalherhalingen.Ditkomtomdatherhalingenmetde forgebruiktwordenbijiteratiesoverreeksen.Iteratieovereenreeksbetekentdatjevaneenreekssteedshet volgendegegevenopvraagt.Eenaantalvoorbeelden:
Eenreekskanbijvoorbeeldeenaantaloplopendegetallenzijnuiteenlijst,dictionarymetverschillende sleutel/waardeparen,tuplesofstrings.
78
Herhalingenmetde while wordenvaakgebruiktbijherhalingenwaarbijnietduidelijkishoevaakdeherhaling moetwordenuitgevoerd.Voorbeeldenzijn:
• Gebruikersvragenombepaaldegegevens,zoalseengebruikersnaamenwachtwoord.
• Losseregelsuiteenbestandlezenopzoeknaareenspecifiekeregel.
• Opnieuwprobereneenbestandtelezennadatditwasmislukt.
Defor-herhalingslus
Omtezienhoedeherhalingmeteen for werktkijkenwenaarhetvolgendeeenvoudigevoorbeeld.
url = "www.python.org"for letter in url: print(letter)
Deoutputzieteralsvolgtuit: www.python.org
Eenstringisookeenreeks,namelijkeenreekskarakters.Inhetvoorbeeldkrijgtdevariabelenaamurldewaarde van"www.python.org".Deregelfor letter in url: kanwordengelezenals'geefmeuitdereeksurlhet volgendeelement'.
Deeerstekeerisditdeletterw Dezewordtdantoegekendaandevariabelemetdenaamletter.De print-statementgeeftdewaardevandevariabeleletterophetschermweer.Hetprogrammagaatweerterug naarderegelmet for voorhetvolgendeelement.Ditherhaaltzichtotdatalleelementenuitdereeksurlaande variabeleletterzijngegeven.Deprintstatementwordtdannietmeeruitgevoerdendeherhalingenzijnteneinde. De for-herhalingenzijnklaar.
For met een index
Omdatdeherhalingmeteen for automatischverloopt,wetenweniethoeveelelementeneralgeweestzijn. Somsisditeenbelangrijkgegeven,bijvoorbeeldwanneerjepasvanafhetderdeelementietswiltgaandoen.Dit kunnenwezelfbijhoudenmeteenteller.
url = "www.python.org"
teller = 0
for letter in url:
if teller > 3 and teller < 10: print(f"{teller}:{letter}")
teller = teller + 1
Deoutputzieteralsvolgtuit:
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
4:p5:y
9:n 79 Blok2 Collecties
6:t 7:h 8:o
Dooreentellerteintroducerenkanmetbehulpvanbeslissingenwordenbepaaldwanneerwelkeletterwordt weergegeven.Omditvoorelkaartekrijgenhebbenwedrieregelsextramoetentoevoegen.Namelijkderegel waarinwedevariabelemetdenaamtelleropnulinitialiseren,deregelwaarinwedebeslissingnemenofiets magwordengeprintenderegelwaarinwedewaardevandetellermet1ophogen.
Pythonheefthiervooreenandere,eenvoudigereconstructie,namelijkdefunctie enumerate() Ditisde"Pythonic way"omditterealiseren.
url = "www.python.org" teller = 0
for teller, letter in enumerate(url): if teller > 3 and teller < 10: print(f"{teller}:{letter}")
Deoutputzieteralsvolgtuit:
4:p
5:y
6:t
7:h
8:o
9:n
CONCEPT (ZONDERBEELD-EN
TAALREDACTIE)
De for-herhalingenlopenlangsdeelementenuitdereeks.De enumerate levertnaasthetvolgendeelementuit dereeksdepositieindereeksterug.Depositiewordttoegekendaandevariabelemetdenaamteller.Terwijlhet elementuitdereekswordttoegekendaandevariabelemetdenaamletter.
Binnenhetcodeblokisbekendwelkelementopeenbepaaldmomentuitdereeksisgehaald.Dewaardestaat indevariabelemetdenaamteller.Heteersteelementuitdereeksheeftoffset0,deletter'w'.
Foronderbrekenmetbreak
Somswiljeniethelemaaltothetlaatsteelementindereeksgaanvoordatjeverdergaatmethetprogramma. Hetkanvoorkomendatjehetelementdatjenodighadhebtgevonden.Dankunjestoppenmetelementenophalen. Hiervoorgebruikjehetkeyword break.
teller >= 10: break else: print(f"{teller}:{letter}")
Deoutputzieteralsvolgtuit:
0:w
1:w
2:w
80
3:.
Methetkeyword break stapjeuitdehuidigeherhalingslus. Wanneerjeechtertweeherhalingslusseninelkaar hebt,zorgthetkeywordbreakervoordatdehuidigeherhalingslusstopt.Maardebuitensteherhalingslusgaat gewoondoor.
url = "www.python.org"
resultaat = ""
for regel in [0, 1, 2, 3]: for teller, letter in enumerate(url): if teller >= 10: break else:
resultaat = resultaat + letter
TAALREDACTIE)
print(f"{resultaat}")
resultaat = ""
Deoutputzieteralsvolgtuit:
www.python
www.python
www.python
www.python
CONCEPT (ZONDERBEELD-EN
Hetvoorbeeldisietsuitgebreid.Eriseenvariabelemetdenaamresultaatvanhettypestringtoegevoegd.Deze isineersteinstantieleeg.Eriseenextraherhalingmet for toegevoegd,dievierherhalingenwiluitvoeren(0..3). Deherhalingmetdetweede for isdebinnensteherhalingslus.Dezewordtookweldeinnerloop(binnenste herhalingslus)genoemd.
Debinnensteherhalingslusstaptlangsdelettersvandevariabele url Elkeletterdiewordtaangewezendoor url[letter],wordttoegevoegdaandevariabelemetdenaam resultaat.
4:p 5:y 6:t 7:h 8:o 9:n
81 Blok2 Collecties
Ophetmomentdatdebinnensteherhalingslusstoptvanwegede break,gaathetprogrammaverderbijde print-functie.Hierwordenallelettersdiezijntoegevoegdaandevariabelemetdenaam resultaat weergegeven opéénregel.Devariabelemetdenaam resultaat wordtvervolgensweerleeggemaakt.
Formetcontinue
Somswiljedoorgaanmethetvolgendeelementindereekszonderdatjehethuidigeelementeerstmoetverwerken. Hetkanvoorkomendatjehetelementdatjenietnodighebtgevondenhebt.Jekuntdandoorgaanmethet volgendeelement.Hiervoorgebruikjehetkeyword continue
url = "www.python.org"
for teller, letter in enumerate(url):
if letter == '.':
continue else:
print(f"{teller}:{letter}")
CONCEPT (ZONDERBEELD-EN
Deoutputzieteralsvolgtuit:
TAALREDACTIE)
Methetkeyword continue gajedirectnaarhetvolgendeelement.Wanneerjetweeherhalingslusseninelkaar hebt,zorgthetkeyword continue ervoordatdehuidigeherhalingslusnaarhetvolgendeelementgaat.
url = "www.python.org"
resultaat = ""
for regel in [0, 1, 2, 3]:
for teller, letter in enumerate(url):
if letter == '.': continue
0:w 1:w 2:w 4:p 5:y 6:t 7:h 8:o 9:n 11:o 12:r 13:g
82
else:
resultaat = resultaat + letter
print(f"{resultaat}")
resultaat = ""
print("Einde")
Deoutputzieteralsvolgtuit:
wwwpythonorg
wwwpythonorg
wwwpythonorg
wwwpythonorg
Einde
Hetvoorbeeldisietsuitgebreid.Netalsbijde for in for meteen break iseenvariabelemetdenaam resultaat vanhettype string toegevoegd.Dezeisineersteinstantieleeg.Eriseenextraherhalingmet for toegevoegd, dievierherhalingenwiluitvoeren [0, 1, 2, 3] (ishetzelfdeals range(4)).Deherhalingmetdetweede for isdebinnensteherhalingslus.
Debinnensteherhalingslusstaptlangsdelettersvandevariabele url.Elke letter diewordtaangewezendoor url[letter],wordttoegevoegdaandevariabelemetdenaam resultaat
Ophetmomentdatdeinnerloopdoorgaatvanwege continue,gaathetprogrammaverderbijde for teller, letter …-code.Hetvolgendeelementwordtuitdereeksgehaald.Inditvoorbeeldisdatdevolgendeletter.Pas alsdebuitensteforklaaris,gaathetprogrammadoornaarprint("Einde").Inditvoorbeeldisdatookdelaatste regelcode.
Dewhileloop
Omtezienhoedeherhalingmeteen while werktstaathiernaeeneenvoudigvoorbeeld:
url = "www.python.org"
teller = 0
while teller < len(url):
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
letter = url[teller]
print(letter)
teller += 1
Deoutputzieteralsvolgtuit:
w w w 83 Blok2 Collecties
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Eenherhalingmeteen while heeftaltijdeenconditie.Zolangdeconditiedewaarde True oplevert,wordthet codeblokuitgevoerd.Ditishetverschiltenopzichtevandeherhalingmeteen for Deconditiekunnenwezelf bepalen.Daardoorkunnenwezelfbepalenhoelangdeherhalingblijftdoorgaan.
Bijdeherhalingenmeteen for hebbenwegeziendatdestringalseenreekskarakterswerdbenaderd.
Watbijherhalingenmeteen for automatischgaatmoetenwebijdeherhalingmeteen while zelfregelen.Dit geeftflexibiliteit,maarookextrainspanning.Hetvoorbeeldiswatuitgebreidtenopzichtevanhetzelfdevoorbeeld meteen for-herhaling.Devariabelemetdenaam url heeftdewaarde "www.python.org" Eriseenvariabele metdenaamtellertoegevoegd.Dezegaatdeindexpositiebinnendestringbijhouden.
Voordeconditievandeherhalingengebruikenwedevergelijkingdatdevariabelemetdenaam teller 1lager isdandelengtevande string indevariabelemetdenaam url.Delengtevande string wordtbepaaldmet defunctie len() Dezefunctiegeeftbijeen string hetaantalkaraktersterugdieinde string zitten.Defunctie kanookwordengebruiktbijanderecollecties.Defunctiegeeftdanterughoeveelelementenindecollectiezitten.
Delettersindestringwordenviaeenindexbenaderd.Destringwasnamelijkeenreekskarakters.Bijde list hebbenwegeziendatdezedoormiddelvaneenindexdeverschillendeelementenkondenbenaderen.Elkekeer dathetcodeblokwordtdoorlopen,wordteenletteruitdestring url aangewezendoordetellerentoegewezen aandevariabele letter.De letter wordtvervolgensophetschermweergegevenende teller wordtmet1 verhoogd.Deoptelling teller += 1 telt1opbijdehuidigewaardevan teller Ditishetzelfdeals teller = teller + 1
Uiteindelijkzaldewaardevan teller gelijkwordenaandelengtevandestring url Opdatmomentisonze conditievoordeherhalingnietmeerwaarenlevertdatFalse op.Decodeinhetcodeblokwordtdannietmeer doorlopen.
Whileonderbrekenmetbreak
Somswiljenietalleendeconditievande while afwachtenenisereenandereredenwaaromjewiltstoppenmet deherhalingen.Hetkanvoorkomendateenerroroptreedt,waardoorverdergaanmetdeherhalingengeenzin meerheeft.Jekuntdanstoppenmetelementenophalen.Hiervoorgebruikjehetkeyword break
url = "www.python.org"
teller = 0
while teller < len(url):
. p
y t h o n . o r g
84
if teller >= 10: break
else:
letter = url[teller]
print(f"{teller}:{letter}")
teller += 1
Deoutputzieteralsvolgtuit:
Hetkeyword breakwerkthetzelfdealsbijde for Ookwanneerjetweeherhalingslusseninelkaarhebt,zorgthet keyword break ervoordatdehuidigeherhalingslusstoptmaardebuitensteherhalingslusdoorgaat.
url = "www.python.org"
resultaat = ""
teller = 0
regel = 0
while regel < 4: while teller < len(url): if teller >= 10: break
else:
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
resultaat = resultaat + url[teller]
teller += 1
print(f"{resultaat}")
resultaat = ""
regel += 1
teller = 0
0:w 1:w 2:w 3:. 4:p 5:y 6:t 7:h 8:o 9:n
85 Blok2 Collecties
Deoutputzieteralsvolgtuit:
www.python
www.python
www.python
www.python
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Hetvoorbeeldisietsuitgebreid.Eriseenvariabelemetdenaam resultaat vanhettype string toegevoegd.
Dezeisineersteinstantieleeg.Eriseenextraherhalingmet while toegevoegd,dievierherhalingenwiluitvoeren.
Deherhalingmetdetweede while isdebinnensteherhalingslusenwordtookweldeinnerloopgenoemd.
Debinnensteherhalingslusstaptlangsdelettersvandevariabele url Elkeletterdiewordtaangewezendoor url[letter],wordtaandevariabelemetdenaam resultaat toegevoegd.
Ophetmomentdatdebinnensteherhalingslusstoptvanwegede break,gaathetprogrammaverderbijde print-functie.Hierwordenallelettersdiezijntoegevoegdaandevariabelemetdenaam resultaat weergegeven opéénregel.Devariabelemetdenaam resultaat wordtvervolgensweerleeggemaakt.Devariabelemetde naam regel wordtmet1opgehoogd.Ditisdetellervandebuitensteherhalingslus.Devariabelemetdenaam teller wordtop 0 gezet,zodatdebinnensteherhalingslusopnieuwkanwerken.Wanneerweditnietzouden doen,isdeconditiebijde while directvoldaan.Dewaardevandevariabelemetdenaamtellerisdannamelijk nog 10.
Whilemetcontinuedoorlatengaan
Ookmeteen while-herhalingsluswiljesomsdoorgaannaardevolgendeherhalingzondereerstdehuidige bewerkingaftemaken.Hetkannamelijkvoorkomendatereenandereconditieiswaaropjewiltreageren.Hiervoor gebruikenwenetalsbijde for-herhalingenhetkeyword continue
url = "www.python.org"
for teller, letter in enumerate(url): if letter == '.': continue else: print(f"{teller}:{letter}")
Deoutputzieteralsvolgtuit: 0:w
2:w 86
1:w
Methetkeyword continue gajedirectweernaarhettestenvandeconditievande while-lus.Bijherhalingslussen meteen while moetjebijgebruikmakingvanhetkeyword continue heelgoedbekijkenofjeconditienoggoed werkt.Inhetvoorgaandevoorbeeldishetnoodzakelijkomdevariabelemetdenaam teller1optehogen voordathetkeywordcontinuewordtaangeroepen.Wanneerweditnietzoudendoen,komtdeherhalingslusin eenoneindigeloopterecht.Hetprogrammastoptdannietmeerenblijftsteedsziendatdevariabelemetde naam letter een '.'alswaardeheeft.Alsdanhetkeyword continue wordtaangeroepen,isdeconditievan deherhalingslushetzelfde.
Wanneerjetweeherhalingslusseninelkaarhebt,zorgthetkeyword continue ervoordatdehuidigeherhalingslus naardeconditievandewhilegaat.
url = "www.python.org"
resultaat = ""
teller = 0
regel = 0
while regel < 4:
while teller < len(url):
letter = url[teller]
if letter == '.':
teller += 1
continue else:
resultaat = resultaat + url[teller]
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
teller += 1
print(f"{resultaat}")
resultaat = ""
regel += 1
teller = 0
4:p 5:y 6:t 7:h 8:o 9:n 11:o 12:r 13:g
87 Blok2 Collecties
print("Einde")
Deoutputzieteralsvolgtuit:
wwwpythonorg
wwwpythonorg
wwwpythonorg
wwwpythonorg
Einde
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Hetvoorbeeldisietsuitgebreid.Netalsde while inwhilemeteen break iseenvariabelemetdenaam resultaat vanhettype string toegevoegd.Dezeisineersteinstantieleeg.Eriseenextraherhalingmetwhiletoegevoegd, dievierherhalingenwiluitvoeren.Deherhalingmetdetweede while isdebinnensteherhalingslusenwordtook weldeinnerloopgenoemd.
Debinnensteherhalingslusstaptlangsdelettersvandevariabelemetdenaam url.Elke letter diewordt aangewezendoor url[letter],wordttoegevoegdaandevariabelemetdenaam resultaat
Ophetmomentdatdeinnerloopdoorgaatvanwegede continue,gaathetprogrammaverderbijde while teller < len(url)…-code.Deconditiewordtgetest.Pasalsdebuitenstewhileklaaris,gaathetprogramma doornaarde print("Einde").Inditvoorbeeldisdatookdelaatsteregelcode.
List
Delist(lijst)inPythoniseendatatypedateenreekskanbevatten.Reeksenkomenheelvaakvoorinprogramma's, omdatzehandigvaakaanelkaargerelateerdedatagroeperen.Voorbeeldenvandergelijkedatazijn:
• IP-adressenvaneennetwerksegment
• namenvanmedewerkersvaneenafdeling
• kleurenvoordelijnenineengrafiek.
Delistiseendatatypedatkanwordenaangepast.Ditbetekentdatnadatdelistisaangemaaktdezenogkan wordenuitgebreidofingekort.Ookkandewaardevandeelementenwordenaangepast.Ditwordteenveranderlijk (mutable)datatypegenoemd.
Verschillendesoortendata
InPythonherkenjeeenlistaandevierkantehaken: [].Elkelementindelistwordtdoormiddelvaneenkomma gescheiden.Bijvoorbeeldeenreeksteksten.Eninditvoorbeeldeenaantalbesturingssystemen:
besturingssystemen = ["Windows", "Linux", "Mac OS", "OS/2"]
print(besturingssystemen)
Deoutputwordtdan: ["Windows", "Linux", "Mac OS", "OS/2"]
Ditdatatypeiszoflexibeldatheteenreekskanbevattendiebestaatuitverschillendeanderedatatypen.
Bijvoorbeeld:
88
informatie = [25, 8293.28798, "JOnbekend", 'a', ["Windows", "Linux"]] print(informatie)
Deoutputwordtdan: [25, 8293.28798, "JOnbekend", 'a', ["Windows", "Linux"]]
Index
Wanneerweeenelementuitdereekswillenhalen,kunnenwedezemetbehulpvaneenindexbenaderen.Het eersteelementbevindtzichopindex0,hettweedeelementopindex1,hetderdeelementopindex2,enzovoort.
CONCEPT
(ZONDERBEELD-EN TAALREDACTIE)
Wanneerweuitdereeksinformatiedestring"JOnbekend"willenbenaderen,gebruikenweindex2.Ditomdat destringhetderdeelementindereeksis.
Figuur 2.1 List - Elementen in een lijst
89 Blok2 Collecties
informatie = [25, 8293.28798, "JOnbekend", 'a', ["Windows", "Linux"]]
naam = informatie[2] print(naam)
Deoutputwordtdan: JOnbekend
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Hetlaatsteelementiseenlist.Andersgezegd:hetlaatsteelementisindezeinformatiereekseenlist,dieopzichzelf ookweerbestaatuitelementen.
informatie = [25, 8293.28798, "JOnbekend", 'a', ["Windows", "Linux"]]
besturingssysteem_reeks = informatie[4]
print(besturingssysteem_reeks)
Deoutputwordtdan: ["Windows", "Linux"]
Wanneerwedaarhettweedeelementwillenhebben,isditindex1indelistvanhetlaatsteelement.Hetlaatste elementishetvijfdeelementopindex4.
informatie = [25, 8293.28798, "JOnbekend", 'a', ["Windows", "Linux"]]
besturingssysteem_reeks = informatie[4] print(besturingssysteem_reeks)
besturingssysteem = besturingssysteem_reeks[1] print(besturingssysteem)
Deoutputwordtdan: ["Windows", "Linux"]
Linux
Ditkunjeookkorteropschrijvenzondereenextravariabelenodigtehebben.Datdoejedoordirectdeindex4 uitdeeerstereeksendeindex1uitdetweedereeksaantewijzen.
informatie = [25, 8293.28798, "JOnbekend", 'a', ["Windows", "Linux"]]
besturingssysteem = informatie[4][1] print(besturingssysteem)
90
Aantalelementen
Wekunnenaaneenlijstvragenhoeveelelementenerinzitten.Datdoenwemetdefunctie len().
informatie = [25, 8293.28798, "JOnbekend", 'a', ["Windows", "Linux"]]
aantal_elementen = len(informatie)
print(aantal_elementen)
Defunctie len() kunnenwevoorallecollectiesgebruikenomtekijkenhoeveelelementenerinzitten.Dusook omtezienhoeveelkaraktersineenstringzitten.
aantal_karakters = len("Welkom")
print(aantal_karakters)
Elemententoevoegen
Totzoverhebbenwegezienhoeweelementenaaneenlistkunnentoevoegenophetmomentdatweonze variabeleinitialiseren.Wekunnenookelementenachteraftoevoegen.
Pythonheeftverschillendemanierenomelementenaaneenlisttoetevoegen.Elementenkunnenaandelist wordentoegevoegdmetdefunctiesappend(), insert() en extend()
Append
Defunctie append() voegteenenkelelementtoeaanheteindevandelist.Deoriginelelistwordtaangepast; dezewordtéénelementlanger.
informatie = [25, 8293.28798, "JOnbekend", 'a', ["Windows", "Linux"]] informatie.append(999)
print(informatie)
Deoutputwordtdan: [25, 8293.28798, "JOnbekend", 'a', ["Windows", "Linux"], 999]
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
91 Blok2 Collecties
List - Append een element
CONCEPT
(ZONDERBEELD-EN TAALREDACTIE)
Insert
Defunctie insert() voegteenelementtoeopdeopgegevenindex.Eventueleelementendieernakomenworden danéénpositienaarrechtsopgeschoven.
Illegaleindex
Wanneerjeeenindexopgeeftdiegroterisdandelist,wordtdezeachteraandelisttoegevoegd.Ditwordtoverigens welgezienalseennietnettemaniervanprogrammeren.Datmoetjezientevermijden.
informatie = [25, 8293.28798, "JOnbekend", 'a', ["Windows", "Linux"]] informatie.insert(2, 999) print(informatie)
Deoutputwordtdan: [25, 8293.28798, 999, "JOnbekend", 'a', ["Windows", "Linux"]]
Figuur 2.2
92
TAALREDACTIE)
Figuur 2.3 List - Weergave na een insert
Extend
Defunctie extend() voegtdeelementenvandetoetevoegenlisttoeaanheteindevandehuidigelist.Ditklinkt ingewikkeld.Maarhetbetekentnietsandersdandatdeelementenvaneentweedelistwordentoegevoegdaan deeerstelist.
informatie = [25, 8293.28798, "JOnbekend", 'a', ["Windows", "Linux"]]
extra_informatie = [999, "netwerk"]
informatie.extend(extra_informatie)
print(informatie)
CONCEPT (ZONDERBEELD-EN
Deoutputwordtdan: [25, 8293.28798, "JOnbekend", 'a', ["Windows", "Linux"], 999, "netwerk"]
Inplaatsvandefunctie extend() kunjeookgebruikmakenvande + operator
informatie = [25, 8293.28798, "JOnbekend", 'a', ["Windows", "Linux"]]
extra_informatie = [999, "netwerk"]
93 Blok2 Collecties
informatie = informatie + extra_informatie print(informatie)
Delistuitbreidenmeteenanderelistkanookdoormiddelvande += operator.Ditleidttoteenkortereschrijfwijze.
informatie = [25, 8293.28798, "JOnbekend", 'a', ["Windows", "Linux"]] extra_informatie = [999, "netwerk"] informatie += extra_informatie print(informatie)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Figuur 2.4
Elementenverwijderen
Totzoverhebbenwegezienhoeweelementenaaneenlistkunnentoevoegentijdensdeinitialisatieenmet behulpvanverschillendefuncties.Somsmoetenweookelementenuiteenlistverwijderen.Uiteraardisditook mogelijk.
Pythonheeftverschillendemanierenomelementenuiteenlistteverwijderen.Elementenkunnenuiteenlist wordenverwijderdmetdefunctiesremove() en pop()
List - Visuele weergave na extend, + operator of += operator
94
Remove
Defunctie remove() verwijderthetmeegegevenelementuitdelijst.Dezefunctieverwijdertheteersteelement dathetzelfdeisalshetmeegegevenelement.Alshetzelfdeelementmeerderekerenindelistaanwezigwas,blijft derestgewoonindelistzitten.Alleelementenaanderechterzijdevanhetverwijderdeelementschuivenéén positieopnaarlinks.
informatie = [25, 8293.28798, "JOnbekend", 'a', ["Windows", "Linux"]] informatie.remove('a') print(informatie)
Deoutputwordtdan: [25, 8293.28798, "JOnbekend", ["Windows", "Linux"]]
CONCEPT (ZONDERBEELD-EN
TAALREDACTIE)
Pop
Defunctie pop() verwijderteenelementuitdelistvandeopgegevenindex.Dezefunctieleverthetverwijderde elementterugalsresultaat.Wanneerjegeenindexmeegeeft,wordthetlaatsteelementuitdelistverwijderden teruggeleverd.
Figuur 2.5 List: visuele weergave na remove
95 Blok2 Collecties
informatie = [25, 8293.28798, "JOnbekend", 'a', ["Windows", "Linux"]] data = informatie.pop(1)
print(data)
print(informatie)
data2 = informatie.pop()
print(data2)
print(informatie)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Deoutputwordtdan:
8293.28798
[25, "JOnbekend", 'a', ["Windows", "Linux"]]
["Windows", Linux"]
[25, "JOnbekend", 'a']
Snijden
Hetkomtvaakvoordatjeslechtseendeelvaneenreeksnodighebt.Bijvoorbeelddeeerstevijfelementen,het laatsteelementofdeelementen3totenmet6.Normaalgesprokenzoujeeenherhalingmet for makenende specifiekeelementeneruithalen.Ditisbehoorlijkwatextracode.VoorditsoorttakenheeftPythoneenmanier omreeksentesnijden:slicing.
getallen_reeks = [1, 2, 3, 4, 5, 6, 7, 8]deel_reeks = getallen_reeks[3:6]
print(deel_reeks)
print(getallen_reeks)
Deoutputwordtdan:
[4, 5, 6][1, 2, 3, 4, 5, 6, 7, 8]
Figuur 2.6 List: visuele weergave na het verwijderen van elementen met pop
96
Inditvoorbeeldzienwedateendeeluitdetotalereekswordtgekopieerd.Namelijkindex3,element4,totindex 6.Letop:datistotindex6ennietinclusiefindex6.Index5ishetlaatsteelementdatwordtgekopieerd.
Jekuntooksnijdenmeteenstapgrootte.Bijhetsnijdengeefjedandevolgendegegevensop:
[ start : stop : stapgrootte ]
Bijvoorbeeld:
getallen_reeks = [1, 2, 3, 4, 5, 6, 7, 8]
deel_reeks = getallen_reeks[3:6:2]
print(deel_reeks)
print(getallen_reeks)
Deoutputwordtdan:
[4, 6]
[1, 2, 3, 4, 5, 6, 7, 8]
Inditvoorbeeldwordtdeselectiegekopieerd,maarmeteenstapgroottevan2.Hetgetalopindex3is4.Twee elementenverderopindex5ishetgetal6.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Figuur 2.7 List: visuele weergave na slice [3:6]
97 Blok2 Collecties
Impliciet snijden
CONCEPT (ZONDERBEELD-EN
TAALREDACTIE)
Jemagdeverschillendegegevensachterwegelaten,afhankelijkvanjebedoeling.Jezietditveelterugin voorbeeldcodeopinternet.Wanneerjenietallegegevensinvoert,hebjehetoverimplicietsnijden.Jehebtdan eenbepaaldeverwachtingvandeontbrekendeparameters.Bijexplicietsnijdengeefjedeparametersop. getallen_reeks = [1, 2, 3, 4, 5, 6, 7, 8]
deel_reeks = getallen_reeks[:4]
print(deel_reeks)
print(getallen_reeks)
Deoutputwordtdan:
[1, 2, 3, 4]
[1, 2, 3, 4, 5, 6, 7, 8]
Inditvoorbeeldwordtervanuitgegaandatdeselectiebegintbij0.Implicietverwachtenwedusdat getallen_reeks[0:4] wordtuitgevoerd.
getallen_reeks = [1, 2, 3, 4, 5, 6, 7, 8]
deel_reeks = getallen_reeks[::2]
print(deel_reeks)
print(getallen_reeks)
Deoutputwordtdan:
[1, 3, 5, 7]
[1, 2, 3, 4, 5, 6, 7, 8]
Inditvoorbeeldwordtervanuitgegaandatdeselectiebegintbij0totheteindemeteenstapgroottevan2.Impliciet verwachtenwedusdat getallen_reeks[0:8:2] wordtuitgevoerd.
Figuur 2.8 List: slice met stapgrootte
98
getallen_reeks = [1, 2, 3, 4, 5, 6, 7, 8]
deel_reeks = getallen_reeks[::]
print(deel_reeks)
print(getallen_reeks)
Deoutputwordtdan:
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
Inditlaatstevoorbeeldwordtsnijdenzonderstart,stopenstapgroottegebruiktomeenkopievaneenlistte maken.Wanneerweeenlistaaneenanderevariabelenaamtoekennen,wordtgeenkopiegemaakt.Erzijndan tweevariabelendienaardezelfdelistkijken.Eenvoorbeeld:
reeks_a = [1, 2, 3, 4, 5, 6, 7, 8]
reeks_b = reeks_a
print(reeks_a)
print(reeks_b)
reeks_a.append(999)
print("reeks_a is aangepast.")
print(reeks_a)
print(reeks_b)
Deoutputwordtdan:
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
reeks_a is aangepast.
[1, 2, 3, 4, 5, 6, 7, 8, 999]
[1, 2, 3, 4, 5, 6, 7, 8, 999]
Wanneerweeenelementaandelist reeks_a toevoegen,zienwedat reeks_b hettoegevoegdeelementook ziet.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
99 Blok2 Collecties
Figuur 2.9 List: visuele weergave van twee aan dezelfde lijst toegevoegde variabelen
Omeenechtekopietemakenvandelistmoetenwedezesnijdenzonderstart-enstopwaardenintevullen.
Daarbijmaakthetnietuitofwede [:]-ofde [::]-variantgebruiken.Eenvoorbeeld:
reeks_a = [1, 2, 3, 4, 5, 6, 7, 8]
reeks_b = reeks_a[:]
print(reeks_a)
print(reeks_b)
reeks_a.append(999)
print("reeks_a is aangepast.")
print(reeks_a)
print(reeks_b)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Deoutputwordtdan:
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
reeks_a is aangepast.
[1, 2, 3, 4, 5, 6, 7, 8, 999]
[1, 2, 3, 4, 5, 6, 7, 8]
Reeksensnijdenwerktnietalleenoplijsten,maaropallecollecties
Zoekenineencollectie
Python.Inclusiefstrings.
Somsmoetenweineencollectiezoekenomtezienofdezeeenbepaaldelementbevat.Ditkunnenwedoendoor eenfor-herhalingslustegebruikenendoordecollectietelopenenelkelementtetesten.
cijfers = [6, 8, 6, 10, 4, 6, 6, 8, 9, 7] for cijfer in cijfers: if cijfer == 4:
Figuur 2.10 List: visuele weergave van een kopie van de lijst
van
100
print("Je bent gezakt")
Maardatisnietdebestemanieromdittedoen.Pythonheefthiervoorhetkeyword'in' .Daarmeekunnenwede testeenvoudigerrealiseren.
cijfers = [6, 8, 6, 10, 4, 6, 6, 8, 9, 7]
if 4 in cijfers:
print("Je bent gezakt")
Hetisalshetwaredezelfdetest,maarnuishetcompacteropgeschreven.Erisdusgeenfor-herhalingslusmeer nodig.Erisalleensprakevaneenconditionelevergelijking.
Beperkingvan'in'
Wanneerwemeerdereelementenmetdezelfdewaardeindecollectiehebben,geeft in alleen Trueterugalshet desbetreffendeelementindecollectieaanwezigis.Maaralshetelementmeerderekerenindecollectievoorkomt, wordtditnietaangegeven.
Aantal elementen in een collectie
Inbepaaldesituatieswiljehetaantalkerendateenelementineencollectiezitweten.Wehebbengeziendatje ditmeteenfor-herhalingsluskuntachterhalen.Dooreentellertoetevoegenkunjehetaantalkerendathet elementwordtgesignaleerdtellen.
cijfers = [6, 8, 6, 10, 4, 6, 6, 4, 9, 7]
aantal = 0
for cijfer in cijfers:
if cijfer == 4:
aantal += 1
print(f"Het getal 4 komt {aantal} keer voor in de lijst cijfers")
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Ditkaneenvoudigermetdefunctie count().Hetvoorbeeldzieterdanalsvolgtuit:
cijfers = [6, 8, 6, 10, 4, 6, 6, 4, 9, 7]
aantal = cijfers.count(4)
101 Blok2 Collecties
print(f"Het getal 4 komt {aantal} keer voor in de lijst cijfers")
Tuple
DetupleisookeendatatypevanPython.Dezeisvergelijkbaarmeteenlist,alleenkunjedewaardenachteraf nietmeerwijzigen.Bijeenlistkunjeachterafnogelemententoevoegenofweghalen.Detupleisimmutable (onveranderlijk).Zodrajedezehebtaangemaakt,kunjedienietmeerwijzigen.Jekuntdangeenelementen toevoegen,geenelementenverwijderenengeenelementenaanpassen.
InPythonherkenjeeentupleaande () Elkelementindetuplewordtdoormiddelvaneenkommagescheiden. Bijvoorbeeldeenreeksteksten.Eninditvoorbeeldeenaantalgetallenenbesturingssystemen:
informatie = (25, 8293.28798, ("Windows", "Linux"))
print(informatie)
CONCEPT (ZONDERBEELD-EN
Deoutputwordtdan: (25, 8293.28798, ("Windows", "Linux"))
Wanneerweeenelementuitdereekswillenhebben,kunnenwedezemetbehulpvaneenindexbenaderen.Het eersteelementbevindtzichopindex0,hettweedeelementopindex1,hetderdeelementopindex2,enzovoort. Ditwerktopexactdezelfdemanieralsbijeenlist.
TAALREDACTIE)
102
CONCEPT
(ZONDERBEELD-EN TAALREDACTIE)
Wanneerjetocheenelementindetuplewiltwijzigen,kunjedetupleconverterennaareenlist.Hetelementkan danwordengewijzigd.Nadatjehethebtgewijzigd,kunjedelistweerconverterennaareentuple.Eenvoorbeeld:
informatie = (25, 8293.28798, ("Windows", "Linux"))
informatie_list = list(informatie)
print(informatie_list)
informatie_list[1] = 150.5
Figuur 2.11 Tuple: visuele weergave van de elementen
103 Blok2 Collecties
print(informatie_list)
informatie = tuple(informatie_list)
print(informatie)
Deoutputwordtdan: [25, 8293.28798, ("Windows", "Linux")] [25, 150.5, ("Windows", "Linux")] (25, 150.5, ("Windows", "Linux"))
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Dictionary
EendictionaryisookeencollectionvanPython,netalsdelistendetuple.DictionarieswordeninterninPython veelvuldiggebruikt.Netalsdelistkandedictionarywordenuitgebreidenverkleindtijdensrun-timeenisdeze eenmutabledatatype.Ditalleszonderdatextrakopieënmoetenwordengemaakt.Dedictionarykanditheel efficiënt.Eendictionaryherkennenweaandecurly-braces,deaccolades{}.Ditzijndezelfdeaccoladesalsdiewe ineenformattedstringgebruiken.Pythonherkentechterinwelkecontextzewordengebruikt.Daardooris duidelijkofheteenvariabeleiswaarvandewaardemoetwordenafgebeeld(ineenformattedstring)ofdathet gaatomeendictionary.
Key-value
Hetbelangrijksteverschiltusseneenformattedstringeneendictionaryisdatdedataineendictionarynietvia hunpositie(eenindex)maarviaeenkeywordenbenaderd.Dedictionarywerktmeteenzogenoemdkey-valuepaar. IndevolgendefiguurisRotterdamdekey(sleutel)enishetgetal641326devalue(waarde).Dewaarde641326 hebbenweopgeslagenbijdekeyRotterdam.
Figuur 2.12 Dictionary: key-value
Stel,wemakeneendictionarymeteenaantalstedenenhuninwonersaantallen.Danzietditeralsvolgtuit:
inwoners_steden_nl = {"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Utrecht": 349234, "Eindhoven": 229637, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954}
print(inwoners_steden_nl)
104
Deoutputwordtdan:
{"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Utrecht": 349234, "Eindhoven": 229637, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954}
Schematischzoudedictionaryeralsvolgtuitzien:
Figuur 2.13 Dictionary: schematische weergave
Inhetgroenzienwedekeyeninhetblauwdevalue.Inhetgroenzijndenamenvandestedengebruiktalsde keyeninhetblauwhetaantalinwonersalsdevalue.
Dekeywordtgebruiktomeenwaardetoetevoegenoftelezen.Eenkeykanmaaréénkeervoorkomenineen dictionary.Omdatwedataopslaanmeteenkey,kunnenwealleendataopvragenalsdekeybestaat.Indienwe eennietbestaandekeygebruiken,krijgenweeen KeyError.
Alswedeinwonersaantallenwillenweten,moetenwedevalueopvragenviadekeyvandedictionary.Datkan alsvolgt:
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
inwoners_rotterdam = inwoners_steden_nl["Rotterdam"]
print(f"Aantal inwoners Rotterdam: {inwoners_rotterdam}.")
inwoners_almere = inwoners_steden_nl["Almere"]
print(f"Aantal inwoners Almere: {inwoners_almere}.")
105 Blok2 Collecties
Deoutputwordtdan:
Aantal inwoners Rotterdam: 641326
Aantal inwoners Almere: 205058
Weziendatinhetvoorbeeldanno2019eenx-aantalinwonersineenstadwoont.Wehebbendenamenvande stedenalskeybenoemdenhetaantalinwonersalsvalue.Ditklinktlogischalsjebekijkthoejedevaluewiltgaan gebruiken,zoalsinonsvoorbeeld.WevragenhetaantalinwonersvandestadRotterdam: inwoners_steden_nl[“Rotterdam”]
Rotterdamishierbijdekey,hetantwoord 641326 isdevalue.Desyntaxzieteruitalsofjedeindexvaneenlistof tuplegebruikt,maardeindexheeftnueennaaminplaatsvaneennummer.Ditverhoogtdeleesbaarheidenorm.
Wekunnenvoordekeyalleniet-muteerbaredatatypentoepassen.Ditzijndatatypendienietkunnenworden aangepast,waaronderstrings,integers,floatsentuples.Alskeykunjegeenlistgebruiken,wantdieismuteerbaar. Elementenkunneneraanwordentoegevoegdofverwijderd.Ditzoubetekenendatdekeyverandert.Datkanniet bijeendictionary.Jezoukunnendenkendateenstringookmuteerbaaris,maarditisniethetgeval.Intern,in Python,wordteenstringgekopieerdnaareennieuwestringalsjedezeaanpast.
Dewaardendiewebijdekeyvandedictionaryopslaan,kunnenbestaanuitelkdatatype.
Elemententoevoegen
CONCEPT (ZONDERBEELD-EN
Erkunnenelementenaandedictionarywordentoegevoegddooreennieuwekeymeteenvaluetoetevoegen.
Ookkunnenelementenuiteendictionarywordenverwijderd.
TAALREDACTIE)
inwoners_steden_nl = {"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Utrecht": 349234, "Eindhoven": 229637, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954}
print(inwoners_steden_nl)
print("De stad Nijmegen wordt toegevoegd.")
inwoners_steden_nl["Nijmegen"] = 176162
print(inwoners_steden_nl)
Deoutputwordtdan:
{"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Utrecht": 349234, "Eindhoven": 229637, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954}
De stad Nijmegen wordt toegevoegd.
{"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Utrecht": 349234, "Eindhoven": 229637, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954, "Nijmegen": 176162}
Elemententellen
Bijeendictionarykanmetde len()-functieooknaarhetaantalelementenwordengevraagd.
106
inwoners_steden_nl = {"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Utrecht": 349234, "Eindhoven": 229637, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954}
print(inwoners_steden_nl)
steden = len(inwoners_steden_nl)
print(f"Er zijn {steden} steden opgeslagen.")
Deoutputwordtdan:
{"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Utrecht": 349234, "Eindhoven": 229637, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954}
Er zijn 8 steden opgeslagen.
Elementenverwijderen
Wekunnenelementenuitdedictionaryverwijderendoordefunctie del()tegebruiken.Wegevendandedictionary endeteverwijderenkeymee.
inwoners_steden_nl = {"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Utrecht": 349234, "Eindhoven": 229637, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954}
print(inwoners_steden_nl)
del(inwoners_steden_nl["Eindhoven"])
print("De stad Eindhoven is verwijderd.")
print(inwoners_steden_nl)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Deoutputwordtdan:
{"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Utrecht": 349234, "Eindhoven": 229637, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954}
De stad Eindhoven is verwijderd.
107 Blok2 Collecties
{"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Utrecht": 349234, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954}
Jekuntookelementenuitdedictionaryverwijderenmetdefunctie pop().
inwoners_steden_nl = {"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Utrecht": 349234, "Eindhoven": 229637, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954}
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
print(inwoners_steden_nl)
inwoners_verwijderde_stad = inwoners_steden_nl.pop("Utrecht")
print(f"De stad Utrecht is verwijderd, de stad heeft {inwoners_verwijderde_stad} inwoners.")
print(inwoners_steden_nl)
Deoutputwordtdan:
{"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Utrecht": 349234, "Eindhoven": 229637, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954}
De stad Utrecht is verwijderd, de stad heeft 349234 inwoners.
{"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954}
Herhalingslusdooreendictionary
Wanneerjemeteenfor-herhalingslusdooreendictionarywiltgaan,hebjetemakenmeteenkey-valuepair.De vraagdieweonsdusmoetenstellenis:willenwedekeys,devaluesofbeidehebben?Omdathetafhankelijkis vandesituatie,kunnenwekiezenhoewededictionarymeteenfor-herhalingslusbenaderen.Standaardkrijgje dekeysterug.
steden = {"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954}
for stad in steden:
print(stad)
Deoutputwordtdan:
108
Amsterdam
Rotterdam
Den Haag
Tilburg
Almere
Groningen
Ditlijktraar,maarisjuistpraktisch.Defor-herhalingsluszorgtervoordatallekey-valuepairsindedictionary wordendoorlopen.Zodrawedekeyhebben,kunnenwealtijddevaluekrijgen.Wemoetendevalueechterzelf opvragen.Datdoenwealsvolgt:
steden = {"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954}
for stad in steden: inwoners = steden[stad] print(f"{stad} heeft {inwoners} inwoners.")
Deoutputwordtdan:
Amsterdam heeft 859732 inwoners.
Rotterdam heeft 641326 inwoners.
Den Haag heeft 534158 inwoners.
Tilburg heeft 215946 inwoners.
Almere heeft 205058 inwoners.
Groningen heeft 203954 inwoners.
Overigenskunjedefor-herhalingslusookexplicietkeysteruglatenleverendoordefunctie keys() aanteroepen. Defor-herhalingsluszieterdanalsvolgtuit:
for stad in steden.keys():
Wanneerwedoordevalueswillenlopenmeteenfor-herhalingslus,moetenwedefunctie values() gebruiken.
steden = {"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954}
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
for stad_inwoners in steden.values(): print(stad_inwoners)
Deoutputwordtdan:
109 Blok2 Collecties
859732
641326
534158 215946 205058 203954
Zoalsaangegevenkunjeookallesopvragenindefor-herhalingslus.Datdoenwedanmetdefunctie items()
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
steden = {"Amsterdam": 859732, "Rotterdam": 641326, "Den Haag": 534158, "Tilburg": 215946, "Almere": 205058, "Groningen": 203954}
for stad, inwoners in steden.items(): print(f"{stad} heeft {inwoners}.")
Deoutputwordtdan:
Amsterdam heeft 859732.
Rotterdam heeft 641326.
Den Haag heeft 534158.
Tilburg heeft 215946.
Almere heeft 205058.
Groningen heeft 203954.
Elkekeerdatdefor-herhalingsluswordtdoorlopenwordtdekeyindevariabele stad gezetendevalueinde variabele inwoners. 2.7
Opdracht7
Ziedevolgendecode.Watisdecorrecteoutputalshetprogrammawordtuitgevoerd?
data = [1, 2, 3, 4, 5]
resultaat1 = data[2:4]
resultaat2 = data[2:]
resultaat3 = data[::1]
resultaat4 = data * 2
Begrippen
Testjekennis
2.8
110
resultaat1 = [2, 3, 4]
resultaat2 = [2, 3, 4, 5]
resultaat3 = [1]
resultaat4 = [2, 4, 6, 8, 10]
resultaat1 = [3, 4, 5]
resultaat2 = [3, 4, 5]
resultaat3 = [5]
resultaat4 = [1, 2, 3, 4, 5][1, 2, 3, 4, 5]
resultaat1 = [3, 4]
resultaat2 = [3, 4, 5]
resultaat3 = [1, 2, 3, 4]
resultaat4 = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
resultaat1 = [3, 4]resultaat2 = [3, 4, 5]
resultaat3 = [1, 2, 3, 4, 5]
resultaat4 = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
Opdracht8
Watzaldewaardevan telefoonboek en zoekenzijnnahetuitvoerenvandezecode?
telefoonboek = {
'Alice': '123-456-789', 'Bob': '987-654-321', 'Charlie': '555-123-456', 'David': '789-321-654' }
nieuwe_invoer = {
'Eva': '111-222-333', 'Bob': '999-888-777', 'Frank': '444-555-666' }
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
telefoonboek.update(nieuwe_invoer)
verwijderen = ['Alice', 'Charlie']
for naam in verwijderen: if naam in telefoonboek:
111 Blok2 Collecties
del telefoonboek[naam]
zoeken = 'David' in telefoonboek
telefoonboek:{'Alice':'123-456-789','Bob':'999-888-777','Charlie':'555-123-456','David':'789-321-654','Eva':'111-222-333','Frank':'444-555-666'}
zoeken: True
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
telefoonboek:{'Bob':'999-888-777','David':'789-321-654','Eva':'111-222-333','Frank':'444-555-666'}
zoeken: True
telefoonboek:{'Alice':'123-456-789','Charlie':'555-123-456','David':'789-321-654','Eva':'111-222-333','Frank':'444-555-666'}
zoeken: False
telefoonboek:{'Bob':'999-888-777','David':'789-321-654','Eva':'111-222-333','Frank':'444-555-666'}
zoeken: False
Opdracht9
Watzaldewaardevan lijst_samengevoegd, lijst_vermenigvuldigden lijst_gesorteerdzijnnahet uitvoerenvandezecode?
lijst1 = [1, 2, 3, 4, 5]
lijst2 = [4, 5, 6, 7, 8]
lijst_samengevoegd = lijst1 + lijst2
lijst_vermenigvuldigd = lijst1 * 2
lijst_gesorteerd = sorted(lijst_samengevoegd)
lijst_samengevoegd:[1,2,3,4,5,4,5,6,7,8],lijst_vermenigvuldigd:[1,2,3,4,5,1,2,3,4,5],lijst_gesorteerd:[1,2,3,4,4,5,5,6,7,8]
lijst_samengevoegd:[1,2,3,4,5,4,5,6,7,8],lijst_vermenigvuldigd:[1,2,3,4,5,1,2,3,4,5],lijst_gesorteerd:[1,2,3,4,5,4,5,6,7,8]
lijst_samengevoegd:[1,2,3,4,5,4,5,6,7,8],lijst_vermenigvuldigd:[1,2,3,4,5,1,2,3,4,5],lijst_gesorteerd:[1,2,3,4,5,6,7,8] lijst_samengevoegd:[1,2,3,4,5,4,5,6,7,8],lijst_vermenigvuldigd:[1,2,3,4,5,1,2,3,4,5],lijst_gesorteerd:[1,2,3,4,5,6,7,8,9]
Opdracht10
Watisdewaardevandevariabelenieuwe_lijst alsdezecodewordtuitgevoerd?
lijst = [1, 2, 3, 4, 5, 6, 7, 8]
nieuwe_lijst = []
112
for item in lijst:
if item % 2 == 0:
nieuwe_lijst.append(item * 2) else:
nieuwe_lijst.append(item)
[2, 4, 6, 8, 10, 12, 14, 16]
[1, 4, 3, 8, 5, 12, 7, 16]
[1, 2, 3, 4, 5, 6, 7, 8]
[2, 4, 3, 8, 5, 12, 7, 16]
Opdracht11
Watisdewaardevande gewijzigde_lijst nahetuitvoerenvanhetprogramma?
lijst = [1, 2, 3, 4, 5, 6, 7, 8]
gewijzigde_lijst = []
for item in lijst:
gewijzigde_lijst.insert(0, item)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
113 Blok2 Collecties
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 1, 8, 1]
[8, 1, 7, 2, 6, 3, 5, 4]
[8, 7, 6, 5, 4, 3, 2, 1]
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Opdracht12
Watzalwordenafgedruktalsdevolgendecodewordtuitgevoerd?
getal = 1
while getal < 10: print(getal)
getal += 2
114
Opdracht13
Watzalwordenafgedruktalsdevolgendecodewordtuitgevoerd?
getal = 10
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
while getal > 0: print(getal) getal -= 3
1 2 3 4 5 6 7 8 9 1 3 5 7 9 2 4 6 8 10 1 4 7 10
115 Blok2 Collecties
Inhetvolgendecodeblokstaateenmatrixdieverkoopcijfersvaneenwinkelketenvertegenwoordigt.
verkoopcijfers = [
[120, 150, 180, 200],
[90, 110, 140, 160],
[200, 220, 240, 260],
[150, 170, 190, 210] ]
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Jewiltdemaandelijkseverkoopcijfersvanelkewinkelafdrukkenomtekijkenofzehuntargethebbengehaald. Alsjeeenverkoopresultaattegenkomtdathogerisdan200,wiljestoppenmethetafdrukkenvandeverkoopcijfers vandiewinkelendoorgaannaardevolgendewinkel.Diewinkelheeftnamelijkzijntargetgehaald.
Welkecodezoujeschrijvenomdittebereiken?
10 7 4 1 10 6 3 9 6 3 10 8 6 4 2 Opdracht14
116
for winkel in verkoopcijfers: for verkoop in winkel: print(verkoop)
if verkoop > 200: break
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
for i in range(len(verkoopcijfers)):
for j in range(len(verkoopcijfers[i])): print(verkoopcijfers[i][j])
if verkoopcijfers[i][j] > 200: break
for i in range(len(verkoopcijfers)):
for j in range(len(verkoopcijfers[i])): print(verkoopcijfers[i][j])
if verkoopcijfers[i][j] > 200: break
else: continue break
for winkel in verkoopcijfers: for verkoop in winkel: if verkoop > 200: break
print(verkoop)
117 Blok2 Collecties
Opdracht15
Jeschrijfteenprogrammadatinformatiebevatoververschillendepersonenenhunfavorieteactiviteiten.De datastructuurisalsvolgt:
personen_activiteiten = {
'Alice': ['Lezen', 'Fietsen', 'Schilderen'],
'Bob': ['Voetbal', 'Gamen', 'Koken'],
'Charlie': ['Lezen', 'Gamen', 'Sporten'],
'David': ['Schilderen', 'Koken', 'Sporten'] }
(ZONDERBEELD-EN TAALREDACTIE)
Jewiltdefavorieteactiviteitenvaniederepersoonafdrukken.Maaralsjedeactiviteit"Gamen"tegenkomt,wil jestoppenmethetafdrukkenvandeactiviteitenvandiepersoonendoorgaannaardevolgendepersoon.
Welkprogrammazoujedaarvoormaken?
CONCEPT
118
for persoon, activiteiten in personen_activiteiten.items(): for activiteit in activiteiten:
print(persoon, activiteit)
if activiteit == 'Gamen': break
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
for persoon in personen_activiteiten: for activiteit in personen_activiteiten[persoon]:
print(persoon, activiteit)
if activiteit == 'Gamen': break
for persoon, activiteiten in personen_activiteiten.items(): for activiteit in activiteiten:
if activiteit == 'Gamen': break
print(persoon, activiteit)
for persoon in personen_activiteiten: for activiteit in personen_activiteiten[persoon]:
if activiteit == 'Gamen': break
print(persoon, activiteit) else: continue break
119 Blok2 Collecties
Opdracht16
Stel,jehebtdevolgendedatastructuurdiedeboekenineenbibliotheekrepresenteert.Welkebeweringoverde volgendecodeisdanwaar?
computer_boeken = [
('Python Crash Course', 'Eric Matthes', 450), ('Clean Code', 'Robert C. Martin', 380),
('JavaScript: The Good Parts', 'Douglas Crockford', 300), ('The Pragmatic Programmer', 'Andrew Hunt, David Thomas', 320) ]
len_lijst = len(computer_boeken)
computer_boeken[len_lijst - 1][2] += 50
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Depagina'svanhetlaatsteboek('ThePragmaticProgrammer')wordengewijzigdvan320naar370.
Erzaleenfoutoptreden,omdattuplesnietkunnenwordengewijzigd.
Erzaleenfoutoptreden,omdatdeindexbuitenhetbereikvandelijstvalt.
Erzaleenfoutoptreden,omdatdepaginawaardenietkanwordenaangepastineentuple.
Opdracht17
Stel,jehebtdevolgendedatastructuurdiedemedewerkersenhunprojecturenbijhoudt:
medewerkers_projecten = {
'Alice': [('Nieuwe Frontend', 15), ('Migratie naar Azure', 20)],
'Bob': [('Nieuwe Frontend', 18), ('Aanpassen documentatie', 25)],
'Charlie': [('Migratie naar Azure', 22), ('Aanpassen documentatie', 18)] }
Welkecodezoujeschrijvenomdetotaleprojecturenvoorelkprojectteberekenenenaftedrukken?
Nieuwe Frontend : x uur
Migratie naar Azure : y uur
Aanpassen documentatie : z uur
120
project_uren = {}
for medewerker, projecten in medewerkers_projecten.items(): for project, uren in projecten: if project in project_uren:
project_uren[project] += uren
else:
project_uren[project] = uren
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
for project, uren in project_uren.items(): print(f"{project:<24}: {uren} uur")
project_uren = {}
for medewerker, projecten in medewerkers_projecten.items(): for project, uren in projecten:
project_uren[project] += uren
for project, uren in project_uren.items():
print(f"{project:<24}: {uren} uur")
project_uren = []
for medewerker, projecten in medewerkers_projecten.items(): for project, uren in projecten: if project in project_uren:
project_uren[project] += uren
else:
project_uren[project] = uren
while project_uren: project, uren = project_uren.pop()
121 Blok2 Collecties
print(f"{project:<24}: {uren} uur")
project_uren = {}
for medewerker, projecten in medewerkers_projecten.items(): for project, uren in projecten: project_uren[project] += uren
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
while project_uren: project, uren = project_uren.popitem()
print(f"{project:<24}: {uren} uur")
Opdracht18
Stel,jehebtdevolgendeboodschappenlijstdiedekostenvanverschillendeitemsineenwinkelvertegenwoordigen: winkel_kosten = [
('Appel', 1.5), ('Brood', 2.0), ('Melk', 1.0), ('Eieren', 1.75), ('Kaas', 3.5)
]
Jewiltdetotalekostenvandeboodschappenweten.Metwelkecodekunjeditbereiken?
122
totaal_kosten = 0
for item, kosten in winkel_kosten:
totaal_kosten += kosten
print(f"De totale kosten zijn: {totaal_kosten} euro.")
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
totaal_kosten = 0
for item, kosten in winkel_kosten:
totaal_kosten = kosten
print(f"De totale kosten zijn: {totaal_kosten} euro.")
totaal_kosten = 0
for index in range(len(winkel_kosten)):
totaal_kosten += winkel_kosten[index][1]
print(f"De totale kosten zijn: {totaal_kosten} euro.")
totaal_kosten = 0
for index in range(len(winkel_kosten)):
totaal_kosten = winkel_kosten[index][1]
print(f"De totale kosten zijn: {totaal_kosten} euro.")
123 Blok2 Collecties
Opdracht19
Stel,jehebtdevolgendelijstdiedevoorraadvanverschillendeproductenineenmagazijnvertegenwoordigt:
magazijn_voorraad = [ ('Laptop', 10), ('Muis', 25), ('Toetsenbord', 15), ('Monitor', 8), ('Printer', 5) ]
Jewilteenprogrammaschrijvendatdetotalevoorraadvanproductenberekent,maaralleendeproducten meeteltwaarvanermeerdantienstukszijn.Watisdejuistecodeomdittebereiken?
CONCEPT
TAALREDACTIE)
(ZONDERBEELD-EN
124
totale_voorraad = 0
for i in range(len(magazijn_voorraad)): if magazijn_voorraad[i][1] >= 10:
totale_voorraad += magazijn_voorraad[i][1]
print(f"De totale voorraad is: {totale_voorraad} stuks.")
(ZONDERBEELD-EN TAALREDACTIE)
totale_voorraad = 0
for product, aantal in magazijn_voorraad: if aantal > 10:
totale_voorraad += aantal
CONCEPT
print(f"De totale voorraad is: {totale_voorraad} stuks.")
totale_voorraad = 0
for product, aantal in magazijn_voorraad: if aantal > 10:
totale_voorraad = aantal else:
totale_voorraad = 0
print(f"De totale voorraad is: {totale_voorraad} stuks.")
totale_voorraad = 0
for i in range(len(magazijn_voorraad)): if magazijn_voorraad[i][1] > 10:
totale_voorraad = magazijn_voorraad[i][1]
125 Blok2 Collecties
else:
totale_voorraad = 0
print(f"De totale voorraad is: {totale_voorraad} stuks.")
Opdracht20
Jewilteenprogrammaschrijvendateenlijstmettitelsafdruktvoorcomputerboekenwaarvanhetgenre 'Programming'isenhetaantalpagina'smeerdan500is.Welkecodezoujeschrijvenomdittebereiken?
computerboeken = [
{'titel': 'Code Complete', 'genre': 'Programming', "pagina's": 800},
{'titel': 'Clean Code', 'genre': 'Programming', "pagina's": 464},
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
{'titel': 'The Pragmatic Programmer', 'genre': 'Programming', "pagina's": 352},
{'titel': 'Python Crash Course', 'genre': 'Programming', "pagina's": 560},
{'titel': 'The Art of Computer Programming', 'genre': 'Programming', "pagina's": 700} ]
Welkeprogrammakandit?
126
programmeerboeken = []
for boek in computerboeken: if boek['genre'] == 'Programming' and boek["pagina's"] >= 500: programmeerboeken += boek['genre']
print(programmeerboeken)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
programmeerboeken = []
for boek in computerboeken: if boek['genre'] == 'Programming' and boek["pagina's"] > 500: programmeerboeken = boek['titel']
print(programmeerboeken)
programmeerboeken = []
for boek in computerboeken: if boek['titel'] == 'Programming' and boek["pagina's"] > 500: programmeerboeken += boek['Programming']
print(programmeerboeken)
programmeerboeken = []
for boek in computerboeken: if boek['genre'] == 'Programming' and boek["pagina's"] > 500: programmeerboeken.append(boek['titel'])
print(programmeerboeken)
127 Blok2 Collecties
Opdracht21
SteljevoordatjeeenHR-managerbenteneenprogrammahebtgeschrevendatdeervaringscategorievan sollicitantencontroleerteneenberichtafdruktopbasisvanhunwerkervaring.Welkcodefragmentisdancorrect?
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
128
ervaring = 3
if ervaring < 2: print("Je hebt beperkte werkervaring.")
elif 2 <= ervaring < 5: print("Je hebt enige werkervaring.")
else:
print("Je hebt uitgebreide werkervaring.")
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
ervaring = 3
if ervaring < 2: print("Je hebt beperkte werkervaring.")
if 2 <= ervaring < 5: print("Je hebt enige werkervaring.")
if ervaring >= 5: print("Je hebt uitgebreide werkervaring.")
ervaring = 3
if ervaring < 2: print("Je hebt beperkte werkervaring.")
else:
if 2 <= ervaring < 5: print("Je hebt enige werkervaring.")
else:
print("Je hebt uitgebreide werkervaring.")
ervaring = 3
if ervaring < 2:
129 Blok2 Collecties
print("Je hebt beperkte werkervaring.")
elif ervaring > 2 and ervaring < 5: print("Je hebt enige werkervaring.")
elif ervaring >= 5: print("Je hebt uitgebreide werkervaring.")
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
2.9 Praktijkopdrachten
Inleidingpraktijkopdracht
Voordepraktijkopdrachtengaanweverschillendescenario'sbekijkenwaarindekennisvanallevoorgaande theoriemoetwordengebruikt.Ditdoenweaandehandvandevolgendedatastructuur.
Downloadindevolgendebijlagededatastructuurvoordevolgendepraktijkopdrachten.
Opdracht22 Leeftijden
Indebijgevoegdecontactgegevensstaatinformatieoverfictievemensen.Leesdewaardenuitenpresenteer dezeineenoverzichtelijkevorm.
Naam : John Doe
Leeftijd : 34 jaar
Telefoonummer : Werk : 1-465-778-3269
Mobiel : ...
Opdracht23 Magazijnvoorraad
Hetvolgendeprogrammageeftartikelenuiteenmagazijnweerineendatastructuur.Voegminstensvijfartikelen toeaandelijstvanmagazijnartikelen.Geefalleartikelenoverzichtelijkweerenberekendetotaleprijsvanhet aantalartikeleninhetmagazijn.
Berekenookdetotalewaardevanalleswatinhetmagazijnligtengeefditineenvolzinweer.
import random
magazijn_artikelen = [
'Laptop', 'Smartphone', 'Printer', 'Toetsenbord', 'Muis', 'Monitor', 'USB-sticks', 'Headphones', 'Webcams', 'Externe harde schijven' ]
magazijn_inventory = {}
for artikel in magazijn_artikelen:
130
prijs = round(random.uniform(50.0, 1000.0), 2)
voorraad = random.randint(10, 100)
magazijn_inventory[artikel] = {'prijs': prijs, 'voorraad': voorraad}
Opdracht24 Klinkerfrequentie
Schrijfeenprogrammadatindevolgendetekstdeklinkers(a,e,i,o,u)teltengeefditineentabelweer.
Klinker | Frequentie =======================
a | 16 tekst = """
Game-programmering in Python heeft de afgelopen jaren aan populariteit gewonnen vanwege de toegankelijkheid en flexibiliteit van de programmeertaal. Python, bekend om zijn eenvoudige syntax en brede gemeenschapsondersteuning, biedt een ideale omgeving voor zowel beginners als ervaren ontwikkelaars om boeiende en interactieve games te creëren.
Een van de populaire bibliotheken voor game-ontwikkeling in Python is Pygame. Met Pygame kunnen ontwikkelaars 2D-games maken, variërend van eenvoudige arcadespellen tot complexere projecten. Pygame biedt functionaliteiten voor het beheren van afbeeldingen, geluiden, invoer en nog veel meer, waardoor ontwikkelaars snel en efficiënt kunnen werken.
Python heeft met de opkomst van Panda3D en Pyglet mogelijkheden voor 3D-game-ontwikkeling. Deze bibliotheken stellen ontwikkelaars in staat om realistische 3D-werelden te creëren en complexere game-ervaringen te leveren.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
De gemeenschap van Python-ontwikkelaars heeft bijgedragen aan een overvloed aan bronnen, tutorials en frameworks die de leercurve voor game-ontwikkeling in Python verder verlagen. Of je nu een hobbyist bent die een eenvoudig spel maakt of een professional die complexe projecten aanpakt, Python biedt de tools en ondersteuning om je creatieve visie tot leven te brengen in de wereld van game-programmering.
131 Blok2 Collecties
2.10 Terugblik
Opdracht25 Terugblik
Zeteenkruisjeindekolomdievoorjouvantoepassingis.
Beoordelingscriteria
Jekuntconditiesgebruiken.
Jekuntlists/tuplesgebruikenencorrecttoepassen.
Jekuntdictionariesgebruikenencorrecttoepassen.
Jekuntloopsgebruikenencorrecttoepassen.
Opdracht26 Terugblik
Denknaoverwatjehebtgedaaninditblok.
a. Noemtweedingenwaaroverjetevredenbent.
1. 2.
b. Noemtweedingendiejedevolgendekeeranderswiltdoen.
1. 2.
c. Vraagjedocenten/ofleermeesteromfeedback.
Tops:
Tips:
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
2.11 Toets
Opdracht27
Welkeletterwordtgeprintalshetprogrammawordtuitgevoerd?
Nee Ja
"""
132
x = 10
y = 5
if x > y: print("A")
elif x < y: print("B")
else: print("C") A B C AenB
Opdracht28
Welkeletterwordtgeprintalshetprogrammawordtuitgevoerd?
a = 15
b = 25
if a > 10 and b < 25: print("X")
elif a < 10 or b > 30: print("Y")
else: print("Z")
Opdracht29
Watgebeurteralsdegebruiker8invoert?
X Y Z XenZ
133 Blok2 Collecties
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
getal = input("Voer een getal in: ")
if getal % 2 == 0:
print("Het ingevoerde getal is even.")
else:
print("Het ingevoerde getal is oneven.")
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Erzaleenfoutoptreden,omdatinput()altijdeenstringretourneertenhetnietmogelijkisommodulote nemenvaneenstring.
Hetprogrammazalcorrectafdrukkendathetingevoerdegetalevenis.
Hetprogrammazalcorrectafdrukkendathetingevoerdegetalonevenis.
Erzaleenfoutoptreden,omdathetgeenzinheeftommodulotenemenvaneengetaldatwordtbehandeld alseenstring.
Opdracht30
Welkeregelwordtafgedruktalsdegebruiker23invult?
leeftijd = input("Voer je leeftijd in: ")
if leeftijd.isdigit():
leeftijd = int(leeftijd)
if leeftijd >= 18:
print("Je bent oud genoeg om te stemmen.")
else:
print("Helaas, je bent te jong om te stemmen.")
else:
print("Ongeldige invoer. Voer een getal in.")
Helaas,jebenttejongomtestemmen.
Jebentoudgenoegomtestemmen.
Ongeldigeinvoer.Voereengetalin.
Decodezaleenfoutveroorzakenvanwegeeenongeldigeconversie.
Opdracht31
Watzalwordenafgedruktalsdecodewordtuitgevoerd?
134
getallen = [1, 2, 3, 4, 5]
som = 0
for num in getallen: som += num
gemiddelde = som / len(getallen)
print(f"Het gemiddelde van de getallen is: {gemiddelde}")
Hetgemiddeldevandegetallenis:2.5.
Hetgemiddeldevandegetallenis:3.
Hetgemiddeldevandegetallenis:15.
Hetgemiddeldevandegetallenis:[1,2,3,4,5].
Opdracht32
Watwordtafgedrukt?Erzijnmeerdereantwoordengoed.
woorden = ["appel", "banaan", "kiwi", "druif", "citroen"]
for woord in woorden: if "a" in woord:
print(woord)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
appel
banaan
kiwi
druif citroen
Opdracht33
Watwordtonderelkaarafgedruktalsdecodewordtuitgevoerd?
getal = 1
while getal <= 5:
print(getal)
135 Blok2 Collecties
getal += 2
Opdracht34
Watgebeurteralseenspelereenslechtebeoordelingkrijgt?
teams = ["Ajax", "PSV", "Feyenoord", "AZ", "Vitesse"]
for team in teams:
print(f"Analyse voor {team}")
CONCEPT (ZONDERBEELD-EN
spelers = ["Speler1", "Speler2", "Speler3", "Speler4"]
for speler in spelers:
print(f"Beoordeling van {speler}.")
TAALREDACTIE)
beoordeling = input("Voer de beoordeling in (goed/slecht): ")
if beoordeling.lower() == "slecht":
print("Negatieve beoordeling ontvangen. Analyse gestopt.") break
print(f"Analyse voor {team}, afgerond.\n")
Alleendebeoordelingvandehuidigespelerwordtgeprint,maardeanalysevoorhethuidigeteamwordt voortgezet.
Hetprogrammastoptvoorhethuidigeteam,print"Negatievebeoordelingontvangen.Analysegestopt."en gaatverdermethetvolgendeteam.
Hetprogrammastoptvolledigenprint"Negatievebeoordelingontvangen.Analysegestopt.".
Decodezaleenfoutveroorzaken,omdatbreaknietistoegestaanineengenestefor-loop.
Opdracht35
Watzalafgedruktwordenalsdecodewordtuitgevoerd?
index = 1
while index <= 3:
135 12345 246 1248
136
print(f"Iteratie {index}")
for teller in range(2):
print(f" Sub-iteratie {teller}") index +=
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Opdracht36
Watzalwordenafgedruktalsdezecodewordtuitgevoerd?
gegevens = { 'naam': 'Anna',
1 Iteratie 1 Sub-iteratie 0 Iteratie 2 Sub-iteratie 0 Iteratie 3 Sub-iteratie 0 Iteratie 1 Sub-iteratie 0 Sub-iteratie 1 Iteratie 2 Sub-iteratie 0 Sub-iteratie 1 Iteratie 1 Sub-iteratie 0 Sub-iteratie 1 Iteratie 2 Sub-iteratie 0 Sub-iteratie 1 Iteratie 3 Sub-iteratie 0 Sub-iteratie 1 Iteratie 1 Iteratie 2 Iteratie 3
137 Blok2 Collecties
'leeftijd': 25, "hobby's": ['lezen', 'sporten', 'schilderen'], 'scores': {'wiskunde': 90, 'geschiedenis': 75, 'engels': 85} }
gegevens['leeftijd'] += 1
gegevens["hobby's"].append('tuinieren')
gegevens['scores']['natuurkunde'] = 88
print(gegevens['naam'])
print(gegevens["hobby's"][2])
print(gegevens['scores']['geschiedenis'])
CONCEPT (ZONDERBEELD-EN
Anna,sporten,75
Anna,schilderen,75
Anna,tuinieren,85
Anna,schilderen,88
Opdracht37
TAALREDACTIE)
Welkecodezoujegebruikenalsjeeenlijstmetkleurnamenhebtgemaakt-rood,wit,blauw,geel,groen,zwart, violet,cyaan,geel-envervolgenseenfor-herhalingslusgebruiktomdoordelijsttegaanendekleurenophet schermweertegeven,waarbijjewiltstoppenzodrajedekleur"violet"tegenkomt?
138
kleuren = ["rood", "wit", "blauw", "geel", "groen", "zwart", "violet", "cyaan", "geel"] for kleur in kleuren: if kleur in "violet": stop = True else:
print(kleur)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
kleuren = ["rood", "wit", "blauw", "geel", "groen", "zwart", "violet", "cyaan", "geel"] for kleur in kleuren: if kleur in "violet": break else: print(kleur)
kleuren = ["rood", "wit", "blauw", "geel", "groen", "zwart", "violet", "cyaan", "geel"] index = 0
while kleuren[index]: if kleur[index] in "violet": break else:
print(kleur)
index = 0
while index < len(kleuren): if kleur[index] in "violet": break else:
print(kleur)
Opdracht38
WelkebeweringisjuistalsjehetcijfervanBobwiltweten?
studenten_informatie = [
{'naam': 'Alice', 'leeftijd': 21, 'cijfer': 85},
{'naam': 'Bob', 'leeftijd': 22, 'cijfer': 78},
{'naam': 'Charlie', 'leeftijd': 20, 'cijfer': 92},
139 Blok2 Collecties
{'naam': 'David', 'leeftijd': 23, 'cijfer': 88}
studenten_informatie['Bob']['cijfer']
studenten_informatie[1]['cijfer']
studenten_informatie('Bob')['cijfer']
studenten_informatie[2]['Bob']
Opdracht39
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Steldatjeeenlijsthebtmetdenamenvanstedenenhunbijbehorendeinformatie,waarbijelkestadwordt vertegenwoordigdalseendictionarymetdestad,hetlandenhetbevolkingsaantal:
steden_informatie = [
{'stad': 'New York', 'land': 'Verenigde Staten', 'bevolking': 8398748},
{'stad': 'Tokyo', 'land': 'Japan', 'bevolking': 37393129},
{'stad': 'Londen', 'land': 'Verenigd Koninkrijk', 'bevolking': 8982000},
{'stad': 'Peking', 'land': 'China', 'bevolking': 21542000}
WelkebeweringgeeftdebevolkingvanLondencorrectweer?
steden_informatie[2]['bevolking']
steden_informatie['Londen']['bevolking']
steden_informatie[2].keys('bevolking')
steden_informatie.get('Londen')['bevolking']
Opdracht40
Jewilteennieuwlijstjemakenmetalleendenamenvanstudentendieeenscorevan80ofhogerhebben.Welk stukjecodebereiktdit?
student_scores = [
{'naam': 'Alice', 'score': 85},
{'naam': 'Bob', 'score': 78},
{'naam': 'Charlie', 'score': 92},
{'naam': 'David', 'score': 88}
]
]
] 140
hoge_scores = {}
for student in student_scores: if student['score'] > 80:
hoge_scores[student['naam']] = student['score']
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
hoge_scores = ()
for student in student_scores: if student['score'] > 80:
hoge_scores[student['naam']] = student['score']
hoge_scores = {}
for student in student_scores: if student['score'] > 80: hoge_scores.append(student['naam'])
hoge_scores = []
for student in student_scores: if student['score'] >= 80:
hoge_scores.append(student['naam'])
Opdracht41
Jewilteennieuwelijstmakenmetdelengtevanelkestadnaamindetuple.Welkstukjecodebereiktdit?
141 Blok2 Collecties
steden = ('Amsterdam', 'New York', 'Tokyo')
lengtes_steden = {}
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
for stad in steden:
lengtes_steden[stad] = len(stad)
lengtes_steden = []
for stad in steden:
lengtes_steden.append(len(stad))
lengtes_steden = {}
for stad in steden:
lengtes_steden[stad].append(len(stad))
lengtes_steden = {}
for stad in steden:
lengtes_steden += len(stad)
142
Blok3
Bestanden
CONCEPT (ZONDERBEELD-EN
TAALREDACTIE)
Erzijnverschillendesoortenbestanden.Elkbestandheefteeneigenformaateneigeneigenschappen.Inditblok gaanweonsbezighoudenmeteenaantalformatendatdoorveelapplicatieswordtgebruikt:
• Tekstbestand:deeenvoudigstevormvanopslag.Alleswordtinleesbaretekstopgeslagenineenbestand. Extensiesdiedaarbijvaakhorenzijnbijvoorbeeld.txten.log.
• Csv-bestand:hetzogenoemdecommaseparatedvalue-formaatiseenpopulairformaatwaarindedatain tabelvormwordenopgeslagen.Hetgaatomnummersentekstgescheidendooreenkomma.Elkeregelstelt eenregeldatavoorenheefthetzelfdeaantaldatapunten.
• Excelbestand:eenbestandsformaatdatgebruiktwordtdoorhetMicrosoftExcel-programmauitdeMicrosoft OfficeSuiteofuitOffice365.Ditformaatgaatveelverderdanhetrechttoerechtaanopslaanvandata.Ommet ditformaattekunnenwerken,gebruikenweeenbibliotheek(library).
Leerdoelen
1. Jekunttekstbestandenlezenenschrijven.
2. Jekuntcsv-bestandenlezenenschrijven.
3. JekuntExcelbestandenlezenenschrijven.
Opdracht1 Oriëntatieopdracht
Vanafheteerstemomentdatjemeteencomputergaatwerkenhebjealtemakengehadmetbestandeninallerlei verschillendevormen.Vansysteembestandeneninitialisatiebestandentotdrivers.Vervolgensbenjewaarschijnlijk aandeslaggegaanmetjeprivébestandenoverzetten.
a. Watvoorsoortbestandengebruikjezelfhetmeest?
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
b. Watvoorsoortbestandengebruikendemeestevideoapplicaties?
c. Watzoujijwillengebruikenvoorhetlezen/opslaanvandata?
d. Waarzoujeinstellingen,zoalspadennaarbestanden,willenopslaan?
e. Geeftweevoorbeeldenvanhetgebruikvancsv-bestandenindepraktijk.
f. Excelbestandenzijnervoorverschillendedoeleinden.Geefvijfvoorbeeldenvansoortentoepassingsdatavan Excelbestanden.Denkbijvoorbeeldaanproductinformatie,prijzenenartikelen.
3.1 OpdrachtensetFoldersenbestanden
Opdracht2 Foldersenbestanden
RaadpleegzonodigdetheorieoverFoldersenbestanden.
a. Watzijngenestefolders?
Foldersmetveelbestanden.
Foldersinfolders.
Foldersmetfoldersdiedezelfdenaamhebben.
Foldersdieopverschillendeschijvenstaan.
144
b. Metwelkemodulekunjepadennaarfoldersmaken? path pathlibrary pathlib padlib
c. Welkestringszijnvanhettyperawstring?Erzijnmeerdereantwoordengoed.
r'C:\Windows\drivers'
f'C:\Windows\drivers'
f'Kolom 1\Kolom 2\Kolom 3'
r'Kolom 1\Kolom 2\Kolom 3
d. Kieseenfolderwaarineenmixvanbestandenstaat.Printallebestandendiedeextensie*.jpghebben.
e. TelhoeveelbestandeninjefolderDocumentenzitten.OpeenWindows-computerisditdefolder../Documents.
3.2 OpdrachtensetTekstbestanden
Opdracht3 Tekstbestanden
RaadpleegzonodigdetheorieoverTekstbestanden.
a. Watzijndekenmerkenvaneentekstbestand?
Makkelijkteopenenenonleesbaretekst.
Makkelijkteopenenenleesbaretekst.
CONCEPT
Moeilijkteopenenenleesbaretekst.
Moeilijkteopenenenonleesbaretekst.
b. Wanneerweelkekeeralsonsprogrammatekstwegschrijftnaareenbestanddatdezeachterverderschrijft. Inwelkemodemoetenwehetbestanddanopenen?
mode='a'
mode='b' mode='r'
mode='w'
c. WelkebeschrijvinggeefthetbestderolvaneencontextmanagerinPythonweer?
(ZONDERBEELD-EN TAALREDACTIE)
EencontextmanagerinPythonwordtgebruiktomdescopevanvariabelentebeperkenbinneneenspecifiek codeblok.
EencontextmanagerinPythonwordtgebruiktomdeuitvoeringvaneenbepaaldblokcodetevolgenen tecontroleren,zoalsdeuitvoeringstijdmeten.
EencontextmanagerinPythonwordtgebruiktomopeendynamischemanierdetoegangtoteenspecifiek objecttebeheren,afhankelijkvandebehoeftenvanhetprogramma.
EencontextmanagerinPythonregeltdetoegangtotresources,zoalsbestandenofdatabaseverbindingen, enzorgtervoordatdezeopeenveiligemanierwordenvrijgegevennagebruik.
d. Maakeenprogrammadatdevolgendetekstineentekstbestandmetdenaam"Instructie.txt"schrijft.
145 Blok3 Bestanden
Als software developer werk ik aan het ontwerpen, ontwikkelen en implementeren van softwareoplossingen die voldoen aan de behoeften van gebruikers. Mijn dagelijkse taken omvatten het schrijven van efficiënte en goed gestructureerde code, het oplossen van bugs en het optimaliseren van prestaties. Ik werk nauw samen met collega's om requirements te begrijpen en samen te werken aan projecten in een agile omgeving. Ik blijf mezelf voortdurend bijscholen en op de hoogte van nieuwe technologieën om mijn vaardigheden te verbeteren en bij te blijven in een snel evoluerend vakgebied.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
e. Schrijfeenprogrammadathetbestanduitdevorigeopgave("Instructie.txt")leestenvervolgensallewoorden telt.Geefhetaantalwoordenineenvolzinophetscherm.
3.3 OpdrachtensetCsv-bestanden
Opdracht4 Csv-bestanden
RaadpleegzonodigdetheorieoverCsv-bestanden.
a. Watzijndekenmerkenvaneencsv-bestand?
Makkelijkteopenenzondermodule.
Nietteopenenzondermodule.
Betrouwbaarteopenenmetmodule.
Converterennaartekstendanmakkelijkteopenen.
b. Watiseendelimiterineencsv-bestand?
Hettekenvoordemaximalegroottevanhetcsv-bestand.
Eenoptioneeltekendatbijbepaaldedataineencsv-bestandwordtgebruikt.
EentekendataangeeftdatExcelnoodzakelijkis.
Eentekenoftekensomdeveldenvaneencsv-bestandtescheiden.
c. Welkdatatypehebjenodigommetdecsv-moduledataineencsv-bestandopteslaan?Erzijnmeerdere antwoordengoed.
Dedatavoorhetbestand.
Eenstring.
EenfloatofintegervoorExcel.
Eenlist.
d. Watkunjemethetattribuutmodebereikenalsjemetcsv-bestandenwerkt?
with personeelslijst.open(mode='r', newline='') as csv_bestand: ...
146
Aangevenopwelkemanierhetbestandwordtgesloten.
Aangeven(alseenhint)wanneernormaalopenennietlukt.
Aangevenwatermoetgebeurenbijeenprobleem.
Aangevenopwelkemanierhetbestandwordtgeopendenbehandeld.
e. Maakeencsv-bestandmetvijfregels.Elkeregelheeftvierwaarden.Elkewaardeisdevorigewaardex2.De volgenderegelheeftalseerstewaardedeeerstewaardevandevorigeregel+1.Dankrijgjehetvolgende:
1, 2, 4, 8
2, 4, 8, 16
3, 6, ...
f. GebruikvoordezeopgavedePersoneelslijst.csvdiebijdetheorieisgegeven.
Geefineennettetabelvormallepersoneelsledenweerdiemeerdanvijfofmeerdienstjarenhebben.
Naam |Personeelsnummer| Afdeling | Dienstjaren
Lisa Johnson | 1001 | Marketing| 5
3.4 OpdrachtensetExcelbestanden
Opdracht5 Excelbestanden
RaadpleegzonodigdetheorieoverExcelbestanden.
WatisdeopbouwvaneenExcelbestand?
Complexbestandsformaatvanopenpyxl.
Complexbinairbestandsformaat.
ComplexbestandsformaatvanMicrosoft.
Complextekstbestandsformaat.
3.5 TheorieBestanden
Foldersenbestanden
Pythoniseencross-platformprogrammeertaal.Elkplatformheeftzijneigenmaniervanbestandenopslaanen defolderstructuurpresenteren.Pythonzorgtervoordatwedaarnauwelijksrekeningmeehoeventehouden.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Folderskunnenéénofmeerfoldersen/ofbestandenbevatten.Foldersinfoldersnoemenwe.Inelkefolder kunnenbestandenstaan.
Foldersenbestandenkunjeopvragenmetdemodule pathlib Omfoldersenfilestebekijkenzijnmeerdere regelsPythonnodig.Wegaandaaromkleineprogramma’smakenwaarinwemetfoldersenfileskunnenwerken.
Omalleelementenuiteenfoldertetonenmakenwegebruikvandeiteratiefunctie iterdir()
==========================================================
...
147 Blok3 Bestanden
import pathlib
folder = pathlib.Path('C:/')
for element in folder.iterdir(): print(element)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Deoutputverschiltpercomputer.DevolgendeoutputkomtvaneenMicrosoftWindows-computer: ...C:\pagefile.sys
C:\PerfLogs
C:\Program Files
C:\Program Files (x86)
C:\ProgramData...
Weimporterende pathlib-module.De pathlib-modulebevatonderanderede Path-klasse.
Vervolgensmakenwedevariabele folder aan,waaraanwede Path-klassetoekennen.De Path-klassewordt geïnitialiseerdmethetpad C:/.Windows-gebruikersmoetenwennenaandeforwardslashinplaatsvande backslashbijfolders.Wehebbeneerdergeziendatdebackwardslasheenescapekarakteris.Doordeforward slashtegebruikenomzeiljealleextrakaraktersenhandelingen,zoals 'C:\\'.Eenanderemethodeis gebruikmakenvaneenrawstring Pythonvertaaltdanallesnaarhetonderliggendeoperatingsysteem.
import pathlib
folder = pathlib.Path('C:\Temp')
folder_raw = pathlib.Path(r'C:Temp')
Bijde folder_raw zienwederawstring-weergave.De 'r' voordestringgeeftaandathetgaatomeenraw string.Debackslashwordtdannietgezienalseenescapekarakter,maaralseengewoonbackslashkarakter.Beide voorbeeldenwijzennaardezelfdefolder.
Weergavepath
Wanneereenpadwordtweergegevenophetscherm,wordtdatweergegevenopdemanierdiegebruikelijkis voorhetonderliggendeoperatingsysteem.InWindowswordtditdusweergegevenals C:\,ookalhebje C:/ gebruikt.
148
Wanneerwedenamenvandeelementenwillentonen,hoevenwealleendevariabelediede print() functie weergeeftaantepassen.Devariabele element heeftextrainformatie,waaronderdenaamvanhetelementdoor element.name tegebruiken.Wevragendanaanhetobject element hetattribuut name
import pathlib
folder = pathlib.Path('C:/')
for element in folder.iterdir(): print(element.name)
Inditvoorbeeld,waarinwealleelementenvanderoot C:\-folderophetschermweergaven,werddemethode iterdir()aangeroepen.Dezelevertdefolder,inclusiefdenaamvanhetelement.Vervolgenswerdhetelement ophetschermweergegeven.
Deoutputverschiltpercomputer.DevolgendeoutputkomtvaneenMicrosoftWindows-computer: ...
pagefile.sys
PerfLogs
Program Files
Program Files (x86)
ProgramData ...
Navigeren
CONCEPT
Belangrijkisomgoedtekunnennavigerendoordefoldersvanuiteenprogramma,zodatjedegewenstebestanden snelkuntvinden.Wekunnennavigerenopbasisvanabsoluteenrelatievepaden.
Absolute paden
Navigerenhebbenwetotnutoegedaanopbasisvanabsolutepaden.Denkaan C:/Temp.Ditiseenabsoluutpad naarde C-Drive DaarmoetdefolderTemp bestaan.Eenandervoorbeeldvaneenabsoluutpad isC:/Users/Joe/Documents/Programming.
Relatieve paden
(ZONDERBEELD-EN TAALREDACTIE)
Relatievepadenzijnpadenwaarbijwordtgewerktvanuitdehuidigefolder.Wegevendehuidigefolderaanmet : ./Ditiseenpuntgevolgddooreenforwardslash.Datisdehuidigefolder.Wekunnenvanafhiernavigerennaar eenfolderindehuidigefolderofnaareenfolderterug.
Stel,onzehuidigeabsolutefolderis C:/dev/bus.Ditbetekentdatwedehuidigerelatievefolderkunnenopvragen met./ Ditisdanhetzelfdealswanneerjedeabsolutefolderhadgetypt:C:/dev/bus
C:/
├── bin
├── boot
149 Blok3 Bestanden
│
└── grub
│ ├── fonts
│ └── locale
├── cdrom
└── dev
├── block
├── bsg
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
└── bus
└── usb
├── 001
└── 002
Wanneerwemetrelatievenavigatienaardefolder001willengaan,doenweditalsvolgt:./usb/001
Wezeggendan:vanuitdehuidigefolder./ navigerenwenaardefolderusbomverdertegaaninde usb folder naar 001.
WegaanerweervanuitdatwestaanindefolderC:/dev/bus.Wanneerwemetrelatievenavigatienaardefolder fonts willen,doenwedatalsvolgt: ../../boot/grub/fonts
Wezeggendandatwevanuitdehuidigefoldereenniveauteruggaanmet ../ Vervolgensgaanwenogeenniveau terugmet ../ Vanafditniveau(wezittenopde C:/)gaanwevooruitnaardefolder boot Vanuitdefolder boot gaanwevooruitnaardefolder grub envervolgensnaardefolder fonts.
Alleenfoldersweergeven
Wehebbengeziendatwebijhetitererendooreenfolderzowelsubfoldersalsbestandentezienkrijgen.Wanneer wealleendefolderswillenweergeven,moetenwewetenofeenelementeenfolderofeenbestandis.Ditkunnen wevragenmetbehulpvande is_dir()-functie.
import pathlib
folder = pathlib.Path('C:/')
for element in folder.iterdir():
if element.is_dir():
print(element)
Inde for-loopwordtgekekenofheteenfolderismetdefunctie is_dir() Wanneerdithetgevalis,wordthet elementophetschermweergegeven.
Deoutputwordtdan:
150
C:\PerfLogs
C:\Program Files
C:\Program Files (x86)
C:\ProgramData ...
Alleenbestandenweergeven
Wanneerwealleendebestandenwillenweergeven,moetenwewetenofeenelementeenfolderofeenbestand is.Ditkunnenwevragenmetbehulpvande is_file()-functie.
import pathlib
folder = pathlib.Path('C:/') for element in folder.iterdir(): if element.is_file(): print(element)
TAALREDACTIE)
CONCEPT
Deoutputwordtdan: ...
C:\DumpStack.log
C:\DumpStack.log.tmp
C:\hiberfil.sys
C:\pagefile.sys ...
Folderpaden
(ZONDERBEELD-EN
Inde for-herhalingsluswordtgekekenofheteenbestandismetdefunctie is_file().Wanneerdithetgeval is,wordthetelementophetschermweergegeven.
Alswemetbestandenwerken,bestaatalsneldebehoefteomverschillendepadennaarfolderstekunnenmaken. Wekunnenmetde pathlib-modulepadenmakennaarfoldersenbestandenmetbehulpvaneenstring.De stringkunnenwelatenopgevendoordegebruikeroflatengenererendooreenalgoritme.
Wehebbengeziendatwemet pathlib.Path() foldersenbestandenkunnenselecteren.Erzijnookfuncties waarmeewekunnenkijkenwaarwestaanindefolderhiërarchie.Ofnaarwathetpadnaardehome-foldervan degebruikeris.
import pathlib
...
151 Blok3 Bestanden
home_folder = pathlib.Path.home()
print(f'De home folder van de gebruiker is: {home_folder}')
werk_folder = pathlib.Path.cwd()
print(f'De huidige werk folder van de gebruiker is: {werk_folder}')
specifieke_folder = pathlib.Path.home() / 'Virtual Machines'
print(f'Van de home folder naar: {specifieke_folder}')
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Opderegelmet home_folder wordtdehome-foldervandegebruikeropgevraagdenvervolgensophetscherm weergegeven.
Opderegelmet werk_folder wordtdehuidigewerkfolderopgevraagdenvervolgensophetschermweergegeven.
Opderegelmet specifieke_folder wordtvanafdehome-foldergenavigeerdnaareenfolderindehome-folder. Hetnieuwepadwordtvervolgensophetschermweergegeven.
Hierzienwedat / wordtgebruiktomtenavigerennaareenfolderindehome-folder.Ditgeefteenheelnatuurlijke benaderingvoorhetnavigerendoorfolderstructuren.Daarnaastisheteenveiligemaniervannavigeren,omdat hetpadautomatischopdejuistemanierwordtgeconstrueerd.
Folderstructuur
Somswillenweineenfolderstructuurzoekennaarbestandenmeteenbepaaldeextensie.Wemoetendanook elkesubfolderdoorlopenomtekijkenofweeenbestandmetdegewensteextensiekunnenvinden.Ditwordt meestalgedaanmetwildcardsals * en ? * betekent0ofmeertekensen ? precieséénteken.Zoekennaar*.txt geeftelkbestandterugdateenextensie.txtheeft.Wanneerwezoudenzoekennaarfoto_202?.jpg,krijgenwe allefoto'sterug,bijvoorbeeld foto_2020.jpg, foto_2021.jpg, foto_2022.jpg
AlswebijvoorbeeldzoekennaarPython-filesmet*.py,is*.pydeglob.Hetgebruikvandezepatronenwordtdan ookglobbinggenoemd.
import pathlib
basis_folder = pathlib.Path('C:/Temp')
print(f'+ {basis_folder}')
for folder in sorted(basis_folder.rglob('*.csv')): nest_diepte = len(folder.relative_to(basis_folder).parts) opvulling = ' ' * nest_diepte print(f'{opvulling}+ {folder.name}')
Indeeerstetweeregelsdiebeginnenmet basis_folder wordthetpadnaardefoldergemaaktenophetscherm weergegeven.
152
Indefor-herhalingsluswordtmeteenherhaallusdoorallefolders,subfoldersenbestandengelopenenworden debestandenmetdeextensie*.csvgesorteerdonthouden.De basis_folder.rglob('*.csv') zoektdoorde folderensubfoldersnaarbestandenmetdeextensie *.csv Ditleverteenlijstopmetnamendiedoorde sorted()-functieopalfabetischevolgordewordengezet.Indeherhaalluswordtelkgevondenbestandvervolgens aandevariabelefoldergegeven.
Indeeersteregelindeherhalingsluswordtmetdefunctie relative_to().parts gevraagduithoeveeldelen hetpadnaardefolderbestaat.Daarmeeisde nest_diepte tebepalen.De nest_diepte komtovereenmethet aantalsubfoldersonderdebasisfolder.
Indelaatstetweeregelswordteenstringopgebouwdopbasisvande nest_diepte,zodatdediepergelegen foldersofbestandenmeernaarrechtsophetschermwordenweergegeven.
Weergave
Diteenvoudigeprogrammaheeftgeentestsenbewakingen,waardoordeoutputnietnetjeswordtweergegeven bijheelveelbestandenofeenenormenestdiepte.
Tekstbestanden
Tekstbestandenkunnenwordengeopendmetdemeestbasale,spartaanseteksteditoropeencomputer.Opeen Windows-computerisditNotepadenopLinuxisditNano.Debestandenkenmerkenzichdoordatdezeleesbare tekstlatenzienalszeeenmaalgeopendzijn.
Schrijven
Bestandenstaanaltijdergensineenfolder.Ditkanderootfolderzijn,zoals'C:\'.Met pathlib.Path() kunnen wefoldersenbestandenbenoemen.Debestandenkunnenwevervolgenslezenofschrijven.Ditkunnen tekstbestandenofbinairebestandenzijn.
Inhetvolgendevoorbeeldgaanweeenministatistiekbestandaanmakenineentekstbestandgenaamd statistiek.txt.
import pathlib
folder = pathlib.Path('C:/Temp')
folder_info = folder / 'statistiek.txt'
folder_teller = 0
bestanden_teller = 0
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
for element in folder.iterdir():
if element.is_dir():
folder_teller += 1
if element.is_file():
bestanden_teller += 1
153 Blok3 Bestanden
with folder_info.open(mode='w') as tekstbestand: tekstbestand.write(f'Statistiek folder: {folder}\n')
tekstbestand.write(f'Folders: {folder_teller}\n')
tekstbestand.write(f'Bestanden: {bestanden_teller}\n')
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Wezullendecodegaanontleden.Decodebestaatgrofweguitdriedelen.
folder = pathlib.Path('C:/Temp')
folder_info = folder / 'statistiek.txt'
folder_teller = 0
bestanden_teller = 0
Inheteerstedeelmakenweeenaantalvariabelenaan,waarvan folder_info hettekstbestandwordtdatwe willenschrijven,namelijk C:/Temp/statistiek.txt
for element in folder.iterdir():
if element.is_dir():
folder_teller += 1
if element.is_file():
bestanden_teller += 1
Inhettweededeelwordtdoordefoldersenbestandengelopen.Elkekeerdateenfolderwordtgevonden,wordt de folder_teller met1opgehoogd.Enelkekeerdatweeenbestandtegenkomen,wordtde bestanden_tellermet1opgehoogd.Alsallefoldersenbestandenindeopgegevenfolderzijndoorlopen, hebbenweeentotaalstandvoorzoweldefoldersalsdebestanden.
with folder_info.open(mode='w') as tekstbestand: tekstbestand.write(f'Statistiek folder: {folder}\n') tekstbestand.write(f'Folders: {folder_teller}\n') tekstbestand.write(f'Bestanden: {bestanden_teller}\n')
Inhetderdedeelwordthettekstbestandaangemaaktenwordendestatistiekenweggeschreven.Hetbestand wordtgeopendmeteencontextmanager-constructie:hetkeyword with.Zodrahetbestandwordtgeopenden eenfoutoptreedtdienietkanwordenhersteld,wordthetbestandnetjesafgeslotenenderesourcevrijgegeven. Zondercontextmanagermoetjeditzelfoplossen.
Wekunnenderegelmethetkeyword withalsvolgtlezen:
154
Metdecontextmanageropenjehetbestand,metdenaamzoalsopgegevenin folder_info,indeschrijfmode ('w',vanwrite)engebruikjedevariabele tekstbestand omhetbestandtebenaderen.Vervolgenswordtinhet codebloknaarhetbestandgeschrevenmetdefunctie write() Defunctie write() schrijftdestringnaarhet bestand.Jemoetzelf \n meegevenalsjenaardevolgenderegelinhettekstbestandwiltgaan.
Inplaatsvan 'w' voordeschrijfmodekunje 'a' gebruikenvooraanvullen(append).Bijhetgebruikvan 'w' wordthetbestandgewistalsditalbestondvoordaterinwerdgeschreven.Wanneerjedatawilttoevoegenaan eenbestaandbestand,gebruikje 'a' alsmode.Alleswatjedannaarhetbestandschrijftwordtachteraan toegevoegd.
Lezen
Hiervoorhebbenweeenministatistiekbestandgeschreven.Wegaanditbestandlezenendestatistiekophet schermweergeven.
import pathlib
folder = pathlib.Path('C:/Temp')
folder_info = folder / 'statistiek.txt'
with folder_info.open(mode='r') as tekstbestand: regels = tekstbestand.readlines()
aantal_folders = 0
aantal_bestanden = 0 for regel in regels: if 'Folders' in regel:
TAALREDACTIE)
aantal_folders = int(regel.split(':')[1])
if 'Bestanden' in regel:
aantal_bestanden = int(regel.split(':')[1])
print(regel.strip())
ratio = aantal_folders / aantal_bestanden
CONCEPT (ZONDERBEELD-EN
print(f'De verhouding folders versus bestanden is (> 1 meer folders): {ratio}')
Wezullendecodegaanontleden.Decodebestaatgrofweguitvierdelen.
155 Blok3 Bestanden
folder = pathlib.Path('C:/Temp')
folder_info = folder / 'statistiek.txt'
Inheteerstedeelwordendefolderendebestandsnaamgemaakt.
with folder_info.open(mode='r') as tekstbestand: regels = tekstbestand.readlines()
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Inhettweededeelwordthetbestanddoordecontextmanagergeopendindeleesmode 'r' Vervolgensworden alleregelsuithetbestandinéénkeergelezen.Devariabele'regels'krijgtdaneenlijstmetregelsuithetbestand. Daarnawordthetbestandautomatischafgesloten.
aantal_folders = 0
aantal_bestanden = 0 for regel in regels:
if 'Folders' in regel:
aantal_folders = int(regel.split(':')[1])
if 'Bestanden' in regel:
aantal_bestanden = int(regel.split(':')[1])
print(regel.strip())
Inhetderdedeellopenwemeteenherhaallusdooralleingelezenregels.Omdatwedestatistischeinformatie willenlezen,gaanweopzoeknaarspecifiekewoordeninderegels.Wewetendatdestatistiekdatazijntevinden nadedubbelepunt.Zodrawedefolderstatistiekmetde if-statementhebbengevonden,brekenwedestring intweestukkenmetde split()-functie.Dezegeefteenlijstvantweeelementen,omdatweeendubbelepunt hebbengevondendiedelijstintweestukkensplitst.Element0isdetekstlinksvandedubbelepuntenelement 1isalletekstrechtsvandedubbelepunt.Rechtsvandedubbelepuntstaathetgetal.Vandaardatweelement1 kiezen.Omermeetekunnenrekenenmoetenwedestringnaareengetalconverteren.Vandaardatdezehele bewerkinginde int()-conversiezit.Hetresultaatisdat aantal_folders dewaardekrijgtdieinhetbestand wordtgevonden.
Hetzelfdeprincipeistoegepastbijdebestanden.Vervolgenswordtderegelmetdefunctie strip()ontdaanvan decarriagereturnaanheteindevanderegelenophetschermweergegeven.De print()-statementvoegtaleen carriagereturntoe.
ratio = aantal_folders / aantal_bestanden
print(f'De verhouding folders versus bestanden is (> 1 meer folders): {ratio:.2f}')
Inhetvierdedeelwordtde ratiofolderstenopzichtevandebestandenberekendenophetschermweergegeven. Wanneerhetgetalgroterdan1.0 is,zijnermeerfoldersdanbestanden.
156
Mode
Wanneerweeenbestandopenen,gevenwedemodemeeomaantegevenhoewemethetbestandwillenwerken. Zowelbijhetlezenalshetschrijvennaarbestandenhebbenweopties.Hiernagevenwedeverschillendeopties weer.
Tabel 3.1
Foutmelding Functie Lezen
Lezenvantekstbestanden.Bestand wordtvanafhetbegingeopend. r
r+
rb
Lezenenschrijvenvan tekstbestanden.Hetbestandwordt vanafhetbegingeopend.
Lezenvanbinairebestanden,zoals audioofvideo.Hetbestandwordt vanafhetbegingeopend.
Alshetbestandnietbestaat,krijgje eenfoutmelding.
Alshetbestandnietbestaat,krijgje eenfoutmelding.
Alshetbestandnietbestaat,krijgje eenfoutmelding.
Foutmelding Functie Schrijven
Schrijvenvantekstbestanden. Bestandwordtgemaaktalsditniet bestaat.Alshetbestandbestaat, wordtdeinhoudgewist.
Schrijvenenlezenvan tekstbestanden.Bestandwordt gemaaktalsditnietbestaat.Alshet bestandbestaat,wordtdeinhoud gewist.
Schrijvenvanbinairebestanden, zoalsaudioofvideo.
Alshetbestandbestaat,wordthet geopendenwordennieuwedataaan heteindetoegevoegd.Oudedata wordennietgewijzigd.Alshet bestandnietbestaat,wordt a
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Watopvaltisdatbijhetschrijvengeenfoutmeldingenlijkenoptetreden.Datisniethelemaalwaar.Maarde meldingendievergelijkbaarzijnmethetlezenvanbestandenheefthetschrijvenvanbestandenniet.Alsietsniet bestaat,wordthetaangemaakt.Foutmeldingenkomenvoorbijzowellezenalsschrijvenalshetgaatom bijvoorbeeldincorrecteofillegalepadennaarbestandenofomhardwarefouten.
Bestandsinformatie
Wanneerweinformatieovereenbestandwillenopvragen,kanditdoorde stat()-functievanhet Path() te gebruiken.
import pathlib
import datetime
w
w+
wb
157 Blok3 Bestanden
print(f'{"Naam":<45} {"Grootte (bytes)":<15} {"Gewijzigd":<27}') print('=' * 89)
basis_folder = pathlib.Path('C:/Temp') for path in basis_folder.iterdir(): if path.is_file():
grootte = path.stat().st_size
tijd_epoch = path.stat().st_mtime
tijd_datum = datetime.datetime.utcfromtimestamp(tijd_epoch)
gewijzigd = tijd_datum.strftime('%d %b %Y %H:%M:%S.%f')
informatie = f'{path.name:<45} {grootte:<15} {gewijzigd:<20}'
print(informatie)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Wehebbendedatum/tijd-modulenodigvoordedatumfunctieslater.Vandaarde import datetime-regel.Deze libraryheeftuitgebreidefunctiesvoorhetwerkenmettijdendatum.
Omdeinformatieophetschermgestructureerdweertegevenwordteenheadergeprint.Wegebruikende geformatteerdestringomhetgeheelnetjesuittelijnen.Normaalgesprokenplaatsjedenaamvaneenvariabele tussendeaccolades.Tussenaccoladesmagjeexpressieszetten,dusookeenstringofeenberekening.Nuhebben wedaarrechtstreekseenstringgeplaatst.Ditkanalsjeanderequotesgebruiktdandehelestring.Deredendat eenstringtussenaccoladesstaatisomdathierdoorgemakkelijkdeuitlijnmogelijkhedenkunnenwordentoegepast (:<45).Ditwerktbeterdanhetgebruikvantabsenspaties.
Vervolgensisdehelestringonderstreeptmeteen'='-teken.Wanneerjeeenstringvermenigvuldigt,wordtde stringxkeerherhaald.Zokunjeheelkortopgeschreveneenheellangestringweergeven.
print(f'{"Naam":<45} {"Grootte (bytes)":<15} {"Gewijzigd":<27}')
print('=' * 89)
Erwordteen basis_folder aangemaakt.Ditisdefolderwaarinwegaanwerken.Doormeteenfor-loopdoor de basis_folder telopenwordtvoorelkgevondenitemgekekenofheteenbestandis.
basis_folder = pathlib.Path('C:/Temp')
for path in basis_folder.iterdir():
if path.is_file():
Wanneerhetgevondenpatheenbestandis,wordtdegroottevanhetbestandopgevraagdmetbehulpvande stat()-functieende st_size-variabele.Ditiseenwaardeinbytes.
158
if path.is_file():
grootte = path.stat().st_size
Hetvolgendedeelvraagtdetijd/datumvandelaatstewijzigingopmetbehulpvande stat()-functieende st_mtime-variabele.Dewaardediewekrijgeniseenfloatingpoint-getalinsecondensindsEpoch.Wezullen dezewaardemoetenomzettennaarietswatwijkunnenlezen.Vandaardatdefunctie utcfromtimestamp() is gebruikt.Dezeconverteerthetfloatingpoint-getalnaareen datetime-typevanPython.
tijd_epoch = path.stat().st_mtime
tijd_datum = datetime.datetime.utcfromtimestamp(tijd_epoch)
Omhiereenleesbarewaardetekrijgenwordtditeenregelverderomgezetineenstringmetde datum/tijd-stringformatteringsfunctie strftime() Demanierwaaropdedatum/tijdwordtgeformatteerdkun jeaangevenmet%,gevolgddooreenletter.Inonzeomzettingisgekozenvoorhetformaat'%d %b %Y %H:%M:%S.%f'
gewijzigd = tijd_datum.strftime('%d %b %Y %H:%M:%S.%f')
Indevolgendetabelkunjezienwelkelettervoorwelkeinformatiestaat.
Tabel 3.2
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Alslaatstewordtdeinformatiesamengesteldineenstring,gebruikmakendvandeformatteringsopties.Daarna wordtdezestringophetschermweergegeven.
Voorbeeld Betekenis Code 07 Dagvandemaandmeteenvoorloop 0indien<10. %d Jan Demaandafgekortmetdelokale afkorting. %b 2019 Jaarvolledigmetdeeeuw. %Y 22 Urenin24uursformaatmeteen voorloop0indien<10. %H 57 Minutenmeteenvoorloop0indien <10. %M 07 Secondenmeteenvoorloop0indien <10. %S 000450 Microsecondenmeteenvoorloop0 indien<1000000. %f
159 Blok3 Bestanden
informatie = f'{path.name:<45} {grootte:<15} {gewijzigd:<20}'
print(informatie)
Csv-bestanden
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Eencsv-bestand,eencommaseparatedvalue-formaat,iseenpopulairformaatwaarindedataintabelvorm wordenopgeslagen.Hetgaatomnummersentekstgescheidendooreenkomma.Elkeregelstelteenregeldata voorenheefthetzelfdeaantaldatapunten.
Hiernaeenvoorbeeldvandeinhoudvaneencsv-bestand.Inditgevaleenbestandwaarineengebruikersnaam (eenidentifier),voornaamenachternaamzijnopgeslagen.
Username, Identifier,First name,Last name
booker12,9012,Rachel,Booker grey07,2070,Laura,Grey
johnson81,4081,Craig,Johnson
jenkins46,9346,Mary,Jenkins smith79,5079,Jamie,Smith
Omdatcsv-bestandenallangetijdingebruikwarenvoordateenpogingisgedaanomereenstandaardvoorte beschrijven,zijnersubtieleverschillen.UiteindelijkisdestandaardRFC4180(RequestforComment)beschreven. Doorallesubtieleverschillenishetlastigomzelfeengoedecsv-importeer-ofcsv-exporteerfunctietemaken.We makendaarvoorgebruikvandePython-modulecsv.Dezekanjouhintsgevenomhetbestandtelezenalsofhet vanExcelkomt.Ofandersom:datjeaangeeftdatjeeencsv-bestandwiltschrijvendatdoorExcelwordtgelezen. Decsv-modulezorgterdanvoordatdesubtielezakendieExcelheeftinhetbestandkomen.Alsdeveloperhoeven weonsdannietbezigtehoudenmetwatdesubtieleverschillenvaneenExcel-csv-bestandzijn.
Schrijven
Wanneerwenaareencsv-bestandwillenschrijven,moetenwededataineenitereerbaartypezetten.Ditkunnen webijvoorbeelddoendoordedatainlijstentezetten.Elkelijststelteenregelinhetteschrijvencsv-bestandvoor.
Dooraldezelijstenineenlijsttezettenkunnenwedetotalelijstaandecsv-modulegeven.Decsv-modulekan dedatadanalscsv-regelswegschrijven.
import pathlib
import csv
folder = pathlib.Path('C:/Temp')
vriendenlijst = folder / 'Vrienden.csv'
mijn_vrienden = [
['Naam', 'Leeftijd', 'Stad'],
['Alice', 30, 'Amsterdam'],
['Bob', 25, 'Rotterdam'],
160
['Charlie', 35, 'Utrecht'],
['David', 28, 'Den Haag'],
['Emma', 32, 'Groningen'],
['Frank', 40, 'Eindhoven'],
['Grace', 27, 'Maastricht'],
['Hannah', 33, 'Haarlem'],
['Isaac', 29, 'Leiden'],
['Julia', 26, 'Nijmegen']
]
with vriendenlijst.open(mode='w', newline='') as csv_bestand:
csv_schrijven = csv.writer(csv_bestand)
csv_schrijven.writerows(mijn_vrienden)
Behalvede pathlib-moduleimporterenwede csv-module.Vervolgensmakenwemet Path eenfolderom daarinhetmeegegevencsv-bestandaantewijzen.Devariabele vriendenlijst isnuhetbestand Vrienden.csv
mijn_vrienden = [
['Naam', 'Leeftijd', 'Stad'],
['Alice', 30, 'Amsterdam'],
['Bob', 25, 'Rotterdam'],
['Charlie', 35, 'Utrecht'],
['David', 28, 'Den Haag'],
['Emma', 32, 'Groningen'],
['Frank', 40, 'Eindhoven'],
['Grace', 27, 'Maastricht'],
['Hannah', 33, 'Haarlem'],
['Isaac', 29, 'Leiden'],
['Julia', 26, 'Nijmegen'] ]
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Eenlijstmetvriendenisopgezetalseenitereerbaartype.Ditiseenlijstwaarinelkelementindelijsteenvriend ofvriendinis.Iederevriendofvriendinwordteenregelinhetcsv-bestand.
with vriendenlijst.open(mode='w', newline='') as csv_bestand:
csv_schrijven = csv.writer(csv_bestand)
csv_schrijven.writerows(mijn_vrienden)
161 Blok3 Bestanden
Weopenenhetvriendenlijstbestandindeschrijfmode:ziede 'w' Wegevenaandathetnewlinekarakterleegis '' .Ditzorgtervoordateennewlinecorrectwordtbehandeldalsdezeinhetcsv-bestandindeteksttussen aanhalingstekenswordtgezien.Ookhet '\r'-escapetekenwordtdancorrectafgehandeld.Indevariabele csv_schrijven komtdecsv-writerdieallesnaarhetbestandgaatschrijven.Datgebeurtopderegelerna,waar alleelementenuitdevriendenlijstnaarhetcsv-bestandwordengeschreven.
Encoding
Hetkanvoorkomendatjedatabijzonderekaraktersgebruiken.Denkbijvoorbeeldaanwoordenals'financïen'en 'wereldzeeën'.Jekuntdandeencodingvandetekstforcerennaareenbepaaldestandaard,bijvoorbeedlUTF-8.
with vriendenlijst.open(mode='w', newline='',
encoding='utf-8') as csv_bestand:
CONCEPT (ZONDERBEELD-EN
Lezen
Netalstekstbestandenstaancsv-bestandenoponzeopslagenineenfolder.Ooknugebruikenwe pathlib.Path() omdebestandenaantewijzen.
TAALREDACTIE)
Hetvolgendevoorbeeldlaatzienhoeweeencsv-bestandkunnenlezen.Wehebbeneenlijstgekregenmetnamen, hetpersoneelsnummer,deafdelingendedienstjaren. Personeelslijstmetgegevensoverdemedewerkers
import pathlib
import csv
folder = pathlib.Path('C:/Temp')
personeelslijst = folder / 'Personeelslijst.csv'
with personeelslijst.open(mode='r', newline='') as csv_bestand: csv_lezer = csv.reader(csv_bestand)
for regel in csv_lezer:
print(regel)
Behalvede pathlib-moduleimporterenwede csv-module.Vervolgensmakenwemet Path eenfolderomdaar hetmeegegevencsv-bestandaantewijzen.Devariabele personeelslijst isnuhetbestand
Personeelslijst.csv.
162
with personeelslijst.open(mode='r', newline='') as csv_bestand: csv_lezer = csv.reader(csv_bestand)
Weopenenhetpersoneelslijstbestandindeleesmode:ziede 'r'.Wegevenaandathetnewlinekarakterleegis '' Ditzorgtervoordateennewlinecorrectbehandeldwordtalsdezeinhetcsv-bestandindeteksttussen aanhalingstekenswordtgezien.Ookhet '\r'-escapetekenwordtdancorrectafgehandeld.Indevariabele csv_lezer komtdecsv-readerdieallesuithetbestandgaatlezen.
for regel in csv_lezer: print(regel)
De csv_lezer bevatnudelijstmetpersoneelsleden.Wekunnennudoordelijstlopendoormiddelvaneen herhalingslus.Elkeiteratiedoordeherhalingslusgevenweweeralseen regel uithetcsv-bestand.
ElkeregeldiewordtgeprintiseenPython-list.Aanelkeregelkandanookwordengevraagdhoeveelelementen metde len()-functieerinzitten.
Configureren
Wekunnenbijhetcsv-bestandopenennogeenaantalconfiguratieoptiesmeegeven.Webehandelenhieralleen demeestgebruikteopties.
Dedelimiter-optie:
with vriendenlijst.open(mode='w', newline='') as csv_bestand: csv_schrijven = csv.writer(csv_bestand, delimiter=':')
csv_schrijven.writerows(mijn_vrienden)
Dooraandereaderofwritertemeldendathetcsv-bestandeenanderedelimiterdandestandaard','gebruikt, wordtdeopgegevendelimitertoegepastbijdeoutputinhetbestand
DeExceldialect-optie:
with vriendenlijst.open(mode='w', newline='') as csv_bestand:
csv_schrijven = csv.writer(csv_bestand, dialect='excel')
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
csv_schrijven.writerows(mijn_vrienden)
Doordereaderofwritertemeldendathetcsv-bestandvermoedelijkeenkeuzevoorExcelgaatmaken,kande outputwordengeoptimaliseerd.
Excelbestanden
EenExcelbestandiseenpopulairformaatvanhetMicrosoftOfficeExcel-programma.Zo'nbestandheeftde extensie*.xlsx.Wanneerjeeenouderbestandtegenkomt,kanditdeextensie*.xlshebben.
163 Blok3 Bestanden
Hetformaatisdusdanigcomplexdatweereenbibliotheekvoornodighebbenomdegegevensvaneen Excelbestandtekunnenlezenenschrijven.Dezebibliotheekkunnenweaanonsprojecttoevoegen.Hiervoor makenweeenvirtualenvironmentaanwaarbinnenwedeexternebibliotheekkunneninstalleren.
Virtualenvironment
EenvirtualenvironmentiseenafgeschermdeomgevingwaarinjePython-projectenkuntuitvoeren.Hetbijzondere aandezeomgevingisdatjespecifiekebibliothekenvoorjeprojectkuntinstallerenzonderdatdezeandere projectenbeïnvloeden.Jekuntzoinverschillendevirtualenvironmentseenbibliotheekinstallerenmeteen andereversie.Daardoorkunjeprojectenvanelkaarisolerenentestenmethuneigenspecifiekebibliothekenen instellingen.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Hetgebruikvanvirtualenvironmentsisvooralhandigalsjemeerdereprojectenhebtdieandereexterne bibliothekennodighebben.Ofprojectendieeenandereversievaneenspecifiekebibliotheeknodighebben, omdatzenietcompatibelzijn.Jekuntbijvoorbeeldineenvirtualenvironmenttestenofeenapplicatiemetde nieuweversievaneenbibliotheekwerktvoordatjedezebijeenklantinstalleert.
Aanmaken van een virtual environment
OmeennieuwevirtualenvironmentaantemakenstartenwedePyCharmIDEenmakenweeennieuwproject aan.Ditdoenwedooreeneventueelopenstaandprojecttesluiten.PyCharmkomtdanmeteenschermwaarin jekuntkiezenomonderandereeennieuwprojectaantemaken.
Wekiezendebutton'NewProject'enkunnendaneennieuwprojectaanmaken.
Figuur 3.1 PyCharm start dashboard
164
Figuur 3.2 PyCharm van een nieuw project aanmaken
Geefhetprojecteenzinvollenaamenselecteerdejuistefolderwaarinjehetprojectwilthebben.
Versiebeheer
CONCEPT
Aangeradenwordtomeenversiebeheersysteemtegebruiken,maarditisgeenonderdeelvanhetboek.
Kiesvoorhetwelkomstscript,zodatweeenvoudigkunnenzienofalleswerkt.ZorgervoordatdeProjectvenv buttonisgeselecteerd.DePython-versieisdelaatsteversiedieopjesysteemstaat.Tenzijjespecifiekewensen hebtisdestandaardinstellinggoed.
Klikopdebutton'Create',zodatPyCharmhetprojectineenvirtualenvironmentkanmaken.Wehebbennuhet welkomstscript.Alshetwelkomstscriptgoedrunt,wetenwedatalleinstellingengoedstaan.Klikhiervooropde playbuttonbovenaanhetscherm.
(ZONDERBEELD-EN TAALREDACTIE)
Wehebbennueennieuwprojectineeneigenvirtualenvironment.
Installeren Excelbibliotheek
OmExcelbestandenteschrijvenentelezenkunnenweeenbibliotheekgebruiken.
Wanneerwedebibliotheekinonzevirtualenvironmentwilleninstalleren,doenweditalsvolgt.InPyCharmkiezen weviahethamburgermenu(driehorizontalestreepjes)deoptiesettings.Wekomendanopeenschermwaarin webijnaonderaanonsprojectzien.
165 Blok3 Bestanden
Figuur 3.3 PyCharm: menu settings
CONCEPT
Weklikkenbinnenonsprojectopde'Pythoninterpreter'.Wekrijgendanaanderechterkanttezienwelke bibliothekenalindevirtualenvironmentzitten.Dooropde'plus'teklikkenkunnenweeenvoudignieuwe bibliothekentoevoegen.
(ZONDERBEELD-EN TAALREDACTIE)
166
CONCEPT
Figuur 3.4 PyCharm: beschikbare bibliotheken
TAALREDACTIE)
Ophetmomentvanschrijvenzijner513,320projectsindePythonPackageIndex(PyPI).Hierwordenbibliotheken gepubliceerddiejeineigenprojectenkuntgebruiken.Jekuntdeindexookmeteenwebbrowserbenaderen.
Indezoekbalkkunnenwenudebibliotheektypendiewewillengebruikenvoorhetlezenenschrijvenvan Excelbestanden.Debibliotheekheetopenpyxl.
(ZONDERBEELD-EN
167 Blok3 Bestanden
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Figuur 3.5 PyCharm: selecteren openpyxl
Kliknuop'Installpackage'.Debibliotheekwordtdangedownloadengeladeninhetproject.Zodrahetdownloaden eninstallerenisgelukt,wordtonderinweergegeven:"Package'openpyxl'installedsuccesfully."Wekunnenhet 'AvailablePackages'-schermmethetkruis,rechtsbovenin,sluiten.
Weziendandataanonzevirtualenvironment openpyxl istoegevoegd.Hetkanzijndatmeerderebestandenzijn toegevoegd.Ditzijnbestandendie openpyxl zelfnodigheeftomtekunnenfunctioneren.Klikopde'Ok-button' omweerverdertegaan.
Schrijven
Wehebbendebibliotheek openpyxl inonzevirtualenvironmentgeïnstalleerdenkunnendezenugebruikenom Excelbestandenteschrijven.Exceliseenheeluitgebreidprogrammametheelveelmogelijkheden.Veelvandie mogelijkhedenkunjemetbehulpvande openpyxl realiseren.Hetprogrammaisregel-enkolomgeorïenteerd. DenkaandeverschillendemanierenwaaropjeeendataveldinExcelkuntbenaderen:rechtstreeks 'C4',kolomC enregel 4.Ofletterlijkaangeven:regel 4 en kolom 3.
Wezullennietallemogelijkhedenbekijken,maargebruikendemeestvoorkomendemanierenommetExcelte kunnenwerken.
OmdataineenExcelbestandwegtekunnenschrijven,moetenwede openpyxl-moduleimporteren.Vervolgens gevenwemet patheenbestandaanwaarhetExcelbestandmoetkomentestaan.
168
import openpyxl import pathlib
file_path = pathlib.Path("C:/Temp")
excel_file = file_path / "Namen.xlsx"
werkboek = openpyxl.Workbook()
werkblad = werkboek.active
werkblad.append(['Naam', 'Leeftijd'])
werkblad.append(['Alice', 30])
werkblad.append(['Bob', 25])
werkblad.append(['Charlie', 35])
werkboek.save(excel_file)
OmdatwevanuitdecodeeenExcelbestandgaangenereren,moetenweeersthetExcelbladgaanopbouwen. Excelnoemteenbestandeenwerkboek(workbook).Binneneenwerkboekhebjewerkbladen.Datzijnde verschillendetabbladen.VooreengeldigExcelbestandhebjeminstenseenwerkboeknodigmetdaarineen werkblad(tabblad).
werkboek = openpyxl.Workbook()
werkblad = werkboek.active
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
WehebbennuinhetgeheugenvandecomputereenExcelwerkboekmeteenwerkbladgemaakt.Visueelkunje eenleegExcelbladvoorstellenmetééntabblad.
Omhetbladtevullenmetdatavoegendaaraanhetwerkbladtoe.Elkeregelophetwerkbladkunnenweons voorstellenalseenlijst.Elkelementindielijstiseenkolom.
werkblad.append(['Naam', 'Leeftijd'])
werkblad.append(['Alice', 30])
werkblad.append(['Bob', 25])
werkblad.append(['Charlie', 35])
169 Blok3 Bestanden
WegaaneenlijstvanpersonenenhunleeftijdeninExcelzetten.Deeersteregelisdezogenoemdeheadervande tabel.Hierinzettenwedenamenvandekolommen.Wegevenhetwerkbladeenlijstmettweeelementen:naam enleeftijd.Opdevolgenderegelsvoegenwesteedseenlijsttoeaanhetwerkbladwaarinweeennaameneen leeftijddoorgeven.
werkboek.save(excel_file)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
WemakenhetExcelwerkboekdusinhetgeheugen.Uiteindelijkwillenwehetopslaan.Datdoenwemethet commando save() Wegevendenaamdiehetbestandmoethebbeninclusiefhetpadernaartoe.
AlsjeExcelopjecomputerhebt,kunjehetzojuistopgeslagenbestandinExcelopenen.Jezultdandepersonen uitdelijstzien.
Aanpassen
WekunnenhetExcelwerkbladookopeenanderemanierbeschrijven:doorrechtstreeksdecellentebenaderen ofdoorhetwerkbladalseenkey-valuepairtebenaderen.Inhetvolgendeprogrammagaanwenogtweenamen toevoegen,maardanopdealternatievemanier.
import openpyxl
import pathlib
file_path = pathlib.Path("C:/Temp")
excel_file = file_path / "Namen.xlsx"
werkboek = openpyxl.Workbook()
werkblad = werkboek.active
werkblad.append(['Naam', 'Leeftijd'])
werkblad.append(['Alice', 30])
werkblad.append(['Bob', 25])
werkblad.append(['Charlie', 35])
werkblad['A5'] = "John"
werkblad['B5'] = 41
werkblad.cell(row=6, column=1, value="Jane")
170
werkblad.cell(row=6, column=2, value=38)
werkboek.save(excel_file)
Hetprogrammaisietsaangepast.Aandekey-valuepair-methodeiseenregeltoegevoegdenopderechtstreekse benaderingvaneencell.
werkblad['A5'] = "John"
werkblad['B5'] = 41
werkblad.cell(row=6, column=1, value="Jane")
werkblad.cell(row=6, column=2, value=38)
TAALREDACTIE)
Opdekey-valuepair-manierzienwegelijkterugwatweinExcelookzien.Denummeringisdanookhetzelfde.
Dezemanierkanhandigzijnalsjedelocatievanuitdenamenvanderegelenkolommenweet.
Decellenopeenrechtstreeksemanierbenaderenisookerghandig,zekerwanneerjeineenloopExcelwiltvullen. Waarwenueenconstante 6 hebbengebruiktalsregelnummer,zouhetdaneenvariabelekunnenzijn.
Allemethodenhebbenhunvoor-ennadelen.Welkemethodehandigishangtafvandeapplicatie.Derechtstreekse key-value-benaderingisvaakhandigeralsjeeenenkelecelwiltvullenmeteenwaarde.Wanneerjegroteaantallen opeenvolgendecellenmoetvullen,isineenloopderow/column-methodeweerpraktischer.
Formules
HetkanvoorkomendatjevanuitPythoneenExcelbladwiltvoorzienvanformules,zodatanderenhetExcelbestand latervanuitExcelverderkunnenbewerken.
Formuleskunjealsstringdoorgeven.Doordebewustecellaanteduidenkunjedeformuleineencellschrijven. Stel,wewillenvanallepersoneninonzelijstdegemiddeldeleeftijdbepalen.
import openpyxl
CONCEPT (ZONDERBEELD-EN
import pathlib
file_path = pathlib.Path("C:/Temp")
excel_file = file_path / "Namen.xlsx"
werkboek = openpyxl.Workbook()
werkblad = werkboek.active
171 Blok3 Bestanden
werkblad.append(['Naam', 'Leeftijd'])
werkblad.append(['Alice', 30])
werkblad.append(['Bob', 25])
werkblad.append(['Charlie', 35])
werkblad['A5'] = "John"
werkblad['B5'] = 41
werkblad.cell(row=6, column=1, value="Jane")
werkblad.cell(row=6, column=2, value=38)
werkblad['B7'] = "=AVERAGE(B2:B6)"
werkblad['C7'] = "Gemiddelde"
werkboek.save(excel_file)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
FormulesmoetendeEngelsebenamingkrijgen,anderskandeomzettingnaareenanderetaalnietcorrect plaatsvindenenkrijgenwefouten.
werkblad['B7'] = "=AVERAGE(B2:B6)"
werkblad['C7'] = "Gemiddelde"
Deformuleisinhetwerkbladgeplaatstviadekey-valuepair-methode.Jemoetdetekstvandeformuleexact hetzelfdeintikkenalsinExcel.Letop:gebruikhierdeEngelsebenamingen.
Naamgeving
BinneneenExcelbestandzijnervelemogelijkhedenvoorhetinstellenvanallerleiparameters Wanneerweeen werkboekhebben,zitdaarstandaardeenwerkbladbij.Ditishetdefaultwerkblad.
Werkbladenkunjeeennaamgevenmetdevolgendecode.
import openpyxl
import pathlib
file_path = pathlib.Path("C:/Temp")
excel_file = file_path / "Namen.xlsx"
172
werkboek = openpyxl.Workbook()
werkblad = werkboek.active
werkblad.title = "Personen"
print(f"{werkblad.title}")
werkboek["Personen"].append(["Joan", "48"]) werkboek.create_sheet("Rotterdam")
werkboek["Rotterdam"].append(["Patrick", "33"])
werkboek.active = werkboek["Rotterdam"]
print(f"Er zijn {len(werkboek.sheetnames)} tabbladen " f"en ze heten {werkboek.sheetnames}")
werkboek.save(excel_file)
TAALREDACTIE)
Wehebbennueenwerkboekmeteendefaultwerkbladgerealiseerd.Vervolgenshebbenwededefaulttabbladnaam veranderdin Personen Hetwerkbladhebbenwebenaderddooreenkey-valuepairtegebruiken.Vervolgens hebbenweeen naam eneen leeftijd aanhetwerkbladtoegevoegd.
werkblad.title = "Personen"
print(f"{werkblad.title}")
werkboek["Personen"].append(["Joan", "48"])
Vervolgensisnogeenwerkbladmetdenaam Rotterdam aangemaakt.Ookhierzijneen naam en leeftijd toegevoegd.Hetactievewerkbladisgewijzigdindenieuwgemaaktetab Rotterdam
werkboek.create_sheet("Rotterdam")
werkboek["Rotterdam"].append(["Patrick", "33"])
CONCEPT (ZONDERBEELD-EN
werkboek.active = werkboek["Rotterdam"]
Denamenvandeaanwezigetabbladenkunnenwordenopgevraagddoordezemet werkboek.sheetnames aan hetwerkboektevragen.
173 Blok3 Bestanden
print(f"Er zijn {len(werkboek.sheetnames)} tabbladen " f"en ze heten {werkboek.sheetnames}")
Lezen
DownloadhetbijgevoegdeExcelbestandomdaarmeetekunnenwerken.
HiernaziejedecodeomhetbijgevoegdeExcelbestandteladenendeinformatieweertegeven.
import openpyxl
import pathlib
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
file_path = pathlib.Path("C:/Temp")
excel_file = file_path / "Sales_kwartaal1.xlsx"
werkboek = openpyxl.load_workbook(excel_file)
werkblad = werkboek.active
aantal_regels = werkblad.max_row
aantal_kolommen = werkblad.max_column
for regel in range(aantal_regels):
tekst_regel = "" for kolom in range(aantal_kolommen):
cell_waarde = werkblad.cell(row=regel + 1, column=kolom + 1).value if len(tekst_regel) == 0:
tekst_regel = f"|{str(cell_waarde):^25}" else:
tekst_regel = f"{tekst_regel}| {cell_waarde:<20}"
print(tekst_regel)
VoorhetlezenvanExcelbestandengebruikenwede openpyxl-bibliotheek.Dezebibliotheekheefteeneigen open-functie.ViadezefunctieopenenweeenbestaandExcelbestand.Wezorgenervoordatweeenpadmaken naarhetbestand.Ditdoenwemetde pathlib-module.
174
import openpyxl
import pathlib
file_path = pathlib.Path("C:/Temp")
excel_file = file_path / "Sales_kwartaal1.xlsx"
Weladenhetbestandalseenwerkboekenkennendittoeaanonze werkboek-variabele.Elk werkboek heeft minstenseen werkblad Weselecterenhetdefaultwerkblad Vervolgensvragenweaanhet werkblad hoeveel regelsenkolommenerzijn.Dezewaardenslaanweop,zodatwelaterwetenhoeweonzeherhalingslussenkunnen instellen.
werkboek = openpyxl.load_workbook(excel_file)
werkblad = werkboek.active
aantal_regels = werkblad.max_row
aantal_kolommen = werkblad.max_column
Wegaaninditvoorbeeldmetbehulpvaneenloopdoordedata.Hiervoorgebruikenweheteerderbepaalde maximaleaantalregelsenkolommen.Doorde range()-functiekunnenweeengeneste for-herhalingslusmaken diedoorderegelsenkolommengaatomdedatavandedesbetreffendecellenoptehalen.InExcelbegintde regel-enkolomnummeringbij1.DePython range()-functiebegintbij0.Vandaardatbijzowelderegelalsde kolom + 1istoegevoegd.Een cell wordtgeselecteerdopbasisvaneenrij-eneenkolomnummer.Vervolgens kanvandecelldewaardewordenopgevraagdmetvalue.
for regel in range(aantal_regels):
tekst_regel = ""
for kolom in range(aantal_kolommen):
cell_waarde = werkblad.cell(row=regel + 1,
column=kolom + 1).value
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
if len(tekst_regel) == 0:
tekst_regel = f"|{str(cell_waarde):^25}" else:
tekst_regel = f"{tekst_regel}| {cell_waarde:<20}"
print(tekst_regel)
175 Blok3 Bestanden
Degeneste for-herhalingslussengaanlangsallekolommenenalleregels.
Omdatelkeregeldezelfdebasisheeftmaardedataanderszijn,moetdezedynamischwordenopgebouwd.Dit wordtgedaanmetdevariabele tekst_regel tijdenshetloopendoordekolommen.Ziede constructietekst_regel = f"{tekst_regel}| {cell_waarde:<20}".
Ditishetzelfdealsde+=operator.Datzoueralsvolgtkunnenuitzien: tekst_regel += f"| {cell_waarde:<20}" Deconstructiedieindecodeisgebruikt,laatindezesituatieechterbeterzienwater gebeurt.
Ditbestandhebbenwegelezenenwehebbenderijenenkolommenweergegeven.Hetismogelijkomnu aanpassingentedoen,bijvoorbeeldwaardenvaneenbepaalde cell aanpassen.Wemoetendanwel dewerkboek.save(excel_file)-functieaanroepenwanneerwedeaanpassingenwillenopslaan.
Opmaak
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
NetalsinExcelishetmogelijkombepaaldeopmaakterealiseren.Denkhierbijaandekleurvandecellofhet gebruiktefont.DitkanduidelijkheidbiedenaaneenExcelbestanddoorviaeenapplicatieaccentenbijcellenaan tebrengen.
import openpyxl
import pathlib
file_path = pathlib.Path("C:/Temp")
excel_file = file_path / "Namen.xlsx"
werkboek = openpyxl.load_workbook(excel_file)
werkboek.active = werkboek["Personen"]
werkblad = werkboek.active
font_naam = openpyxl.styles.Font(name='Comic Sans', color="000000FF", size=22)
a1= werkblad['A1'].font = font_naam
werkboek.save(excel_file)
IndevoorgaandecodebeginnenweweermetdestandaardzakenvoordatwehetExcelbestandkunnenladen. Weimporterendebenodigdemodulesenzorgenvooreenpadnaardefolderenhetjuistebestand.
import openpyxl
import pathlib
176
file_path = pathlib.Path("C:/Temp")
excel_file = file_path / "Namen.xlsx"
VervolgensopenenwehetExcelbestandengevenweaanwatonsactievewerkbladwordt,waarnawehetwerkblad activeren.
werkboek = openpyxl.load_workbook(excel_file)
werkboek.active = werkboek["Personen"]
werkblad = werkboek.active
Wegaanhetfontendekleurvandetekstaanpassen.Ditdoenwevoorcell A1.Omdittekunnenrealiseren,maken weeen font_naam-variabeleaanwaarmeewedegewensteeigenschappenvanhetfontaangeven.Inditvoorbeeld kiezenwevooreenfontmetdenaam Comic Sans Daargevenwedekleur 000000FF(watovereenkomtmet blauw)eneengroottevan 22aan.Dewaardeendeopbouwvandekleurwordenlatertoegelicht.
CONCEPT
TAALREDACTIE)
Doorhetopdezemaniersamengesteldefontaandecelltoetekennenkunnenwedeopmaakvaneencell aanpassenenaccentengevenaaneenExcelbestand.Uiteraardmoetenwehetbestanddanookweeropslaan metdesave()-functie.
font_naam = openpyxl.styles.Font(name='Comic Sans', color="00FF0000", size=22)
a1= werkblad['A1'].font = font_naam
werkboek.save(excel_file)
Dekleuriseen32-bitsgetal,waarbijdeopbouwalsvolgtis: 00AABBCC 00
Kleur Altijd 00
(ZONDERBEELD-EN
AA BB CC
Rood Groen Blauw
R G B
DeRGB-waardegeeftvoorelkeletteraanhoesterkdekleurisvertegenwoordigdindetotalekleur.Daarbijkomt dewaarde 00 overeenmetgeenaandeelendewaarde FF methetmaximaleaandeelvandiekleur.Doordekleur opdezemaniersamentestellenkunjeeenenormehoeveelheidkleurensamenstellen.
Naastdeaanpassingendieindecodestaanzijnveelmeerinstellingenmogelijkbijeencell.Ziehiervoorde documentatievande openpyxl-module. Wehebbengeziendatde openpyxl-moduleenormveelmogelijkhedenheeftdievrijwelgelijkzijnaande mogelijkhedenvanExcel.Meteenaantalvoorbeeldenhebbenwemogelijkhedenvanhetgebruikvandemodule latenzien.Wemoedigenjeaanomvooralverderteexperimenterenaandehandvandedocumentatievande openpyxl-module.
177 Blok3 Bestanden
Grotehoeveelheidcellenbenaderen
Hetkomtvoordatwemetgrotehoeveelhedenrijenenkolommentemakenhebben.Wanneerwedecellen rechtstreeksbenaderen,wordenzenietgelijkinhetgeheugengeladen.Zolangwegeenwaardenvragen,worden decellenooknietinhetgeheugengeplaatst.Wanneerweechtereenfor-herhalingslusgebruikenomlangsde verschillenderegelsenkolommentelopen,wordendecelleninhetgeheugengeplaatst.Ookaldoenweerverder nietsmee.Ziedevolgendecode.
for regel in range(1,101):
for kolom in range(1,101):
werkblad.cell(row=regel, column=kolom)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Indevoorbeeldcodeworden100regelsx100kolommeninhetgeheugengeplaatst,terwijlweernietsmeedoen. Ditkanefficiënterdoordecellentebenaderenmetsnijden(slices).Wekennenditnogvandelistendetuple. Stel,wehebbeneenExcelbestandwaarbijwedatahebbenindekolommenA1totenmetH20.Wekunnendan allecellenbenaderendooreenslicetenemendiezogrootisalshetstukdatwenodighebben.
bereik = werkblad['A1':'H20']
Devariabelebereikbestaatdanuiteentuplevantuples.
((<Cell 'Blad1'.A1>, <Cell 'Blad1'.B1>,
<Cell 'Blad1'.C1>, <Cell 'Blad1'.D1>,
<Cell 'Blad1'.E1>, <Cell 'Blad1'.F1>,
<Cell 'Blad1'.G1>, <Cell 'Blad1'.H1>),
(<Cell 'Blad1'.A2>, <Cell 'Blad1'.B2>,
<Cell 'Blad1'.C2>, <Cell 'Blad1'.D2>,
<Cell 'Blad1'.E2>, <Cell 'Blad1'.F2>,
<Cell 'Blad1'.G2>, <Cell 'Blad1'.H2>), ...,
(<Cell 'Blad1'.A20>, <Cell 'Blad1'.B20>, <Cell 'Blad1'.C20>, <Cell 'Blad1'.D20>,
<Cell 'Blad1'.E20>, <Cell 'Blad1'.F20>,
<Cell 'Blad1'.G20>, <Cell 'Blad1'.H20>))
Elketuple(iseenregel)bestaatuittuples(kolommen),diedanweerdecellenvertegenwoordigenziejezoterug. Vanuithetvoorbeeldziejeditals (<Cell 'Blad1'.A2>, <Cell 'Blad1'.B2>, <Cell 'Blad1'.C2>, <Cell 'Blad1'.D2>, <Cell 'Blad1'.E2>, <Cell 'Blad1'.F2>, <Cell 'Blad1'.G2>, <Cell 'Blad1'.H2>).Cell 'Blad1'.A2 isdaneenopzichzelfstaandecel,namelijktweederijeerstekolom.
Pasalswedoordezetuplesineenfor-loopgaanlopen,wordendecelleninhetgeheugengeladen.Ditscheelt aanzienlijkindeperformancevangroteExcelbestanden.
178
Eenanderemanieromgrotehoeveelhedentebereikenisgebruikmakenvande iter_rows()-of iter_cols()-functies.Iterstaatkortwegvooriteration,watweerstaatvooriteratie.Wekunnendezefunctie dusgebruikenineenfor-loop.
# For-loop voor regels
for regel in werkblad.iter_rows(min_row=1, max_col=3, max_row=2): for cell in regel: print(cell)
# For-loop voor kolommen for kolom in werkblad.iter_cols(min_row=1, max_col=3, max_row=2): for cell in kolom: print(cell)
3.6 Begrippen
3.7 Testjekennis
Opdracht6
Hoecontroleerjeofeenbepaaldpadverwijstnaareenbestaandbestandmetpathlib?
path.exists()
Path.exists()
Path.is_file()
path.is_file()
Opdracht7
import pathlib
folder = pathlib.Path('C:/')
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
for element in folder.iterdir(): if element....:
print(element)
Bekijkdevoorgaandecode.Watmoetenwena if element. invullenopdepuntjesalswealleendefolders willenzien?
179 Blok3 Bestanden
Opdracht8
Watisdevoornaamsteredenomde with statementtegebruikenbijhetopenenvanbestandeninPython?
Omtoegangtekrijgentotdeinhoudvanhetbestand.
Omhetbestandteopenenvoorlezenenschrijven.
Omhetbestandautomatischtesluitenwanneerhetblokisvoltooid,zelfsalseenuitzonderingoptreedt.
Omdebestandsnaamoptegeven.
Opdracht9
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Watisdejuistesyntaxisomallebestandendiebeginnenmet"data_"eneindigenop".txt"ineenmaptedoorzoeken metbehulpvandeglob-module?
glob("data_*.txt")
glob("*.txt","data_*")
glob("*data_*.txt")
glob("?data_*.txt")
Opdracht10
Welkemodulewordtvaakgebruiktvoorhetlezenenschrijvenvancsv-bestandeninPython? os sys io csv
Opdracht11
Hoekunjegegevensnaareencsv-bestandschrijvenmetdecsv-moduleinPython?
csv.write()
csv.writer()
save_csv()
write_csv()
Opdracht12
HoevoegjeeennieuwwerkbladtoeaaneenExcelbestandmetopenpyxl?
180
werkblad_adressen = werkboek.add_sheet('Adressen')
werkblad_adressen = werkboek.append_sheet('Adressen')
werkblad_adressen = werkboek.create_sheet('Adressen')
werkblad_adressen = werkboek.insert_sheet('Adressen')
Opdracht13
HoekaneenExcelbestandwordengeopendmetopenpyxl?
Doorgebruiktemakenvandeopen_excel()-functie.
Doorgebruiktemakenvanderead_excel()-functie.
DoorhetExcelbestandsimpelwegteopenenmetdeopen()-functie.
Doorgebruiktemakenvandeload_workbook()-functie.
Opdracht14
Watiseenwerkbladinopenpyxl?
EenwerkmapineenExcelbestand.
EenformulediewordttoegepastopgegevensinExcel.
EenobjectdateenenkeltabbladineenExcelbestandvertegenwoordigt.
EengrafiekdieisgemaaktmetgegevensuiteenExcelbestand.
Opdracht15
WelkemethodeinopenpyxlwordtgebruiktomeenExcelbestandopteslaannahetmakenofwijzigen? save() write() export() store()
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Opdracht16
Hoekaneenwerkbladmetdenaam"Prijzen"ineenExcelbestandwordenverkregenmetopenpyxl?
181 Blok3 Bestanden
werkblad = werkboek.get_sheet_by_name('Prijzen')
werkblad = werkboek['Prijzen']
werkblad = werkboek.sheet_by_name('Prijzen')
werkblad = werkboek.get(0)
Opdracht17
CONCEPT (ZONDERBEELD-EN
TAALREDACTIE)
WatisdejuistemethodeomdewaardevancelD5telezenineenExcelwerkbladmetopenpyxl? sheet.read("D5") sheet.cell("D5").value sheet.cell("D5").value sheet.cell(row=5,column=4).value
Opdracht18
WatisdejuistemethodeomdewaardevancelD5telezenineenExcelwerkbladmetopenpyxl? werkblad.read("D5") werkblad.cell(row=5,column=4).value sheet.cell("D5").value sheet["D5"].read()
Opdracht19
WatishetdoelvanhetgebruikvanvenvinPython?
HetiseentoolvoorhetvaliderenvanPython-scripts.
HetiseenmodulevoorhetimplementerenvanvirtuelemethodeninPython-programma's.
HetiseenmodulevoorhetmanipulerenvanversiebeheerinPython-projecten.
HetiseenhulpmiddelvoorhetmakenenbeherenvangeïsoleerdePython-omgevingen.
Opdracht20
Devolgendecodeleestderegelsvaneentekstbestand.Watishetdatatypevandevariabele tekst? with instructie_info.open(mode='r') as tekstbestand: tekst = tekstbestand.readlines()
182
tuple
string list
dictionary
3.8 Praktijkopdrachten
Inleidingpraktijkopdracht bron
Voordezepraktijkopdrachtgaanweeensituatieschetsenwaarinallekennisvandevoorgaandetheoriemoet wordengebruikt.
OmdepraktijkopdrachtentekunnenuitvoerenhebbenweeenExcelbestand(Sales_kwartaal2.xlsx)nodigwaarmee wegaanwerken.Ziedebijlage.
DownloaddebijlageinBoomDigitaal.
Wegaanineenaantaleenvoudigestappenselectiefinformatieuitdefictieveverkoopcijferslezenenverder verwerken.Daarbijmakenwenieuwebestandenaanmetelkhunspecifiekeinformatie.
Opdracht21 Selecterendata
Elkkwartaalkrijgenwedata,zoalsdieinhetExcelbestandindebijlage.Omtewerkenmetdeverkoopcijfers moetenweeerstdedataopschonenenpresenterenineengoedbruikbaarformaat.Hiervoormoetenweeen aantalstappenzetten.Indezeopdrachtgaanwedatdoen.
TAALREDACTIE)
CONCEPT
HetExcelbestandindebijlageheeftgeenheader.Hiernazijndetitelsvandeverschillendekolommeninde correctevolgordeineenstringgegeven.
header = "Date,State,Category,Dollars,Unit sales,Volume sales,Dollars last year,Unit sales last year,Volume sales last year,Dollars 3 years ago,Unit sales 3 years ago,Volume sales 3 years ago,Percent change dollars 1 year,Percent change units 1 year,Percent change volume 1 year,Percent change dollars 3 years,Percent change units 3 years,Percent change volume 3 years"
Stap1: MaakeennieuwExcelbestandwaarindeheaderalseersteregelinhetbestandstaat.Geefdeheadereenander lettertypeeneenanderegrootteenkleur.HetExcelbestandkrijgtdenaam Sales_kwartaal2_stap1.xlsx Kopieeralledatauithetbron-Excelbestandnaarhetdoel-Excelbestandtotenmetdekolom "Volume sales 3 years ago".
(ZONDERBEELD-EN
183 Blok3 Bestanden
Opdracht22 Opschonendata
WehebbeneenExcelbestandmetfictieveverkoopcijfers.DitiseenselectievaneengroterExcelbestand.We hebbendezevoorzienvaneenheader.
InhetExcelbestandstaandeprijzenallemaalinAmerikaansedollars.Dezehebbenpuntenindegetalleneneen $-tekenvoorhetgetal.Omlatereventueeltekunnenrekenenmetdewaardenwiljedezenotatieniet.Floating pointsinPythonhebbenslechtséénpunt.Omverwarringtevoorkomenmagjeaannemendatallegetallengehele getallenzijn.
Stap2
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
DoorloophetExcelbestandenverwijderalle$-tekensindekolommendiebedragenbevatten.Verwijdereveneens allepuntenuitdebedragen.SlahetaangepasteExcelbestandopals Sales_kwartaal2_stap2.xlsx
Opdracht23 Incorrectedataregistreren
WehebbeneenExcelbestandmetfictieveverkoopcijfers.DitiseenselectievaneengroterExcelbestand.Dit hebbenwevoorzienvaneenheaderenopgeschoondebedragen.
Stap3
InsommigekolommenstaatNA(NotAvailable).Opdezeplaatsenschrijfjeeen0enmaakjedecelrood.Ineen logbestandmetdenaamanalyse_sales_kwartaal2.logschrijfjehetregelnummervanhetExcelbestandwaarin jedeNAtegenkwam,gevolgddoordevolledigeregeluithetExcelbestandalscsv-bestand.
SlahetaangepasteExcelbestandopals Sales_kwartaal2_stap3.xlsx
3.9 Terugblik
Opdracht24 Terugblik
Zeteenkruisjeindekolomdievoorjouvantoepassingis.
Beoordelingscriteria
Jekunttekstbestandenlezenenschrijven.
Jekuntcsv-bestandenlezenenschrijven.
JekuntExcelbestandenlezenenschrijven.
Opdracht25 Terugblik
Denknaoverwatjehebtgedaaninditblok.
a. Noemtweedingenwaaroverjetevredenbent.
1.
2.
Nee Ja
184
b. Noemtweedingendiejedevolgendekeeranderswiltdoen.
1.
2.
c. Vraagjedocenten/ofleermeesteromfeedback.
Tops:
Tips:
3.10 Toets
Opdracht26
Hoemaakjeeen Path aanvooreenbestandgenaamd"adressen.txt"indemap"documenten"metbehulp van pathlib?
Path("documenten/adressen.txt")
pathlib.create("documenten/adressen.txt")
pathlib.Path("documenten/adressen.txt")
Path.create("documenten/adressen.txt")
Opdracht27
Hoecontroleerjeofeenbepaaldpadverwijstnaareendirectorymetpathlib?
Path.exists()
Path.is_dir()
Path.is_directory()
Path.is_folder()
Opdracht28
Hoeopenjeeentekstbestandgenaamd"data.txt"indeleesmodusmetbehulpvandewithstatementinPython?
with open("data.txt", "w") as file:
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
with open("data.txt", "read") as file:
with open("data.txt", "r") as file:
with open("data.txt", mode="r") as file:
185 Blok3 Bestanden
Opdracht29
Hoekunjeeencsv-bestandlezeninPython?
Metdecsv.reader()-functie.
Doorhetbestandteopenenmetderead()-functie.
Metdecsv.get_lines()-functie.
Doorhetbestandteopenenmetdecsv.read_lines()-functie.
Opdracht30
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Watdoetdedelimiterparameterbijhetlezenvaneencsv-bestandmetdecsv-moduleinPython?
Dezespecificeerthettekendatwordtgebruiktomhetcsv-bestandtescheiden.
Dezespecificeertdenaamvanhetcsv-bestand.
Dezespecificeertderijendiemoetenwordenovergeslagenbijhetlezenvanhetcsv-bestand.
Dezespecificeerthetaantalkolommeninhetcsv-bestand.
Opdracht31
Watiseenbelangrijkverschiltussenwerkenmettekstbestandenencsv-bestandeninPython?
Tekstbestandenkunnenalleenwordengelezen,terwijlcsv-bestandenkunnenwordengelezenéngeschreven.
Tekstbestandenbevattengegevensinplattetekst,terwijlcsv-bestandengegevensbevattendiezijngescheiden doorspecifiekedelimiters.
Csv-bestandenhebbeneenspecifiekestructuurmetgedefinieerdekolommen,tekstbestandenniet.
Tekstbestandenhebbendeextensie".txt",terwijlcsv-bestandendeextensie".csv"hebben.
Opdracht32
Watzijngebruikelijkedelimitersineencsv-bestand?Erzijnmeerdereantwoordengoed.
,{komma}
{spatie}
:{dubbelepunt}
;{puntkomma}
.{punt}
|{verticalelijn}
Opdracht33
WelkcodefragmentopenteenbestaandExcelbestandmetopenpyxl?
186
import openpyxl
werkboek = openpyxl.open('mijn_bestand.xlsx')
import openpyxl
werkboek = openpyxl.load_workbook('mijn_bestand.xlsx')
import openpyxl
werkboek = openpyxl.open_workbook('mijn_bestand.xlsx')
import openpyxl
TAALREDACTIE)
werkboek = openpyxl.open_worksheet('mijn_bestand.xlsx')
Opdracht34
HoekaneenExcelbestandwordenopgeslagennadatwijzigingenzijnaangebrachtmetopenpyxl?
werkboek.save()
CONCEPT (ZONDERBEELD-EN
werkbnoek.save('jaarcijfers.xlsx')
werkboek.save_workbook("jaarcijfers.xlsx")
save(werkboek)
Opdracht35
Hoekaneennieuwwerkboek(Excelbestand)wordengemaaktmetopenpyxl?
187 Blok3 Bestanden
Doorhetuitvoerenvannew_workbook().
Doorhetaanroepenvancreate_workbook().
DoorhetgebruikvanWorkbook().
DoorhetimporterenvaneenExcelsjabloon.
Opdracht36
Hoekunjeeenwaarde"42"toewijzenaancelA1ineenExcelwerkbladmetopenpyxl?Erzijnmeerdereantwoorden goed.
werkblad["A1"]=42
werkblad.cell("A1").value=42
werkblad["A1"].set_value(42)
werkblad["A1"].write_value(42)
werkblad.cell(row=1,column=1).value=42
Opdracht37
HoemaakjeeennieuwevirtueleomgevinginPyCharm?
GebruikdeterminalinPyCharmenvoerhetcommando"python3-mvenvmyenv"uit.
Klikmetderechtermuisknopophetprojectindeprojectstructuurenselecteer"New"envervolgens"Virtual Environment".
Ganaar"Tools"->"PythonInterpreter"enkiesvervolgensdeoptieomeennieuwvenvaantemaken.
Klikop"File"->"NewProject"enselecteervervolgensdeoptieomeennieuwvenvaantemaken.
Opdracht38
Hoekunjeeencelstijltoepassenopeenreekscellenineenwerkbladmetopenpyxl?
Dooreencelstijltoetepassenopdehelerij.
Dooreenstijltoetepassenopeenreekscellenmetbehulpvaneeniteratieoverdecellen.
Dooreencelstijltoetepassenopdehelekolom.
Doorelkecelafzonderlijkteformatteren.
Opdracht39
Watisdefunctievandeopenpyxl-bibliotheekinPython?
Excelbestandenmakenenbewerken.
EenSQL-databaseopzetten.
Afbeeldingenmanipuleren.
Complexewiskundigeberekeningenuitvoeren.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Opdracht40
WatisdePythonPackageIndex(PyPI)?
EenonlinerepositoryvoorhetdelenenbeherenvanPython-pakkettenen-modules.
Eengeïntegreerdeontwikkelomgeving(IDE)voorPython-programmering.
EenPython-bibliotheekvoorhetuitvoerenvannumeriekeberekeningen.
EenPython-frameworkvoorhetontwikkelenvanwebapplicaties.
188
Blok4
(ZONDERBEELD-EN TAALREDACTIE)
CONCEPT
HTTP-requests
HTTPstaatvoorHypertextTransferProtocolenisdemanieromophetinternettecommuniceren.Hiermee wordengegevensinhypertextverzondenenontvangen.HTTP-requestswordengebruiktominformatieopte vragenvanwebpagina's,serversenverschillendeonlinebronnen.Ditmechanismevormteenbelangrijkonderdeel vanhethuidigeinternet.
BijHTTPgaathetomeenstatelessprotocol.DitbetekentdatelkHTTP-verzoekenhetdaaropontvangenantwoord onafhankelijkzijnvaneventuelevoorgaandeverzoeken.DaarnaastisHTTPeenrequest-responseprotocol.Er wordenverzoekenverstuurdvanuiteeneenclientenerkomenreactiesvanafdeserver.Inditblokgaanweons bezighoudenmethetcommunicerenmetwebservicesdoorgebruiktemakenvandePythonbibliotheekrequests.
Leerdoelen
1. Jekunteenwebserviceaanroepen.
2. Jekuntdatavaneenwebservicelezen.
3. Jekuntdatanaareenwebservicesturenmetparameters.
Opdracht1
OriëntatieopdrachtHTTP-requests
Eenvandeeerstedingendiejehoogstwaarschijnlijkopjenieuwecomputerdeed,wasmetdebrowserhetinternet opgaan.Ofhetnuhetopenenvanjefavorietepaginawasofeenzoekopdrachtmeteenzoekmachinedatmaakt nietuit.JemaaktegebruikvanhetinternetviaHTTP.
a. WatvoorapparatencommunicerennogmeerviaHTTP?
Tip:denkaanapparatendiewebpagina'sopvragen.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
b. Geefeenaantalvoorbeeldenvanwebservices.
Tip:denkaandeverschillendeappsopbijvoorbeeldjetelefoon.
c. Bedenkeensituatiewaarinweeenbibliotheekalsrequestzoudengebruikenennietzelfeenaanroepnaar eenwebservicezoudenmaken.
Tip:denkaanomgaanmetdeverschillendevormenvaninformatiediemoetwordenmeegestuurd.
d. Watzijnanderbekendeprotocollendieveelophetinternetwordengebruikt?Erzijnmeerdereantwoorden goed.
FTP
POP3
RS-232
Profibus
SMTP
4.1 OpdrachtensetRequestsbibliotheek
Opdracht2 Requestsbibliotheek
RaadpleegzonodigdetheorieoverdeRequestsbibliotheek.
a. Watkunnenwemetderequestsbibliotheekdoen?
Websitesaanroepenentonen.
HTTPcommando'sversturen.
HTTP-verzoekenendeantwoordeneenvoudigverwerken.
HTTP-APIverzoekensturen.
b. WaaromzijnheadersbelangrijkinHTTP-requests?
Omdeinhoudvandebodyvanhetverzoektespecificeren.
Omaanvullendeinformatieoverhetverzoekteverstrekken,zoalshetaccepterenvanbepaaldecontenttypes.
Omdebronvanhetverzoekteidentificeren.
Omdegroottevanhetverzoektebeperken.
c. WatgeefteenHTTP-statuscodeaan?
190
DestatusvanhetHTTP-verzoekenderesponsevandeserver.
DegroottevandeHTTP-response.
Hettypewebserverdatwordtgebruikt.
Delocatievandeaangevraagdebronopdeserver.
d. SchrijfeenprogrammadateenHTTP-verzoekstuurtnaar http://www.google.com/ Indeheaderstaatde lengtevandecontent.Geefdezeineenvolzinweer.
e. SchrijfeenprogrammadateenHTTP-verzoekstuurtnaar http://www.microsoft.com/ ennaar http://www.google.com/ Geefinvolzinnenweerwathetverschilislengtevandecontent.Bijvoorbeeld: DecontentlengtevandeMicrosoftresponesis:x.DecontentlengtevandeGoogleresponseis:y.
4.2 OpdrachtensetQuotewebservice
Opdracht3 Quotewebservice
RaadpleegzonodigdetheorieoverQuotewebservice.
a. Welkeinformatiemoetmeestalwordenopgenomenindedocumentatievaneenwebservice?
Alleendenaamvandeontwikkelaarvandewebservice.
Eenlijstmetgrappigeweetjesoverdeontwikkelingvandewebservice.
Eenduidelijkebeschrijvingvandeendpoints,parameters,verzoekenenantwoorden.
Enkelenalleendetechnischespecificatiesvandeserver.
b. Watishetdoelvaneenreturnstatementineenfunctie?
Dezespecificeerthetaantalkerendatdefunctiewordtuitgevoerd.
Dezedefinieertdevariabelendiebinnendefunctiekunnenwordengebruikt.
Dezevoegtcommentaartoeaandefunctieomdeleesbaarheidteverbeteren. Dezebeëindigtdeuitvoeringvandefunctieengeeftdecontroleterugaandeaanroependecode.
c. WatishetdoelvaneendocstringinPython?
Dezegeefteennaamaaneenvariabele,zodatdezegemakkelijkkanwordengeïdentificeerdindecode.
DezebevatinstructiesvoordePython-interpreteroverhoedefunctiemoetwordenuitgevoerd.
Dezewordtgebruiktomongewensteoutputteonderdrukkentijdenshetuitvoerenvandecode.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Dezebevateenkortebeschrijvingvaneenfunctie,methode,klasseofmoduleomanderenteinformeren overhetdoelengebruikervan.
d. Vraagaandequotewebservice4quotesvanBillGatesovertijd.Geefdezequotesophetschermalsvolgt weer:
Thisisa.....
Auteur:BillGates
Oh,I...
AuteurBillGates
191 Blok4 HTTP-requests
4.3 OpdrachtensetCryptowebservice
Opdracht4 Cryptowebservice
RaadpleegzonodigdetheorieoverCryptowebservice.
a. Welkevandevolgendetechnologieënwordtvaakgebruiktalsbasisvoorcryptocurrency-webservices?
3D-printing
Blockchain
Cloudcomputing Machinelearning
b. Welkefactorvormteenuitdagingvoordeacceptatievancryptocurrency-webservicesdoorbedrijven?
Beperktebeveiligingsmaatregelen
Gebrekaanvertrouwenindigitalevaluta's
Hogematevanregelgevendezekerheid
Lagetransactiesnelheden
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
c. Welkaspectvancryptocurrency-webserviceswordtmeestalgebruiktomtransactiestussenpartijentevalideren envastteleggen?
Centraleautoriteiten
Gedistribueerdegrootboektechnologie
Kunstmatigeintelligentie-algoritmen
Traditionelebanknetwerken
d. WatisderolvanAPI-documentatiebijhetgebruikvanwebservices?
e. WatishetdoelvanAPI-versiesenwaaromzijnzebelangrijkvoorhetbeheervanwebservices?
4.4 TheorieHTTP-requests
Requests-bibliotheek
Derequests-bibliotheekvereenvoudigthetmakenvanHTTP-verzoekennaarwebserversenhetontvangenvan deantwoordenvandeservers.DoordeeenvoudigeAPI(ApplicationProgrammingInterface)kanjemet HTTP-aanroepenwerken,waaronderGET,POST,PUT,enzovoort.Derequests-bibliotheekheefthiervoormethoden omHTTP-actiesuittevoeren,bijvoorbeeldhetversturenvanHTTP-verzoekennaarwebservicesviaeenURL. Eventueelkanjeparametersofheadersmeegeven.Ookisdebibliotheekinstaatomomtegaanmetdeencoding vandeantwoordenvandeservers,hetdetecteterenvanfoutenendeomgangmethetdoorsturen(redirect).
192
Installerenvanderequestsbibliotheek
Voordatwederequests-bibliotheekgaaninstalleren,makenweeersteennieuwevirtualenvironmentaan,zodat onzeinstallatievanderequestsbibliotheekgeenandereinstallatiesindewegzit.Hoeditmoet,hebbenweal gezienBlok3Bestanden.
Nadatwedevirtualenvironmenthebbenaangemaakt,kunnenwederequestsbibliotheekinstalleren.De bibliotheekheetrequestsenkanviadePyCharmoptieswordengeinstalleerd.Hoeditinzijnwerkgaathebben weeerdergedaaninBlok3Bestanden.
Nahetinstallerenzijnermeerdereanderebibliothekenmeegeïnstalleerd.Ditzijnbibliothekendiede requests-bibliotheekopdeachtergrondgebruikt.
Testvanderequest-bibliotheek
Omdeinstallatietetesten,makenweeenkleintestprogramma.
import requests
resultaat = requests.get('https://www.google.com/')
print(resultaat)
print(type(resultaat))
TAALREDACTIE)
Alseersteimporterenwederequestsbibliotheek.Vervolgensgaanwemetderequestbibliotheeknaardeurl https://www.google.com/.
Derequestsbibliotheekgaatmetde get() functienaardegevraagdeurl.Dewebserverreageertmeteenresponse welkeaandevariabele resultaat wordttoegekend.
<Response [200]>
<class 'requests.models.Response'>
Wegevenhetresultaatweerophetschermenhierblijktstatuscode200intestaan.Hetdatatypevandevariabele resultaat iseen Response Hetdatatype Response bevatveelinformatie,waarwegebruikvankunnenmaken.
CONCEPT (ZONDERBEELD-EN
193 Blok4 HTTP-requests
Figuur 4.1
Statuscodes
CONCEPT (ZONDERBEELD-EN
TAALREDACTIE)
DestatuscodeiseenafgesprokencodeinhetHTTP-protocolenloopvan1xxtotenmet5xx.Bekendestatus codeszijn200requestwassuccesvol,404gevraagderesourcewasnietbereikbaaren500interneserverfout.
Destatuscodeshebbenperrangedevolgendebetekenis:
Tabel 4.1
Informatie 1xx
Succes 2xx
Redirect 3xx
Clienterror(jijhebtietsverkeerdgedaan) 4xx
Servererror(zijhebbeneenfoutgemaakt) 5xx
Perrangezijnerspecifiekenummersmeteenexactebetekenis.Opdewebsitevanonderstaandelinkstaatde uitgebreideweergavevanelkestatuscode.
Responseineenif-statement
Normaalgesprokenverwachtje,naeenHTTP-request,eenstatuscodeinde2xxreeks.Wantditbetekentdatde requestsuccesvolwas.
import requests
resultaat = requests.get('https://www.google.com/')
194
print(resultaat)
if resultaat:
print("Response OK")
else:
print("Response failed")
Wanneerwedevariabele resultaat ineenconditionalstatementzettendangeeftdeze True aanbijeenstatus codeindereeks1xx,2xx,3xx.
<Response [200]>
Response OK
Derequests-bibliotheekweetdatde4xxende5xxeenfoutsituatiebetekent.Ineenconditionalstatementzalde variabele resultaat meteenstatuscodevan4xxof5xx, False teruggeven.Deresponsezaldanook False zijn.
Headers
HeaderswordenmeegestuurdmethetHTTP-requestaandeserver.Deservergeefteenresponsewaarookweer eenheaderaanistoegevoegd.Debeidepartijen,clientenserver,gebruikendeheadersomtewetenhoezede ontvangeninformatiemoetenverwerken.
Meestalhebjedeinformatienietnodig,omdatjeeenHTTP-verzoekverstuurtmeteenbepaaldeintentie.Maar hetkanzijndatjegebruikwiltmakenvanbepaaldespecifiekezaken.Danweetjedatdeinformatieeris.Jekunt deinformatievandeheadervragenaan resultaat variabele,doormiddelvan resultaat.headers.
import requests
resultaat = requests.get('https://www.google.com/')
print(resultaat)
if resultaat:
print("Response OK")
print(resultaat.headers)
else:
print("Response failed")
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Deheaderdiejezietheeftheelveelkey-valuepairs.Nietalleinformatiehebjenodig.Debelangrijksteinformatie kunnenweaanrequestsvragen.Neembijvoorbeelddecontenttype,hierstaathetformaatvandedatain: HTML, JSON, PDF, etc.Inonsvoorbeeldisdit text/html.
<Response [200]>
Response OK
{'Date': 'Thu, 22 Feb 2024 02:13:40 GMT', 'Expires': '-1', 'Cache-Control': 'private, max-age=0', 'Content-Type': 'text/html; charset=ISO-8859-1',
195 Blok4 HTTP-requests
'Content-Security-Policy-Report-Only': "object-src 'none';base-uri 'self';script-src 'nonce-mGl4K29qJAc-GZ_nSCehGg' 'strict-dynamic' 'reportsample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp", 'Content-Encoding': 'gzip', 'Server': 'gws', 'Content-Length': '8229', 'X-XSS-Protection': '0', 'XFrame-Options': 'SAMEORIGIN', 'Set-Cookie': 'AEC=Ae3NU9O-7uJkAvoqqbmNUGKxcX8Luej3Liwpir05PspmbOeE9oFevtisno; expires=Tue, 20-Aug-2024 02:13:40 GMT; path=/; domain=.google.com; Secure; HttpOnly; SameSite=lax'}
(ZONDERBEELD-EN TAALREDACTIE)
Watopvaltisdathetdatatypevanheaderseendictionaryis.Datbetekentdatweallekennisdieweinmiddels bezittenvaneendictionarykunnentoepassen,zoalshetrechtstreeksvragenwelkeserverheeftgereageerd: headers['Server'] waarbijhetantwoord 'gws' is.
Responsetekst
DeresponsetekstisvaakHTML,zodateenapplicatiedezekanrenderen.Ofditleesbaretekstoplevert,hangtaf vanhet headers.Content-type Wanneerdit text/html is,isdetekstleesbaar.Bijwebpagina'sziejevrijwel altijd text/html.
Involgendetheoriebrongaanweeentoepassingmaken.
import requests
CONCEPT
resultaat = requests.get('http://www.google.com/')
print(resultaat)
if resultaat:
print("Response OK")
print(f"Content: {resultaat.headers['Content-type']}")
print(resultaat.text)
else:
print("Response failed")
AlswedebovenstaandecodeuitvoerenenhetHTTP-verzoekissuccesvol,danzienwedecontentvandeserver responseendeinhoudvandetekst.DeinhoudvandetekstiseenheleboelHTML.Ditiswatbrowsersgebruiken omdeHTML-paginaterenderen.Jezietdatjemakkelijkkuntcontrolerenwatdecontentvanderesponseisdoor ditaandeheadertevragen.Jekanhierdanopanticiperendoordetekstandersteformateren.
196
Quotewebservice
WehebbengezienhoewemetderequestsbibliotheekHTTP-verzoekenkunnenversturenenderesponsedaarop kunnenontvangen.DithebbenwegedaandoornaareenstandaardwebsiteeenHTTP-verzoektesturen.Standaard websiteszijnbedoeldommetmensentecommunicerenviadebrowser.WegaannudeHTTP-verzoekensturen naareenwebservicebedoeldomtecommunicerentussencomputersystemen.Oftewel,onzeapplicatie.
Wegaanaandehandvaneenwebservicediequoteskanleverenzienhoeweeen'echte'webservicemoeten aanroepen.Dewebserviceheeftvolgensdedocumentatieietsmeerdan75.000quotes.
Documentatie
Elkewebserviceheefteenvormvandocumentatie,waarinbeschrevenstaathoedeAPIvandewebservicemoet wordengebruikt.Welkeparameters,headers,etc.moetenwordenmeegegeven.Zonderdezeinformatieweten weniethoewedeAPIkunnenbenutten.DeinformatieoverdeAPIvindenwevaakopdewebsitevandemaker vandewebservices.Inonzesituatievindenwededocumentatievoordequoteswebserviceopgithub. Vanuitdedocumentatiezienwedatwequoteskunnenopvragendoordevolgendeurltegebruiken: url="https://quote-garden.onrender.com/api/v3/quotes".URLstaatvoorUniformResourceLocator. Ditiseenadresdatverwijstnaareenwebpagina,audiobestand,video,etc.Zo'nadresbestaatuitverschillende delen:
• Protocol:hoemoetdeurlwordenbenaderddoordewebbrowserofapplicatie.Ditkan http:// ofhttps://
• Hostnaam:eennaamzoalswedienuhebben quote-garden.onrender.com/api/v3/quotesofeen IP-adres:192.168.0.123
TAALREDACTIE)
• Poortnummer(optioneel):Hiermeegeefjeaanopwelkepoortdeservermoetluisteren.Wanneerjeniets opgeeft,danwordtdedefaultpoort 80 voorHTTPofpoort 443 voorhttpsgebruikt.
• Pad:geeftopdeserveraanwaarderesourcekanwordengevonden.Denkaan: /pagina1.html
• Querystring(optioneel):omparametersaandeurltoetevoegen.Ditgebeurtindevormvankey-valueparen gescheidendoorampersand,oftewelhet&-teken.Voorbeeldis ?leeftijd=37&naam=John
• Fragmentidentificator(optioneel):geefteenspecifiekesectieoflocatiebinnenderesourceaan.Hetbegint meteenhekje,bijvoorbeeld "#section1".
https://www.personen.nl/pagina1.html?leeftijd=37&naam=John#section1
DezeURLverwijstnaareenwebpaginagenaamd"pagina1.html"opdeserver"www.personen.nl",metde querystringparameters"leeftijd"en"naam",eneenfragmentidentificator"#section1".
Quotesopvragen
Wegaancommunicerenmeteenwebservicediequoteskanaanleveren.ViaeenPythonprogrammagaanwe communicerenmetdewebservicedoorgebruiktemakenvanHTTP-requests.Onderstaandeprogrammagebruiken weomquotesoptehalen.
CONCEPT (ZONDERBEELD-EN
import requests
url = "https://quote-garden.onrender.com/api/v3/quotes"
resultaat = requests.get(url)
if resultaat:
print("Response OK")
197 Blok4 HTTP-requests
print(resultaat.headers["Content-type"])
print(resultaat.text)
Wanneerwedituitvoeren,krijgenwequotesterugbijeensuccesvolleaanroep.Dequoteswordenteruggegeven ineen JSON formaat Ditkunnenwezienaande Content-type indeheaders.
JSONstaatvoorJavaScriptObjectNotation.Hetiseenlichtgewichtgegevensformaatdatgemakkelijkleesbaar isvoorzowelmensenalscomputers.WanneerwedeinformatieinJSON-vormgewoonophetschermtonendan krijgenwedezelastigeweergave,omdatPythonhetbeschouwdalseenstring.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Omdedataleesbaardertemaken,gaanwegebruikmakenvaneenJSON-module.Metdemodulekunnenwede datanetterpresenteren.
import requests
import json
url = "https://quote-garden.onrender.com/api/v3/quotes"
resultaat = requests.get(url)
if resultaat:
print("Response OK")
print(resultaat.headers["Content-type"])
data = json.dumps(resultaat.json(), sort_keys=True, indent=4)
print(data)
Wehebbennude json.dumps() functietoegevoegd.Hieraangevenwede json() vanhetresultaatmee.We warengewendomhet text deeloptevragenvan resultaat alswededatawildehebben.
HetresultaatvanhetopvragenvanhetJSON-deelvanhetresultaat,geefteenveelgestructureerdeoutput. DaardoorwordtdeinformatieindeJSONveelleesbaarderweergegeven.Omdatweditvakernodighebben, makenweereenapartefunctievan.
Functies
Functieszijnessentieelinprogrammerenomdatzecodemodulariserenenherbruikbaarheidbevorderen.Door codeinfunctiesteorganiseren,kunnenwecomplexeproblemenopsplitseninkleinere,beheersbarestukken. Functiesstellenonsinstaatomdezelfdefunctionaliteitherhaaldelijktegebruikenzonderdezetelkensopnieuw tehoevenschrijven,waardoorefficiëntieenconsistentieinonzeprogramma'swordenbevorderd.
Ditlossenweopdoorgemeenschappelijkestukkencodeinfunctiesteplaatsen,welkewedanmeerderekeren kunnenaanroepenvanafverschillendeplaatseninonzecode.Ditbevorderthethergebruikvanonzecode.En daarmeereducerenwedekansopfouten.
Eenandereredenwaaromwefunctieswillengebruiken,isvoordeleesbaarheidvandecode.Langestukkencode kunnenverwarrendzijnenhetmoeilijkmakenomfoutenoptesporen.Vaakbestaatzo'nstukcodeuitmeerdere functionaliteiten,waardoorhetopbrekeninfunctiesookgoedmogelijkis.
198
Functie definitie
Eenfunctiedefinitiebegintmethetkeyword def,gevolgddoordenaamvandefunctie,rondehaakjesen :
def json_print():
Bijdenaamvandefunctiehoudenweookweerderegelsenconventiesvoornameninacht.Opdevolgenderegel moetenweinspringen,ditishetbeginvaneencodeblokzoalswehebbengezienbijde if, for en while.Wanneer eenfunctiegeenparameterskanontvangen,danstaaternietstussenderondehaakjes.Kaneenfunctiewel parametersontvangen,danstaandeparameterskommagescheidenhiertussen.Devolgendecodeheefteen functiezonderparameters.
def toon_instructies():
print("Welkom bij onze applicatie.")
print("Volg de onderstaande instructies om verder te gaan:")
print("1. Klik op de knop 'Start' om de applicatie te starten.")
print("2. Volg de stappen op het scherm.")
print("3. Zorg ervoor dat je de benodigde gegevens bij de hand hebt.")
# Aanroep van de functie toon_instructies()
Opdelaatsteregelziejehoeeenfunctiewordtaangeroepen.Denaamvandefunctieplusderondehaken.De rondehakenwordenookgebruiktalsdefunctiegeenparametersheeft. Functieszonderparameterskomenregelmatigvoor.Hetzijnoverhetalgemeenfunctiesdieeeneind-actie realiseren.Denkaanhetinformerenvandegebruiker,hetsluitenvaneenresource,hetloggenvanresultaaten, etc.
Hiernavolgtnogeenvoorbeeldvaneenfunctiezonderparameters,echterwelmeteenreturnwaarde.Eenreturn waardeisdewaardedieterugwordtgegevenaandegenediedefunctieaanriep.Hetdatatypevandedatadie wordtterugegevenwordtdoordefunctiebepaald.Indevolgendefunctieisdithetdatatypestring.Defunctie heeftalsdoeldeactueletijdoptevragenendezeopeenspecialemanierteformateren.
import datetime
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
def actuele_tijd():
huidige_tijd = datetime.datetime.now()
tijd = f"{huidige_tijd.hour} uur en"
if huidige_tijd.minute != 1:
tijd = f"{tijd} {huidige_tijd.minute} minuten"
else:
199 Blok4 HTTP-requests
tijd = f"{tijd}
{huidige_tijd.minute} minuut"
return tijd
print(actuele_tijd())
Watditsoortfunctiesvaakdoen,zijnconversiesvanformatenofhetuitvoerenvanbepaaldeberekeningen.In ditvoorbeeldginghetomeenconversievaneenformaat.Ditnieuweformaatwordtteruggeven.
Wekunnenalsresultaatvaneenfunctiewaardenterugleveren.WanneerwenietsterugleverendanzalPython standaarddewaarde None teruggeven.InonsvoorbeeldkunnenwedefunctiehetJSONformaatcorrectlaten weergeven.
Parameters van functies
CONCEPT (ZONDERBEELD-EN
TAALREDACTIE)
EenfunctieinPythonkanparametersontvangeneneenresultaatteruggeven.Metdeparametersdieweaaneen functiemeekunnengeven,kunnenwehetresultaatvandefunctiebeïnvloeden.Hierdoorkunnenwebijvoorbeeld doordefunctieeennieuweGPS-coördinaatvaneenlocatielatenberekenen.Metbehulpvaneenfunctiekunnen wedezeéénkeertikkenenvoormeerderelocatiesdeberekeninguitvoeren.Onderstaandeenfunctiemet parameters,maarzonderreturnwaarde.
def print_product_info(product_naam, prijs, beschrijving):
print("Productnaam:", product_naam)
print("Prijs:", prijs)
print("Beschrijving:", beschrijving)
apparaten = [
("Laptop", 999, "15-inch scherm, 8 GB RAM, 512 GB SSD"), ("Smartphone", 699, "6.5-inch display, 128 GB storage, dual camera"), ("Tablet", 399, "10-inch display, 64 GB storage, quad-core processor") ]
for apparaat in apparaten:
print_product_info(apparaat[0], apparaat[1], apparaat[2])
print()
Functiesmetparameterszonderdatereenreturnwaardewordtteruggegevenwordenvaakgebruiktvoor dynamischeoverzichten,denkaanstatusupdates,rapportages,etc.Defunctiekannamelijkeenvoudigmeerdere kerenwordenaangeroepenmetandereparameters.Ziedefor-loopindelaatstedrieregels.
def bereken_btw(bedrag, btw_percentage): btw_bedrag = bedrag * btw_percentage
200
return btw_bedrag
print(f"bereken_btw(100, 0.21)
Functiesmetparameters,waarbijerookeenreturnwaardewordtgegevenkomenhetmeestevoor.Zevervullen takenalsberekeningenopbasisvandeparametersenlevereneenresultaatterug.
Metfunctiesisnogveelmeermogelijk,maardatzijngeavanceerdefunctionaliteiten.Daarwaarwedeze geavanceerdefunctionaliteitennuttigkunnentoepasseninonzeapplicatie,wordenzeuitgelegd.
Naamgeving
Naamgevingvanfunctiesismisschiennogbelangrijkerdandenaamgevingvanvariabelenofconstanten.Dit heeftermeetemakendateenfunctieeenactieuitvoert.Opeencode-regelwiljedatditleestalseenzin.Hetis somsbestlastigomeengoedenaamteverzinnen.Gebruikdanhetbestewatopdatmomentinjeopkomt, implementeerdefunctieenophetmomentdatjedefunctiegaatgebruiken,ziejeofde‘zin’looptofniet.Hetis somsooklastigomeennaamvooreenfunctieteverzinnenalsdefunctieteveelrealiseert.Eenfunctiedieteveel realiseert,iseenzogenaamde‘codesmell’,codediestinkt.Vooronsalsontwikkelaarsisditeentekendatwenog eensnamoetendenkenoverwatwepreciesmetdefunctiewillendoen.Breekdefunctieopinmeerderekleine functiesdiespecifiekerzijn.
Documentatie strings
TAALREDACTIE)
Documentatiestrings,ookweldocstringsgenoemd,zijnervooromdeverschillendedelenvanjeprogrammate documenteren.WanneerjehiergoedgebruikvanmaaktdankanjemetdePython help() functieofmetspeciale toolsautomatischdocumentatielatengenereren.
Docstringswordengebruiktommodules,functies,klassenenmethodentevoorzienvaneenbeschrijving.Hetis nooitdebedoelingomdenaamvandemodule,functie,klasofmethodeteherhalenofinpsuedocodede implementatietebeschrijven.
Bijeenmodulebeschrijfjehetdoelvandemodule.Opdezelfderegelalsdeopeningsaanhalingstekens,schrijf jeineenzinhetdoelvandemodule.Slaeenregeloverenbeschrijfuitgebreiderwathetdoelvandemoduleis. Zorgvooreenlegeregel,gevolgddoordedriedubbeleaanhalingstekensomdedocstringaftesluiten.
""" Doel van de module in 1 zin
CONCEPT (ZONDERBEELD-EN
Deze module zorgt voor de interactie met het databestand. Alle acties op het databestand moeten via deze module lopen.
"""
Bijeenfunctieschrijfjehetdoelvaneenfunctieopdezelfderegelalsdedriedubbeleopeningsaanhalingstekens. Naeenlegeregelbeschrijfjeuitgebreiddewerkingvandefunctie.Alsdefunctieparametersheeft,geefdezedan openbeschrijfwatzebetekenen.Gebruikhiervoor :param <naam van de parameter>: omderegelte beginnen.Daarmeewordtgelijkduidelijkwatervandeparameterswordtverwacht.
Alsdefunctieeenreturnwaardeheeft,beginderegeldanmet :return: enbeschrijfwaterwordtteruggeleverd.
201 Blok4 HTTP-requests
def
stel_naam_samen(voornaam, achternaam):
""" Naam samenstellen.
Deze functie levert een volledige naam terug als string.
:param voornaam: De voornaam van de persoon.
:param achternaam: De achternaam/familienaam van de persoon.
:return: Samengestelde string bestaande uit voornaam en achternaam.
"""
volledige_naam = f"{voornaam} {achternaam}"
return volledige_naam
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Wezienalleelementenindezefunctieterug.Denaamvandefunctie,parameters,docstringmetparameter beschrijvingenreturnwaarde.DitkunnenweooktoepassenopdeJSON-funciedienodigisvoorhetnetter weergevenvandewebserviceresponse.
Functiejson_print()
OmdeJSON-databeterweertegevenmakenwedefunctiejson_print().
def
json_print(json_data):
""" JSON data netter weergeven.
:param json_data: De JSON die moet worden weergegeven.
:return: None
"""
data = json.dumps(json_data, sort_keys=True, indent=4) print(data)
Wekunnennudequotesopnieuwaanvragenenviaonzefunctiejson_print()latenweergeven.
import requests
import json
def
json_print(json_data):
""" JSON data netter weergeven.
202
:param json_data: De JSON die moet worden weergegeven.
:return: None
"""
data = json.dumps(json_data, sort_keys=True, indent=4) print(data)
url = "https://quote-garden.onrender.com/api/v3/quotes" resultaat = requests.get(url) if resultaat:
print("Response OK")
print(resultaat.headers["Content-type"])
json_print(resultaat.json())
Dequoteswebserviceheeftnogmogelijkhedenomallegenresoptevragen.Ditkandoordeurlteveranderen naar url = "https://quote-garden.onrender.com/api/v3/genres"
Opdezelfdemanierkunnenookdeauteurswordenopgevraagdmetdeurl:url = "https://quote-garden.onrender.com/api/v3/authors"
Parametersvanwebservices
Dewebserviceheeftookdemogelijkheidommetparametersdeverkregenquotestesturen.Wekunnenselecteren watvoorquoteswewillenhebbendoordejuisteparametersdoortegeven.
Parameterskondenwedoorgevendooreen? achterdeurlteplaatsenenvervolgensalseenkey-valuepaarde waardedoortegeven.Stelwewillentijdindequoteshebbendanzouonskey-valuepaargenre=timeworden.
Deurlwordtdanalsvolgt: url = "https://quote-garden.onrender.com/api/v3/quotes?genre=time"
Doordithandmatigtedoenisdekansopfoutenbehoorlijkaanwezig.Eennetteremanierisomdeparameters optievanderequest-bibliotheektegebruiken.
import requests
import json
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
def json_print(json_data):
""" JSON data netter weergeven.
:param json_data: De JSON die moet worden weergegeven.
:return: None
"""
data = json.dumps(json_data, sort_keys=True, indent=4)
203 Blok4 HTTP-requests
print(data)
url = "https://quote-garden.onrender.com/api/v3/quotes" parameters = {"genre": "time"} resultaat = requests.get(url, params=parameters) if resultaat:
print("Response OK")
print(resultaat.headers["Content-type"])
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
json_print(resultaat.json())
Cryptowebservice
Crypto'szijndigitalevaluta,hetdigitalegeldophetinternet.Metdigitaalgeldkunnenerzondertussenkomst vaneenbankbetalingenwordenverricht.Doordeenormeprijsschommelingenwordendemeestecrypto'sniet gebruiktvoorbetalingen,maaralsbeleggingen.Risicovollebeleggingen.Dekoersenschommelenbehoorlijk.Het nauwgezetvolgenisnoodzakelijkalsjecrypto'salsbelegginghebt.
Wegaanmetbehulpvanwebservicesdeactuelestandvancryptomuntenopvragen.Ditdoenweaandehand vandedocumentatievandewebservice
https://github.com/fawazahmed0/exchange-api/blob/main/README.md.
Overzicht
Wanneerwedezewebservicegebruiken,danvaltopdatweverschillendesoorteninformatieopkunnenvragen doordeurlaantepassen.Alseerstegaanwekijkenofwedewebserviceaankunnenroepen.
import requests
url = "https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1"
resultaat = requests.get(f"{url}/currencies.json")
if resultaat:
print(resultaat.status_code)
data = resultaat.json()
print(data)
print(f"Aantal cryptomunten: {len(data)}")
WeimporterenderequestsbibliotheekzodatweHTTP-verzoekenkunnenuitvoeren.Deurlnaardewebservice wordtaandevariabele url toegekend.VervolgensmakenweeenHTTP-verzoeknaardeurl.
204
VolgensdedocumentatiekrijgenweeenJSONalsresponseterug,vandaardatwebijeensuccesvolHTTP-verzoek eenJSON-resultaatopvragen.Alsresultaathebbenweeenheleboelcryptomuntengekregen.Nuisde JSON-structuurvanzoveelcryptomuntenlastigtelezen.HetJSON-formaatisvrijwelgelijkaaneenPython dictionary.Wekunnendedatadusalseendictionarybenaderen.
Hetaantalcryptomuntenisdusdanigdatditnooitmooiinbeeldpast.Wemakendriekolommenwaarbijde cryptomuntenwordenweergevenophetscherm.Dedatabestaatuitkey-valuepairszoalsineendictionary.Door langsalleelementenindedatatelopen,kunnenwedekey(deafkortingvandecryptomunt)endevalue(de uitgebreidenaamvandecryptomunt)inkolommenophetschermweergeven.
import requests
url = "https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1" resultaat = requests.get(f"{url}/currencies.json") if resultaat:
print(resultaat.status_code)
data = resultaat.json()
print(data)
print(f"Aantal cryptomunten: {len(data)}")
regel = ""
count = 0 for key, value in data.items(): if count >= 4:
print(regel)
regel = ""
count = 0
regel = f"{regel}{key:<15}:{value:<35}{" ":4}"
count += 1
Doorstringformatteringtegebruikenvoorvastekolombreedteskrijgenwestrakkekolommen.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Koersen
Nuwegezienhebbenwelkecryptomuntenerzijn,kunnenwedekoersenopvragen.Wevragenalseerstede koersenvanallecryptomunten,waarbijdeeurodereferentieis.Omdatweweermeteengrotehoeveelheid cryptocoinstemakenhebben,gaanweeenfunctiemakenvandecodewaarwedekolommenmeeophetscherm toonden.Daardoorkunnenwedaarsteedsgebruikvanmaken.
def kolommen_weergave(data):
""" Geeft de data weer in 4 kolommen
205 Blok4 HTTP-requests
:param data: De data voor de kolommen (dictionary)
:return: None
"""
regel = ""
count = 0
for key, value in data.items():
if count >= 4:
print(regel)
regel = ""
count = 0
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
regel = f"{regel}{key:<15}:{value:<35}{" ":4}"
count += 1
Defunctiekunnenwenugebruikenalswededatainkolommenwillentonen.Numoetenwedekoersenophalen.
Deinformatiedieweopvragen,moetouderzijndan24uurenjongerdan6maanden.Alsweeenperiodetevroeg opvragenofouderdan6maanden,krijgenwestatuscode404(informatienietbeschikbaar).
Voorhetgemaknemenwedantweedagenterug.
import requests
import datetime
def kolommen_weergave(data):
""" Geeft de data weer in 4 kolommen
:param data: De data voor de kolommen (dictionary)
:return: None
"""
regel = ""
count = 0
for key, value in data.items():
if count >= 4:
print(regel)
regel = ""
count = 0
regel = f"{regel}{key:<15}:{value:<35}{" ":4}"
206
count += 1
datum = datetime.datetime.now().date() - datetime.timedelta(days=2) datum_koersen = f"{datum.year}-{datum.month:02}-{datum.day:02}"
base_url = "https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/eur.json" url = base_url.replace("latest", datum_koersen)
resultaat = requests.get(url)
if resultaat:
print(resultaat.json())
print()
kolommen_weergave(resultaat.json()["eur"])
else:
print(f"Foutcode: {resultaat.status_code}")
Weimporterennaastderequestsbibliotheekookdedatetimebibliotheek.Wegaandeurlvoorzienvaneendatum vanwanneerwijdekoersenwillenzien.Hiervoormoetenwededatumkunnenbewerken.
Onzefunctiehebbenweerookstaanomdedatainkolommenweertegeven.Vervolgensgaanwedeactuele datumophalen.Ziedaarvoor datetime.datetime.now().date().De datetime bibliotheekheefteen datetime functionaliteitwaaraanwe now() kunnenvragen.Wekrijgendandedatum/tijdvandatmoment.Maaromdat wealleengeïnteresseerdzijnindedatum,vragenweexplicietdedatummet date()
Wewillendeinformatieophalenvantweedagengeledenendatdoenwedoornaarvandaagtekijkenendaar tweedagenvanaftetrekkenmet datetime.timedelta(days=2).Dedatumdiewenuhebbenverkregen,moet ineenstringwordengezet,waarbijdemaandendagtweedigitsmoetenhebben.Wedoendatdoordestringte formateren,met {datum.month:02}.Wezeggendan,vandedatumwillenwedemaandhebbenendezemoet wordengeformateerdmettweeposities.Alsdezeéénpositieinbeslagneemtdanplaatsjeeen '0' alsvoorloopcijfer. Hetzelfdedoenwebijdedag.
Numoetenwededatumwaaropwedekoersenwillenhebbennogintegrerenindeurlopeenmanierzoalsdie doordedocumentatiewordtvoorgeschreven.Daarvoorkunnenwedestring replace() functiegebruiken, waarbijweaangevenwelketekenreekswewillenvervangen.Inonzesituatieisdit 'latest',vervangendoorde niewsamengesteldedatum.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Deresthebbenwealeerdergezien.WestarteneenHTTP-verzoek,bekijkenhetresultaatenindienpositief,gaan wedekolommenophetschermweergeven.
207 Blok4 HTTP-requests
Webservicesineenherhalingslus
Wanneerjewebservicesineenherhalingslusgaataanroepen,hebjesomstemakenmetmaximaleaantalcalls perminuut.Ditvaltnietaltijdop,maarherhalingslusvraagtsomspermillisecondenieuwerequests.Ditiseen enormebelastingvoorzo'nserver.Deserverkanjedanblokkeren,omdathetlijktopeencyberaanvalgenaamd
DDOS(DistributedDenialOfService).
Jevoorkomtditdooreenkleinesleepteintroducerenvoordatjedevolgenderequestuitvoert.
import time
import requests
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
base_url = "https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/eur.json"
for aantal_keer in range(20):
resultaat = requests.get(url)
if resultaat:
print(resultaat.json()) time.sleep(0.1)
Inditvoorbeeldwordendekoersen20keeropgehaald.Zonderde time.sleep() functieopheteindezouden derequestinluttelemillisecondenopdewebservicewordenafgevuurd.Doorde time.sleep() functiewordt nu0.1secondegewachtopdevolgendeaanroep.
4.5 Begrippen
4.6 Testjekennis
Opdracht5
WatishethoofddoelvandeRequestslibrary?
HetverbeterenvandeprestatiesvanPython-toepassingen
HetoptimaliserenvandatabasesbinnenPython-programma's
HetbeveiligenvannetwerkverbindingenbinnenPython-toepassingen
Hetautomatiserenvaninteractiesmetweb-API'sen-services
Opdracht6
WelkeHTTP-statuscodewordttypischgebruiktomaantegevendateenverzoekmetsuccesisvoltooid?
200OK
300MultipleChoices
400BadRequest
500InternalServerError
Opdracht7
WatbetekentdeHTTP-statuscode"404NotFound"?
208
Declientheefteenongeldigverzoekingediend.
Deaangevraagdebronkonnietwordengevondenopdeserver.
Deserverheefthetverzoekcorrectontvangen,maarkanhetnietverwerken.
Hetverzoekisomveiligheidsredenengeblokkeerddoordeserver.
Opdracht8
WatiseenbelangrijkefunctievanheadersinHTTP-requests?
Zebepalendegroottevanhetverzoek.
Zevoorkomendatdeserverhetverzoekkanverwerken.
Zedragenmetadataover,zoalsauthenticatie-informatieofcaching-voorkeuren.
Zedefiniërendehoofdstructuurvanhetverzoek.
Opdracht9
Watzijndevoordelenvanhethebbenvangoededocumentatievooreenwebservice?
Hetverhoogtdekostenvandewebservice.
Hetkanhelpenbijhetverminderenvandeondersteuningslastdoordatgebruikerszelfantwoordenkunnen vinden.
Hetzorgtervoordatdewebservicealleenkanwordengebruiktdoorprofessioneleontwikkelaars.
Hetbeperktdetoegangtotdewebservicetoteenselectegroepgebruikers.
Opdracht10
WatiseenfunctieinPython?
Eenstukcodedateenenkeletaakuitvoert.
Eenvariabelediealleenbinneneenbepaaldescopebeschikbaaris.
Eengegevenstypedatsequentiëlegegevensopslaat.
Eennumeriekewaardediedoordegebruikerwordtingevoerd.
Opdracht11
WatgebeurteralsjeeenfunctieaanroeptinPython?
DePython-interpretercrasht.
Decodebinnendefunctiewordtgenegeerd.
Defunctiewordtgedefinieerd.
Decodebinnendefunctiewordtuitgevoerdmetdeopgegevenargumenten.
Opdracht12
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Watiseendocumentatiestring(docstring)inPython?
EentekenreeksdiewordtgebruiktomopmerkingenbinneneenPython-scriptteplaatsen.
Eenstringdiewordtgeplaatstaanhetbeginvaneenmodule,functie,klasseofmethodeomeenbeschrijving
vanhetdoelenhetgebruikervantegeven.
EentypevariabeledatwordtgebruiktomteverwijzennaardocumentatiebestandeninPython-projecten.
Eenspeciaaltypetekenreeksdatwordtgebruiktomfoutmeldingeninhetprogrammavastteleggen.
Opdracht13
HoewordenparametersmeestaldoorgegevenineenGET-verzoekineenURL?
209 Blok4 HTTP-requests
AlseenJSON-objectindebodyvanhetverzoek.
AlseendeelvandeHTTP-headervanhetverzoek.
AlseendeelvandeURL,toegevoegdnaeenvraagteken(?)engescheidendoorampersands(&).
Alseenoptioneelargumentindefunctieoproepvanhetverzoek.
Opdracht14
Watisdatetime.datetime.now()inPython?
Hetgeeftdehuidigedatumentijdweeralseendatetimeobject.
Hetgeeftdehuidigedatumweerineenleesbaarformaat.
Hetgeeftdehuidigetijdzoneweeralseengetal.
Hetgeeftdehuidigetijdweeralseeninteger.
Opdracht15
Watgebeurteralsjedatetime.datetime.now()meerderekerenuitvoertbinnendezelfdeseconde?
Jekrijgteenfoutmeldingomdatdefunctienietmeerderekerenbinnendezelfdesecondekanworden uitgevoerd.
Jekrijgttelkenseenwillekeurigewaardeterug.
Hetprogrammacrasht.
Jekrijgtaltijddezelfdewaardeterug.
Opdracht16
WatisJSON?
Eenopmaaktaalvoorhetdefiniërenvandestructuurvaneenwebpagina.
Eenlichtgewichtgegevensuitwisselingsformaatdatveelwordtgebruiktinwebontwikkeling.
Eendatabasebeheersysteemvoorgestructureerdegegevens.
Eenprogrammeertaalvoorhetbouwenvanwebapplicaties.
Opdracht17
HoewordengegevensinJSONgeorganiseerd?
Alseenhiërarchievankey-valuepairsmetobjectenenarrays.
Alseenlijstvannullenenenen.
Alseenreekswillekeuriggerangschiktewaarden.
AlseenHTML-documentmetverschillendetags.
Opdracht18
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Welkvandevolgendeformatenwordtvaakgebruiktvoorhetuitwisselenvangegevenstusseneenwebservice eneenclient?
JSON
MP3
PNG
PDF
Opdracht19
Welkprotocolwordtvaakgebruiktvoorcommunicatiemetwebservices?
210
XML
HTML
HTTP
4.7 Praktijkopdrachten
Inleidingpraktijkopdracht
Voordepraktijkopdrachtengaanweeensituatieschetsenwaarbijallekennisvandevoorgaandetheoriemoet wordengebruikt.Breekeenprobleemaltijdopinkleinerestukken.Testdezestukkenenvoegdezeuiteindelijk bijelkaar.ZekermethetaanroepenvaneenAPIishetvaakexperimenterenwatjepreciesvoordataterugkrijgt.
Opdracht20 Quotestatistiek
Deresponsevandequotegeeftnaastdequoteveelextrainformatie.Omdaareniginzichtinteverkrijgengaan wenaardeverschillendegegevenskijken.Wegaandaarvoorkijkennaardeverschillendegenresenhetaantal quotesbeschikbaarindeverschillendegenres.Vervolgenskijkenwenaardepopulariteitvandeverschillende auteurs.
Wekunnendeverschillendegenresopvragendoordevolgendeurltegebruiken: url = "https://quote-garden.onrender.com/api/v3/genres"
Bepaalvanelkegenrehetaantalbeschikbarequotes.Geefdezeineentabelvormophetschermweer.Schrijfde tabelooknaareentekstbestandmetdenaam statistiek.txt
Genre Aantal quotes ===================================
age : 2610 alone : 999 ...
Wekunnendeverschillendeauteursopvragendoordevolgendeurltegebruiken: url = "https://quote-garden.onrender.com/api/v3/authors"
Bepaalvanelkeauteurhetaantalbeschikbarequotes.Geefdezeineentabelvormophetschermweer.Schrijf detabelnaarhetzelfdetekstbestandalsdestatistiekvandegenres.Zorgvooreenscheidingtussendebeide tabellenvaneenregelmet'='.
Auteur Aantal quotes
=================================== : 72672
A. A. Milne : 6
Delegeauteurregel,zijnquoteswaarvandeauteurnietkonwordenvastgesteld.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
CSS
211 Blok4 HTTP-requests
Opdracht21 Koersverloop
Van14achtereenvolgendedagenmoetendekoersenvandeonderstaandecryptomuntenwordenopgehaald. Destartdatumis21dagengeleden.
Hetgaatomdevolgendecryptomunten:btc,xrp,eth,bnb,sol,ada,usdt,dot,doge,avax.
DeverkregenkoersenslajeopineenExcel-bestandmetdenaam <start datum> crypto.xlsx Waarbij <start datum> wordtvervangendoordestartdatum.Daarnaastkrijgthettabbladookalsnaamdestartdatum.
Elkekolomiseencryptomuntenelkerijisdewaarde.Zieonderstaandvoorbeeld. datum btc xrp eth ...2024-01-12 0.00001 ...
(ZONDERBEELD-EN TAALREDACTIE)
Opdracht22 Astronauten
GegevenAPI "https://ll.thespacedevs.com/2.2.0/astronaut"
ViadezeAPIkanjeaangegevenskomenvanastronautenkomen.Beperkhetaantalresultatentot10astronauten doormiddelvanparameters.Parameter limit
Geefvanelkeastronaut:
• Zijn/haarnaam
• StatusActive,Retired,etc.
• Leeftijd
• Nationaliteit
• Agencywaarzevoorwerken
Sladezeinformatienetjesopineentekstbestandmetdenaam astronaut_data.txt Tussenelkeastronaut eenregelmet=tekensalsscheider.
4.8 Terugblik
CONCEPT
Opdracht23 Terugblik
Zeteenkruisjeindekolomdievoorjouvantoepassingis.
Beoordelingscriteria
Jekunteenwebserviceaanroepen.
Jekuntdatavaneenwebservicelezen.
Nee Ja
===================================== .... =====================================
212
Beoordelingscriteria
Jekuntdatanaareenwebservicesturenmetparameters.
Opdracht24 Terugblik
Denknaoverwatjehebtgedaaninditblok.
a. Noemtweedingenwaaroverjetevredenbent.
1.
2.
b. Noemtweedingendiejedevolgendekeeranderswiltdoen.
1.
2.
c. Vraagjedocenten/ofleermeesteromfeedback.
Tops:
Tips:
4.9 Toets
Opdracht25
WatisdeRequestslibraryinPython?
Eenbibliothekenverzamelingvoorhetmakenvangrafiekenendiagrammen
Eenbibliotheekvoorhetschrijvenvangeautomatiseerdetestsvoorwebapplicaties
Eenbibliotheekvoorhetmakenvangeanimeerdegrafischegebruikersinterfaces
EenbibliotheekvoorhetuitvoerenvanHTTP-verzoekenvanuitPython
Opdracht26
WatiseenbelangrijkkenmerkvandeRequestslibrary?
Hetisuitsluitendontworpenvoorhetverzendenvane-mails
Nee Ja
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Hetvereistgeenextrainstallatievanexterneafhankelijkheden
HetbiedtgeenondersteuningvoorFTP-verbindingen
HetisalleencompatibelmetdeoudereversiesvanPython
Opdracht27
WatbetekentdeHTTP-statuscode"503ServiceUnavailable"?
213 Blok4 HTTP-requests
Deserverkanhetverzoeknietverwerkenvanwegeeenongeldigeinvoer.
Deaangevraagdebronispermanentverplaatstnaareennieuwelocatie.
Deserveristijdelijknietbeschikbaarvanwegeoverbelastingofonderhoud.
Hetverzoekisongeldigvanwegeeenontbrekendevereisteparameter.
Opdracht28
WatkunnenheadersineenHTTP-requestaangeven?
Hetbesturingssysteemvandeclient.
Degewensteresponsindeling,zoalsJSONofXML.
Delocatievandeserver.
Denaamvandeontwikkelaardiehetverzoekheeftverzonden.
Opdracht29
WaaromishetbelangrijkomheaderscorrectintestelleninHTTP-requests?
Omdatheadersdeinhoudvanhetverzoekvolledigspecificeren.
Omdatzedeenigemanierzijnomdeservertelatenwetenwatdeclientnodigheeft.
Omdatheaderskunnenwordengebruiktvoorbeveiligingsdoeleinden,zoalshetdoorgevenvan authenticatiegegevens.
Omdatzedeenigemanierzijnomdeservertelatenwetendathetverzoekisontvangen.
Opdracht30
Watkanergebeurenalseenwebservicenietgoedgedocumenteerdis?
Ontwikkelaarswordenbeloondmethogeresalarissen.
Gebruikerszullendewebservicenietbegrijpenenmogelijkverkeerdeverzoekensturen.
Dewebservicewordtautomatischgeoptimaliseerdvoorbetereprestaties
Dewebservicewordtonmiddellijkpopulairzonderdocumentatie
Opdracht31
HoedefinieerjeeenfunctieinPython?
Methettrefwoorddef
Methettrefwoorddefine
Methettrefwoordfunction
Methettrefwoordvar
Opdracht32
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Watisderolvanparametersineenfunctie?
Zestellenwaardenindiedoordefunctiekunnenwordengebruikttijdensdeuitvoering.
Zebepalendereturnwaardevandefunctie.
Zevertellendefunctiehoevaakdezemoetwordenuitgevoerd.
Zezijnoptioneelenhebbengeenspecifiekerol.
Opdracht33
WatishetbelangrijkstevoordeelvanhetgebruikvandocumentatiestringsinPython?
214
Hetzorgtervoordatdecodeautomatischwordtgedocumenteerdzonderdatdeontwikkelaarerietsvoor hoefttedoen.
Hetbiedteengestandaardiseerdemanieromanderenteinformerenoverhetdoelengebruikvandecode.
Hetmaaktdecodekorterendusgemakkelijkertebegrijpen.
Hetvermindertdeprestatiesvandecodeomdatdeinterpreterextrastappenmoetuitvoerenomde documentatieteverwerken.
Opdracht34
WatishetdoelvanparametersineenGET-verzoek?
Zespecificerendenaamvandeserverwaarophetverzoekmoetwordenuitgevoerd.
Zedefiniërenhettypegegevensdatwordtteruggestuurddoordeserver.
Zebepalenhettijdstipwaarophetverzoekmoetwordenuitgevoerd.
Zebevattenextrainformatiedienaardeserverwordtverzonden,zoalszoektermen,filtersofpaginanummers.
Opdracht35
Watishetformaatvanhetresultaatvandatetime.datetime.now()?
Eenbooleandieaangeeftofhetnudaglichtisofniet.
Eenintegerdiehetaantalsecondensindsdeepochrepresenteert.
Eendatetimeobjectdatdehuidigedatumentijdweergeeft.
Eenstringinhetformaat"uur:minuut:seconde"
Opdracht36
WatiseenbelangrijkvoordeelvanhetgebruikvanJSON?
Hetisbeperkttothetopslaanvanalleentekstgegevens.
Hetiseenvoudigtelezenenteschrijvenvoorzowelmensenalscomputers.
HetisminderefficiëntdananderegegevensformatenzoalsXML.
HetisalleencompatibelmetdeJavaScript-programmeertaal.
Opdracht37
HoewordengegevensinJSONgerepresenteerd?
Alseenreekskey-valuepairsindevormvanobjectenenarrays.
Alseengeformatteerdetabel.
Alsbinairegegevens.
Alsplattetekst
Opdracht38
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Watiseenvoordeelvanhetgebruikvaneenwebservice?
Hetmaaktinteroperabiliteitmogelijktussenverschillendeplatformsenprogrammeertalen.
Hetisbeperkttothetverzendenvantekstuelegegevens.
Hetvereistgeeninternetverbindingomtefunctioneren.
Hetisalleentoegankelijkvoorgebruikersbinnenhetzelfdenetwerk.
Opdracht39
Watiseenwebservice?
215 Blok4 HTTP-requests
Eenonlineplatformvoorhetdelenvanfoto'senvideo's.
Eenwebapplicatiediealleentoegankelijkisvoorinternebedrijfsdoeleinden.
Eenfysiekelocatiewaarproductenwordenverkocht.
Eenmethodevoorhetmogelijkmakenvancommunicatieengegevensuitwisselingtussenverschillende softwaretoepassingenviahetinternet.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
216
Blok5
Flask
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Flaskiseenmicro-webframeworkvoorhetbouwenvanwebapplicatiesinPython.MetFlaskzijnweinstaatom sneleenwebapplicatietekunnenbouwenzonderoverschotvanfunctiesdiewemisschiennietgaangebruiken.
Flaskbiedtdebasisfunctionaliteitdienodigisvoorhetontwikkelenvanwebapplicaties,zoalsrouting,request handlingentemplating.Daarnaastkanjehetframeworksteedsuitbreidenmetextrafunctionaliteit.Integenstelling totwebframeworksalseenDjango,wordtFlaskvaakgebruiktvoorhetontwikkelenvankleinetotmiddelgrote webapplicaties,API's,prototypenenproof-of-conceptprojectenvanwegezijneenvoudenflexibiliteit.Ookervaren ontwikkelaarsgebruikenFlaskvanwegedemogelijkheidomhetframeworkuittebreidenenaantepassenaan eigenwensenencomplexereprojecten.
Inditblokgaanweonsbezighoudenmethetmakenvanwebpagina'smetbehulpvanhetmicro-frameworkFlask.
Leerdoelen
1. JekunteenbasisFlaskwebpaginaaanmaken.
2. JekunteenstatischeFlaskwebpaginamaken.
3. JekunteendynamischeFlaskwebpaginamaken.
Opdracht1
OriëntatieopdrachtFlask
Jezalvaakophetinternetrondklikken,voorhobby,privézakenofvoorjeschoolofwerk.Inelkgevalkomjeop verschillendewebpagina's.Vooralookverschillendesoortenpagina's:statisch,metvastecontent,ofdynamische content,contentdiekanveranderen.Ookwordendewebpagina'sdoorverschillendesoortenserversgeleverd.
a. Zoekeenwebsitemetstatischecontent.Ineenbrowserkanjedesourcevaneenwebsitebekijken.Datisde broncodevandepagina.Webpagina'smetstatischecontenthebbendetekstvaakleesbaarindepagina, tussendebekendeHTML-tags.Welkewebsitehebjegevonden?
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
b. Zoekeenwebsitemetstatischecontent.Ineenbrowserkanjedesourcevaneenwebsitebekijken.Datisde broncodevandepagina.Webpagina'smetdynamischecontenthebbenvaakscripttags(<script></script>).
Welkewebsitehebjegevonden?
c. Welkevandevolgendeoptieszijnechtewebframeworks?Erzijnmeerderantwoordengoed.
jQuery
Express.js
Bootstrap
Flask
React
Django
5.1 OpdrachtensetFlask
Opdracht2 BasisFlask
RaadpleegzonodigdetheorieoverBasisFlask.
a. WatisdefunctievandevolgendeFlask-route?
@app.route('/')
def index():
return '<h1>Welkom op de startpagina</h1>'
Hetdefinieerteenroutevoorhetweergevenvandestartpaginavandewebsite.
HetdefinieerteenroutevoorhetverwerkenvaneenPOST-verzoeknaardehoofdmap.
HetdefinieerteenroutevoorhetomleidenvanverkeervanafdestartpaginanaareenandereURL.
Hetdefinieerteenroutevoorhetverwijderenvandeinhoudvandestartpagina.
b. WelktypegegevensretourneertderouteindevolgendeFlask-code?
218
@app.route('/about')
def about():
return '''
<h2>Over ons</h2>
<p>Welkom op onze over ons pagina.</p>
'''
JSON-data
XML-gegevens
HTML-string Tekstbestand
c. WatgebeurterwanneereenclienteenverzoekindientvoorderoutediedevolgendeFlask-codebevat?
@app.route('/contact')
def contact():
return 'Neem contact met ons op via e-mail: info@example.com'
DeclientontvangteenHTML-paginameteencontactformulier.
Declientwordtomgeleidnaareenanderewebsitevoorcontactgegevens.
DeclientontvangteenJSON-reactiemetcontactinformatie.
Declientontvangteeneenvoudigetekstreactiemetcontactinformatie.
d. Schrijfineentekstbestandeenwelkomstboodschap.Sladitbestandop.MaakeenFlask-applicatiewaarbij dewelkomstboodschapuithetbestandwordtgelezenenaandegebruikergetoond,zodradegebruikerop delocalhost-paginaopent.
e. MaakeeneenvoudigeHTML-pagina.Sladezeop.MaakvervolgenseenFlaskapplicatiediedezepaginalaat zienzodradegebruikeroplocalhostdepaginaopent.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
5.2 OpdrachtensetRouting
Opdracht3 Routing
RaadpleegzonodigdetheorieoverRouting.
a. WatdoetdevolgendeFlask-route?
219 Blok5 Flask
@app.route('/hello')
def hello():
return 'Hello, world!'
DiedefinieerteenroutevoorhetweergevenvaneenHTML-paginametdeboodschap"Hello,world!"
DiedefinieerteenroutevoorhetverwerkenvaneenPOST-verzoeknaarde'/hello'-endpoint.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Diedefinieerteenroutevoorhetomleidenvanverkeervanafdestartpaginanaarde'/hello'-endpoint.
Diedefinieerteenroutevoorhetverwijderenvandeinhoudvande'/hello'-endpoint.
b. WatisdefunctievandevolgendeFlask-route?
@app.route('/user/<username>')
Diedefinieerteenroutevoorhetweergevenvaneenlijstmetgebruikersindeapplicatie.
DiedefinieerteenroutevoorhetweergevenvaneenHTML-paginametinformatieovereenspecifieke gebruiker.
Diedefinieerteenroutevoorhetweergevenvanhetprofielvaneenspecifiekegebruikeropbasisvanhun gebruikersnaam.
DiedefinieerteenroutevoorhetverwerkenvaneenDELETE-verzoeknaarde'/user/<username>'-endpoint.
c. WatgebeurterwanneereenclienteenverzoekindientvoordevolgendeFlask-route?
@app.route('/about')
def about(): return 'Over ons'
Declientontvangteeneenvoudigetekstreactiemetdetekst"Overons".
DeclientwordtomgeleidnaareenandereURLvoormeerinformatieoverdeapplicatie.
DeclientontvangteenJSON-reactiemetinformatieoverdeapplicatie.
DeclientontvangteenHTML-paginametinformatieoverdeapplicatie.
d. BeschrijfhetprocesvanhetdefiniërenvaneennieuwerouteineenFlask-applicatie.Watzijndestappendie jemoetvolgenenwelkeelementenzijnbetrokkenbijhetmakenvaneennieuweroute?
220
5.3 OpdrachtensetJinja
Opdracht4 Jinja
RaadpleegzonodigdetheorieoverJinja.
a. WatisderolvanJinjaineenFlask-applicatie?
Hetiseendatabase-enginevoorhetopslaanvangegevens.
Hetiseennetwerkprotocolvoorhetverzendenvangegevenstussenclientenserver.
HetiseenAPIvoorhetmakenvanHTTP-verzoekennaarexterneservers.
HetiseenHTML-renderingenginevoorhetdynamischgenererenvanwebpagina's.
b. WelkevandevolgendetagsinJinjawordtgebruiktvoorhetweergevenvanvariabelewaardenineen HTML-sjabloon? {{}} {%%} {##} {!!}
c. OpwelkemanierwordteenJinja-sjabloongeassocieerdmeteenFlask-route?
Doorderoutetedecorerenmet@app.route('/template')envervolgensdeHTML-codeintesluitentussen {%%}tags.
DoordeHTML-sjabloonopteslaanalseenapartbestandendezeterenderenbinnenderoutemetbehulp vanderender_templatefunctie.
Doorderoutetedecorerenmet@app.route('/template')envervolgensdeHTML-codeintesluitentussen {{}}tags.
DoordeHTML-sjabloonintesluitenineenPython-stringbinnenderoutefunctiezelf.
d. MaakeenFlask-applicatiewaarbijjeeenvariabeledoorgeeftaaneenJinja-sjabloonendezeweergeeftopeen HTML-pagina.Devariabelekanbijvoorbeeldeenwelkomstberichtzijn.Zorgervoordathetsjabloondevariabele correctrendertindeHTML-pagina.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
5.4 TheorieFlask BasisFlask
WerkenmetFlaskverschiltvanwatwetotnutoehebbengedaan.Wegaanveelaanhetmicro-frameworkoverlaten. Zozullenwebepaaldezakenopeenspecifiekemaniermoetenopschrijvenenmoetendefolderstructurenexact wordenopgezet.Ditkanmisschienalsbeperkendaanvoelen,maarhetbiedtookveelvoordelen.Hetvereistwel datwenauwkeurigtewerkgaan,vooralomdathetinhetbeginwatonwennigkanzijn.Wehebbenalseerstehet Flaskmicro-frameworknodig.
221 Blok5 Flask
InstallerenvanhetFlaskmicro-framework
VoordatwehetFlaskmicro-frameworkgaaninstalleren,makenweeersteennieuwevirtualenvironmentaan, zodatonzeinstallatievanhetFlaskmicro-frameworkgeenandereinstallatiesindewegzit.Hoeweeenvirtual environmentmaken,hebbenwealgezieninBlok3Bestanden.
Nadatwedevirtualenvironmenthebbenaangemaakt,kunnenwehetFlaskmicro-frameworkinstalleren.Het Flaskmicro-frameworkheetFlaskenkanviadePyCharm-optieswordengeïnstalleerd.Hoejeeenbibliotheekuit
PyPiinstalleert,hebbenweeerdergezienBlok3Bestanden.
BijhetinstallerenvanFlaskzijnermeerdereanderebibliothekenmeegeïnstalleerd.Ditzijnbibliothekendiehet Flaskmicro-frameworkopdeachtergrondgebruikt.
TestvanhetFlaskmicro-framework
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Omdeinstallatietetestenmakenweeenkleintestprogramma.Metditprogrammazienwehoekleineneenvoudig eenFlask-applicatieeruitkanzien.Hetdoetnietveel,maarhetishandigomdebasistebegrijpen.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
groet = '<h1>Hello, World!</h1>' return groet
if __name__ == '__main__': app.run(debug=True)
AlseerstewordthetFlaskmicro-frameworkgeïmporteerd.Datgebeurtopeenanderemanierdanwetotnutoe hebbengezien.Wezijndeconstructie import flask gewend.Hiermeezeggenwe:importeerdegeheleflask module.Indeapplicatiezoalswedezenuhebbengemaakt,hebbenwedeconstructie from flask import Flask gebruikt.Hiermeezeggenwedatervandemodule flask declass Flask moetenimporteren.Hetverschil isdatwenualleendeclass Flask importereninplaatsvandecompletemodule.
Wemakeneenvariabeleaangenaamdapp.Ditisdestandaardbenamingdieinallerleivoorbeeldenwordtgebruikt doordevelopersdiemet Flask werken.Wijhoudendezenaamaan. Aandevariabeleappkennenwedeinstantie Flask toe,waarindenaamvanonzePythonmodulemeegeven.De app heeftnualleeigenschappenenfunctionaliteitenalsdeFlask.
De @app.route('/') zieterwatvreemduit.InPythonwordtditeendecoratorgenoemd.Eendecoratorpast defunctiedievolgtaan.Jekunthierheelkrachtigefunctionaliteitenmeerealiseren,maardatisvoornuniet noodzakelijk.Zoalsdezehierisgebruikt,functioneerthetalsrouteringsmechanisme.DeFlaskapplicatiedoet verschillendedingenafhankelijkvandeurldiehetkrijgt.De'/' isderootvandewebste,dehomepagina.Een url localhost:5000/index ofopeenlivewebserver https://mijndomein.nl/index Watopvaltisdater geen .html is.
WatdeFlaskapplicatiegaatdoenophetmomentdatdegebruikernaardehomepaginagaatwordtbepaalddoor watdefunctiediedirectnadedecoratorkomtdoet.
222
Wehebbenalsfunctiedirectnadedecorator hello_world(),deklassiekerbijhetlerenvaneennieuwe programmeertaal,ofinditgevaleennieuwmircro-framework.Indefunctiehebbenwedevariabelemetdenaam groet,waarweeenstringaantoekennenmetdewaarde "<h1>Hello, World!</h1>" Destringzieteruitals eenstukjecodedatuiteenwebpaginazoukomen.Datkloptook,wegeveneenvalideHTMLstukalsreturnwaarde vandefunctieterug.
De if __name__ == '__main__':iseenstandaardconstructiediewordtgebruiktomtetestenofde Pythonmodulerechtstreekswordtuitgevoerd,dankrijgt __name__ dewaarde __main__ ofniet.Inhetlaatste gevalwordtditPythonbestandgeïmporteerddooreenanderPythonbestandenkunnenwenietstarten.Wanneer demodulewelrechtstreeksisgestart,danzienwe app.run(debug=True) Opditmomentzeggenwetegen Flask,garunnenenneemdecontrolevanhetprogrammaover.Wijzijnnudecontroleoverdeflowvanhet programmakwijt.Deenigemanierwaaropernogietsmetonzecodegaatgebeuren,isalsdegebruikernaarde homepaginagaat.Waardehomepaginais,zienweindeoutputalswedeapplicatiestarten.
Wanneerwedeapplicatiestarten,verschijnterindeoutputwindoweenaantalzakendiebelangrijkzijn.
* Serving Flask app 'main'
* Debug mode: on
WARNING:Thisisadevelopmentserver.Donotuseitinaproductiondeployment.UseaproductionWSGIserverinstead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 114-999-391
Dewaarschuwingmoetenweserieusnemen.GebruikFlasknietineenproductie-omgeving.Gebruikeen WSGI-serverdiewelproductiewaardigis.
Anderebelangrijkeinformatieisdeurl,waarwedeFlaskwebserverkunnenvinden: http://127.0.0.1:5000
Het 127.0.0.1 ip-adresishetzogenaamdelocalhostadres.Dezewordtvaakgebruiktvoorlokalewebservers. De :5000 ishetpoortnummerwaaropdeFlaskwebserverluistert.Datbetekentdatdewebserverreageertals weeroverpoort5000eenberichtnaarsturen.
Watwenukunnendoenisopdelinkklikkeninhetoutputscherm,danstartdebrowserenkrijgenweonze 'Hello, World' Dooordatdeteksttussen <h1> </h1> tagsstond,watkopstijl1groteletters,zietdetekster grootuit.
WehebbendeeerstebasisFlaskapplicatiegemaakt.
Routing
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
WehebbenbijonzeeersteFlask-applicatiegeziendatroutingervoorzorgdedatdegebruikernaardehomepagina navigeerdezodradezebijdePythonfunctie hello_world() uitkwam.Wijkregendanweercontroleoverhet programmaenkondendandeinhoudterugsturendiewewildesturen.
Omderoutingnaaranderepagina'stelatengaan,breidenwehetpadinderoutingdecoratoruit.
from flask import Flask
223 Blok5 Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
groet = '<h1>Hello, World!</h1>' return groet
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
@app.route('/nieuwe_pagina')
def nieuwe_pagina(): nieuw = '<h1>Andere pagina</h1>'
link = '<p><a href="/">Terug naar home</a></p>' return f"{nieuw}{link}"
if __name__ == '__main__': app.run(debug=True)
Wanneerwedevorigeapplicatienoghebbendraaien,dankanjedePythoncodegewoonaanpassen.Zodraje dezeopslaat,leestdeFlaskwebserverdeaangepastesourceweerin.Deaangepastecodewerktdangelijk,mits ergeenfouteninzitten.Mochtjeweleenfouthebben,dankrijgjeeenuitgebreidewebpaginametdaaropwater foutging.Leesditgoed,danvindjedefoutmeestalsnel.
Wehebbennueennieuweroutetoegevoegdwaarwenaartoekunnenvanuitdebrowser.Wanneerwemetde browsernaarditnieuwepadgaankomenweuitinde nieuwe_pagina() functie.Daarkunnenweweerdoen watwebijdezepaginawillenlatengebeuren.
Hierisnueenlinkgemaaktdieweerterugverwijstnaardehomepagina.Wekunnenalleenopdezepaginakomen doordeurlindebrowseraantepassenentelatenwijzennaaronzenieuweroute: 127.0.0.1:5000/nieuwe_pagina
Opdenieuwepaginaaangekomenziejedatdefunctie nieuwe_pagina() indePythoncodeisaangeroepen, wantdenieuwetekststaatdaarnu.Wanneerweopdelinkklikken,opdezenieuwepagina,danspringenweweer terugnaardehomepagina.
Jezietnudatjemetderoutenieuweurl'skaninvullenmetfunctionaliteit.Wevoegendaarnogeenanderevariatie aantoe,namelijkhetdoorgevenvaneenvariabelealswanneerwenaareenpaginagaan.
Variabelen
Hetkomtvaakvoordatwedezelfdeinformatieopeenpaginawillenhebben,maardanmethierendaareen anderetekst.Denkaaneengepersonaliseerdepagina.
from flask import Flask
224
app = Flask(__name__)
@app.route('/')
def home():
deelnemers = ('David', 'Thomas', 'Emma', 'Sophie', 'Olivia', 'Eva')
links = ""
home = '<h1>Programmeren in Python</h1>\n'
for index, deelnemer in enumerate(deelnemers): links = f'{links}<p>{index + 1}] \ <a href="/deelnemer/{deelnemer}">{deelnemer}</a></p>\n'
return f"{home}{links}"
@app.route('/deelnemer/<naam>')
def deelnemer(naam):
titel = f'<h1>Welkom {naam}</h1>\n'
boodschap = '<p>Welkom bij de cursus programmeren in Python!</p>\ <p>We zijn verheugd om je aan boord te hebben en kijken ernaar \ uit om samen met jou de wereld van Python te verkennen.</p>\ <br>\
<p><a href="/">Home</a></p>'
return f"{titel}{boodschap}"
if __name__ == '__main__': app.run(debug=True)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Veelvanwatweindebovenstaandecodezienherkennenwenogvanhetvorigevoorbeeld.Eenpaarkleine wijzigingen.Dedecoratormetderoutedienaardehomepaginaverwijstheeftnualsfunctiedenaam home() Hieruitziejebeterwatdeintentieisvandefunctie.
Inde home() functiewordtdynamisch(opbasisvaneentuplemetnamen)opdehomepaginaeenlijst samengesteldmetlinks.DelinkswordenhandiggemaaktdoorHTML-linkssamentestellenmeteenformatted string.Elkelinkverwijstnaardezelfdeurl,waarbijalleendenaamsteedswijzigt.DitbetekentdatwebijFlask elkekeerbijdezelfdePython-functieuitkomen,namelijkdefunctie deelnemer()
Elkekeerdatweeendecoratormeteenroutemaken,gevenwedeonderliggendefunctiedezelfdenaam.Inhet vorigecodevoorbeeldziejederoute /deelnemer,endeonderliggendefunctieheet deelnemer() Bijdezelfde routeziejeookdat /<naam> eenonderdeelisvanderoute.Metdehaken '<' en '>' kanjeaangevendatereen
225 Blok5 Flask
variabelemoetkomen.Hetisdemanieromvariabeleaandeonderliggendefunctiemeetegeven.Deonderliggende functiemoetdanookeenvariabelehebben.Doordevariabele-naamhetzelfdetehoudenisdeintentieduidelijk. Deonderliggendefunctieis deelnemer(naam)
Wanneerwedezevariabelewillengebruiken,dankandatprima.Inbovenstaandecodeisdevariabelegebruikt ineenformattedstringomdenaamvandedeelnemerophetschermteplaatsen.
Jinja
(ZONDERBEELD-EN TAALREDACTIE)
Jinjaiseentemplate-enginedievaakwordtgebruiktincombinatiemetFlask.MetJinjakanjedynamische HTML-pagina'stemakendoorgebruiktemakenvantemplates.Detemplateshebbenveelfunctionaliteiten kunnenvariabelen,logicaenbesturingselementenbevatten.JekuntnuHTMLpagina'sopbouweninclusiefCSS enJavaScript.
OmmetdeJinjatemplatestekunnenwerken,moetenweeenvastefolderstructuurgebruiken.Vanuitdezevaste structuurkunnendeverschillendedeleneffectiefsamenwerkenomdynamischepagina'stecreëeren.Onderstaand debenodigdefolderstructuur.
mijn-flask-app
├── static/
│ └── css/
│ └── main.css
├── templates/
│ ├── index.html
│ └── andere.html
├── main.py
└── andere.py
CONCEPT
Dehoofdfolder mijn-flask-app magelkegeldigefoldernaamhebben.Defoldersstatic,cssentemplatesmoeten exactalsbovenstaandewordengeschrevenenonderdejuistehoofdfolderstaan.
DetemplatesfolderheeftHTML-bestandendiealsextensie .html hebben.Detemplatesmoetenvolledigeen correcte-HTMLpagina'szijn.Inhetvolgendecodeblokziejeeentemplatewaarmeewedescorevanstudenten kunnenlatenzien.DetemplateheeftdemeestgebruikteJinjatemplatefeatures,waarondervariabelen, conditionelestatementsenfor-herhalingslussen.
<!DOCTYPE html>
<html lang="en">
<head>
<title>{{ titel }}</title>
</head>
<body>
<h1>{{ titel }}</h1>
{# Toon een boodschap #}
<p>
226
{{ Boodschap }}
</p>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<title>{{ titel }}</title>
</head>
<body>
<h1>{{ titel }}</h1>
{# Toon een lijst met student resultaten #}
<ul>
{% for student in studenten %}
<li>
TAALREDACTIE)
</ul>
</body>
</html>
(ZONDERBEELD-EN
{% if student.score > 80 %} {% else %} {% endif %}
<em>{{ student.naam }}:</em> {{ student.score }}/{{ max_score }}
</li>
{% endfor %}
CONCEPT
IndevoorbeeldNinjatemplatezienwealhoebepaaldeelementenheten.HeteerstedeelisstandaardHTML.In destandaardHTMLwordtgebruikgemaaktvanvariabelen.VariabelendieuithetPythondeelkomenworden tussendubbeleaccoladesgeplaatst,zoalsbij {{ titel }} Devariabeletitelwordtdanvervangendoorhetgeen watdoorisgegevenvanuitPython.
Verderopzienwe {# #},hiermeegevenweaandathetomcommentaargaat.De {% %} duidenaandater specifiekeJinja-codekomt.IndeJinja-codezienweookdathetmogelijkisom for-endfor en if-else-endif constructiestegebruiken.
Inditvoorbeeldworden studenten alslijstmeteendictionaryper student gebruikt.
from flask import Flask, render_template
app = Flask(__name__)
max_score = 100
227 Blok5 Flask
titel = "Python Test"
student_scores = [
{"naam": "Emma", "score": 75},
{"naam": "Sophie", "score": 92},
{"naam": "David", "score": 58},
{"naam": "Thomas", "score": 88},
{"naam": "Olivia", "score": 95} ]
@app.route('/')
def home():
return render_template("index.html", titel=titel, studenten=student_scores, max_score=max_score)
(ZONDERBEELD-EN
if __name__ == '__main__': app.run(debug=True)
CONCEPT
TAALREDACTIE)
InhetPython-gedeeltezienwedatbijdeimporteenextraimportisgekomen,namelijkde render_template De render_template zorgtervoordatwedekoppelingtussendePythonendeHTMLkunnenmaken.Wanneer we render_template() aanroepen,kunnenwedePythonvariabelendoorgevenalsparameters.InhetHTML-deel kunnenwedePythonvariabelenmetdedubbeleaccololadestoepassen.
HetwerkenmetJinjavereistveelnauwkeurigheid.Hetkomtvrijsnelvoordatjedenkt,hmm,waaromziethij mijnvariabeleniet?Vaakbenjeeenaccoladevergeten,heeftdeparametereenanderenaaminhetPythondeel, enzovoort.Werknauwkeurig.
Demogelijkhedenzijnenorm,zekeralsjegebruikgaatmakenvanhethergebruikvanHTMLpagina's,enCSSen Javascriptzoutoepassen.Ditzijndewatgevorderdetechnieken.
5.5 Begrippen
5.6 Testjekennis
Opdracht5
WatisFlask?
228
EenJavaScript-frameworkvoorhetbouwenvaninteractievewebpagina's.
EenPython-frameworkvoorhetontwikkelenvanwebapplicaties.
EenCSS-frameworkvoorhetontwerpenvanresponsievewebsites.
Eendatabase-enginevoorhetopslaanvangegevens.
Opdracht6
Watishetdoelvanhetrender_template-functieinFlask?
HetweergevenvanstatischeHTML-bestanden.
Hetuitvoerenvandatabasequery'senhetophalenvangegevens.
HetrenderenvandynamischeHTML-pagina'smetbehulpvanJinja-templates.
HetgenererenvanJavaScript-codevoorinteractievefuncties.
Opdracht7
WatisderolvanHTMLineenFlask-applicatie?
HTMLwordtgebruiktvoorhetverwerkenvanserverlogicaendatabase-interacties.
HTMLwordtgebruiktvoorhetopslaanvangegevensdiedoordegebruikerzijningevoerd.
HTMLwordtgebruiktvoorhetdefiniërenvandestructuureninhoudvanwebpagina's.
HTMLwordtgebruiktvoorhetschrijvenvanprogrammeerlogicavoorhetservergedeeltevandeapplicatie.
Opdracht8
Watisdebetekenisvan"127.0.0.1:5000"inhetkadervaneenFlask-applicatie?
HetishetIP-adresvandeserverwaardeFlask-applicatiewordtgehost.
HetisdestandaardpoortwaaropdeFlask-applicatiedraaitopdelocalhost.
HetishetdomeinvandewebsitewaaropdeFlask-applicatiewordtuitgevoerd.
HetisdeHTTP-statuscodediewordtteruggestuurddoordeFlask-server.
Opdracht9
WatisroutinginhetkadervaneenFlask-applicatie?
HetprocesvanhetbepalenwelkecodemoetwordenuitgevoerdvooreenbepaaldeURL.
Hetprocesvanhetaanvragenvangegevensvanexterneservers.
Hetprocesvanhetbepalenvandelocatievanstatischebestanden.
HetprocesvanhetorganiserenvanHTML-bestandeninmappen.
Opdracht10
HoewordteendynamischeURL-routegedefinieerdineenFlask-applicatie?
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
DooreenstandaardHTML-bestandtemakenendeURLintestellenalsdebestandsnaam.
DoordeURLrechtstreeksintestellenalseenattribuutvandeFlask-applicatie.
Doordedynamic_url-parameterintestellenbijhetinitialiserenvandeFlask-applicatie.
DooreenfunctietedefiniërendiedeURLalsparameteraccepteertendezetedecorerenmet@app.route.
Opdracht11
WatgebeurteralseengebruikereenURLbezoektdienietovereenkomtmeteengedefinieerderouteinFlask?
229 Blok5 Flask
Flaskstuurteen500-foutmeldingnaardebrowservandegebruiker.
Flaskstuurteen404-foutmeldingnaardebrowservandegebruiker.
Flaskstuurtdegebruikerdoornaardestandaardroutevandeapplicatie.
Flaskstuurteenwaarschuwingsberichtnaardeontwikkelaar.
Opdracht12
WatgebeurteralsereenfoutoptreedtineenFlask-scripttijdensdeuitvoering?
Flaskstoptdeserverentoonteenstandaardfoutmeldingaandegebruiker.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Flaskstuurtautomatischeene-mailmeldingnaardeontwikkelaarmetdetailsoverdefout.
Flaskgaatdoormetdeserverenprobeertdefoutoptelossen.
Flasklogtdefoutineenbestandengeefteenaangepastefoutmeldingaandegebruiker.
Opdracht13
HoewordenvariabeledelenvaneenURL-routeinFlaskgedefinieerd?
DoorzetussenvierkantehakenteplaatsenindeURL-definitie.
DoorzevooraftedefiniërenalsstatischedelenvandeURL.
DoorzetussenhaakjesteplaatsenindeURL-definitie.
Doorzetescheidenmeteenunderscore(_)vandestatischedelenvandeURL.
Opdracht14
WatisJinjainhetkadervaneenFlask-applicatie?
Eendatabase-enginevoorhetopslaanvangegevens.
EenJavaScript-bibliotheekvoorhetmanipulerenvandeDOM.
EenCSS-frameworkvoorhetopmakenvanwebpagina's.
EentemplateenginevoorhetgenererenvandynamischeHTML-pagina's.
Opdracht15
WatishetdoelvaneenJinja-sjabloonineenFlask-applicatie?
Omdynamischeinhoudtegenererenopbasisvangegevensvandeserver.
OmCSS-stijlentoetepassenopHTML-elementen.
OmJavaScript-codetegenererenvoorinteractievefuncties.
Omdestructuurvandewebpagina'stedefiniërenmetHTML-tags.
Opdracht16
Hoevoerjeeenfor-lusuitineenJinja-sjablooninFlask?
Doordefor-instructieoptenemenineenJinja-bloktussen{{en}}.
Doordefor-instructietoetepassenalseenCSS-selectorindeHTML-code.
Doordefor-instructieoptenemenineenJinja-bloktussen{%en%}.
Doordefor-instructierechtstreeksintevoegentussendubbeleaccolades,zoals{{for}}.
Opdracht17
WatishetbelangrijkstevoordeelvanhetgebruikvanopmerkingeninJinja-sjablonen?
230
OpmerkingenkunnenwordengebruiktomdynamischeinhoudtoetevoegenaanHTML-elementen.
Opmerkingenkunnenwordengebruiktomstijlenenlay-outstedefiniërenvoorHTML-elementen.
Opmerkingenzijnhandigvoorhetdocumenterenvandecodeenhetmakenvannotitiesvoorontwikkelaars.
OpmerkingenzijnnodigvoorhetcorrectinterpreterenvanJinja-sjablonendoordeserver.
Opdracht18
WatisdestandaardmapstructuurvoorJinja-sjablonenineenFlask-applicatie?
Eenmapgenaamd"templates"indehoofdmapvandeapplicatie.
Eenenkelemapgenaamd"jinja_templates"indehoofdmapvandeapplicatie.
Geenspecifiekemapstructuur;Jinja-sjablonenkunnenoveralinhetprojectwordengeplaatst.
Eenmapgenaamd"html"indehoofdmapvandeapplicatie.
Opdracht19
Watishetdoelvaneenfor-herhalingslusineenJinja-sjabloon?
Omgebruikersinvoertevaliderenenfoutmeldingenweertegeven.
OmeenreeksHTML-elemententeherhalenentegenererenopbasisvaneenvoorafgedefinieerdelijst.
OmexterneAPI'saanteroepenengegevensoptehalen.
OmJavaScript-codetegenererenvoorclient-sideinteractie.
5.7 Praktijkopdrachten Inleidingpraktijkopdracht
Voordepraktijkopdrachtengaanweeensituatieschetsenwaarbijallekennisvandevoorgaandetheoriemoet wordengebruikt.Breekeenprobleemaltijdopinkleinerestukken.Testdezestukkenenvoegdezeuiteindelijk bijelkaar.WerknauwkeurigzekerindecombinatietussenHTMLenPython.Kijkwaarjefunctieskangebruiken omdecodeoverzichtelijkenleesbaartehouden.
Opdracht20 Verkoopcijfers
BijdepraktijopdrachtvanExcelhebjeeenopgeschoondExceldocumentgegenereerd.Jekanditbestand gebruikenvoordezeopdracht.
OpeendynamschewebsitegaanwedeverkoopgegevensvandestaatNevadaplaatsen.Voordeperiode2022-04-10 gaanwevanelkecategorydedollars,unitsalesendeberekendeprijsperunitweergeven.Deprijsperunitbepaal jedoor:Dollars/Unitsales.
Toondegegevensopdehomepagina.Degegevenswordengeladenvandehardeschijfenverwerktomdejuiste datatevinden.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
231 Blok5 Flask
Opdracht21 Verkoopdetails
BijdepraktijopdrachtvanExcelhebjeeenopgeschoondExceldocumentgegenereerd.Jekanditbestand gebruikenvoordezeopdracht.
OpeendynamschewebsitegaanwedeverkoopgegevensvandestaatCaliforniaplaatsen.Voordeperiode 2022-06-19gaanweopdehomepaginaallecategorieënonderelkaarplaatsen.Elkecategorieiseenlinknaar eennieuwepaginametalsurl:/detail/<naamcategory>.DezelfdePythonfunctiewordtdandoorFlaskaangeroepen. GeefdedataweeruitdeDollarendeUnitSaleskolom.Geefookdewaardeineuro'sweerineenderdekolom.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
HaaldewaardevandeeuroopmetdeHTTPrequestuitcryptowebservice.Daarkanjedeactuelekoersvande euroophalen.Berekenhoeveeldewaardeisdoordedollarsomrekenennaareuro's.
Opdracht22 Pokémon
MaakeendynamischewebpaginametJinja,waarinjevoordevolgendePokémoneendetailpaginamaakt,als eensoortminiPokédex.
• pikachu
• bulbasaur
• charmeleon
• charizard
• squirtle
• pidgeot
ViaeenAPIwebservicekanjedeinformatievandePokémonophalen.Dewebserviceis: https://pokeapi.co/api/v2/pokemon/<hier de naam in lowercase van de Pokémon>
GeefopdeHomepaginadeverschillendePokémonweeralslink.Opeenseparatedetailpaginageefjedevolgende gegevensweer.
• AlstitelvandepaginadenaamvandePokémon
• EenafbeeldingvandePokémon(voorkant)
• HetgewichtvandePokémon
• DeeerstemovevandePokémon
5.8 Terugblik
Opdracht23 Terugblik
Zeteenkruisjeindekolomdievoorjouvantoepassingis.
Nee Ja Beoordelingscriteria
JekunteenbasisFlaskwebpaginaaanmaken.
JekunteenstatischeFlaskwebpaginamaken.
JekunteendynamischeFlaskwebpaginamaken.
Opdracht24 Terugblik
Denknaoverwatjehebtgedaaninditblok.
232
a. Noemtweedingenwaaroverjetevredenbent.
1. 2.
b. Noemtweedingendiejedevolgendekeeranderswiltdoen.
1. 2.
c. Vraagjedocenten/ofleermeesteromfeedback.
Tops:
Tips:
5.9 Toets
Opdracht25
WatishetdoelvaneenrouteinFlask?
Omdesnelheidvandewebapplicatietemeten.
OmtebepalenwelkepaginamoetwordenweergegevenbijeenbepaaldeURL.
Omverkeernaardewebsiteteleiden.
Omdebeveiligingvandeapplicatieteverhogen.
Opdracht26
WelkvandevolgendestatementsiswaaroverJinja?
JinjaiseenPython-frameworkvoorhetontwikkelenvanwebapplicaties.
JinjaiseenJavaScript-bibliotheekvoorhetmanipulerenvandeDOM.
Jinjaiseendatabase-enginevoorhetopslaanvangegevens.
JinjaiseentemplateenginegebruiktinFlaskvoorhetgenererenvandynamischeHTML-pagina's.
Opdracht27
WatisderolvanCSSineenFlask-applicatie?
CSSwordtgebruiktvoorhetuitvoerenvanserverlogicaendatabasetoegang.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
CSSwordtgebruiktvoorhettoevoegenvanopmaakenstijlaanHTML-elementen.
CSSwordtgebruiktvoorhetverwerkenvangebruikersinvoerenformuliergegevens.
CSSwordtgebruiktvoorhetuitvoerenvanclient-sidescriptseninteracties.
Opdracht28
HoewordendynamischegegevensweergegevenineenHTML-paginabinneneenFlask-applicatie?
233 Blok5 Flask
DoorhetgebruikvanJinja-templatesomgegevensdynamischintevoegeninHTML-bestanden.
DoordirecteinvoegingvanPython-codeinHTML-bestanden.
DoorhetgebruikvanCSS-stijlenomgegevensdynamischweertegeven.
DoorhetgebruikvanJavaScriptomgegevenstemanipuleren.
Opdracht29
HoedefinieerjeeennieuwerouteinFlask?
Dooreenfunctietedefiniërenendezetedecorerenmetde@app.route-decorator.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
DooreennieuwHTML-bestandtemaken.
DoorderouteintestellenalseenattribuutvandeFlask-applicatie.
DoordeURLrechtstreeksintestellenalseenparametervandeapp.run()-functie.
Opdracht30
WatisderolvanparametersineenrouteinFlask?
Zespecificerendestandaardwaardevoorderoute.
Zewordengebruiktomderoutetebeveiligentegenongeoorloofdetoegang.
ZewordengebruiktomvariabeledelenvandeURLvastteleggen.
ZebepalenhetpadnaarhetHTML-bestanddatwordtgerendereerd.
Opdracht31
HoekunjemeerdereURL'snaardezelfdefunctieinFlaskrouteren?
DooreenapartefunctietemakenvoorelkeURL.
DooreenconditietoetevoegenindefunctieomdeverschillendeURL'stecontroleren.
Dooreenexternescriptbibliotheektegebruikenomderouteringaftehandelen.
Doorde@app.route-decoratormeerderekerentegebruikenmetverschillendeURL's.
Opdracht32
WatisdestandaardinstellingvanFlaskvoorhettonenvanfoutmeldingentijdensdeontwikkelingsfase?
Flasktoontgeenfoutmeldingen,maarregistreertzealleenineenlogbestand.
Flasktoonteenalgemenefoutmeldingzonderdetails.
Flasktoontgedetailleerdefoutmeldingenmettraceback-informatieindebrowser.
Flaskstuurtautomatischeene-mailmeldingnaardeontwikkelaarmetdetailsoverdefout.
Opdracht33
WatisderolvanvariabelenineenURL-routeinFlask?
Zewordengebruiktomparametersdoortegevenaandebijbehorendefunctie.
ZewordengebruiktomdynamischeinhoudineenHTML-bestandintevoegen.
ZewordengebruiktomderoutevandeURLtebepalen.
ZewordengebruiktomtoegangtekrijgentotexterneAPI's.
Opdracht34
HoemarkeerjeeenJinja-sjabloonineenHTML-bestand?
234
Doordebestandsnaamvanhetsjabloontewijzigenin.jinja.
DoordeHTML-codeineenJinja-blokteplaatsentussen{%en%}.
DoordeHTML-codeineenJinja-blokteplaatsentussen{{en}}.
DoordeHTML-codeintesluitentussendubbeleaccolades,zoals{{HTML-code}}.
Opdracht35
HoevoegjeeenvariabeletoeaaneenJinja-sjablooninFlask?
DoordevariabeleoptenemenineenJinja-bloktussen{%en%}
DoordevariabeleoptenemenineenJinja-bloktussen{{en}}.
Doordevariabelerechtstreeksintevoegentussendubbeleaccolades,zoals{{variabele}}.
DoordevariabeletoetewijzenaaneenCSS-klasseindeHTML-code.
Opdracht36
WatisdesyntaxisvoorhetinvoegenvaneenJinja-variabeleineenHTML-attribuut?
{{attribute="variabele"}}
{%attribute="variabele"%}
<tagattribute="{%variabele%}">
<tagattribute="{{variabele}}">
Opdracht37
HoevoegjeeenopmerkingtoeineenJinja-sjabloon?
Door{#en#}tegebruikenomeenopmerkingteomringen.
Door<!--en-->tegebruikenomeenopmerkingteomringen.
Door/*en*/tegebruikenomeenopmerkingteomringen.
Door//tegebruikenomeenopmerkingopéénregeltoetevoegen.
Opdracht38
WatishetdoelvanhethebbenvaneenapartemapvoorJinja-sjablonenineenFlask-project?
OmdesjablonentoegankelijktemakenvoorexterneAPI's.
Omdesjablonenopeenveiligelocatieopdeserveropteslaan.
Omdesjablonentecomprimerenvooreenbetereprestatievandeapplicatie.
OmdesjablonentescheidenvananderestatischebestandenzoalsCSSenJavaScript.d
Opdracht39
Hoewordteenfor-herhalingslusopdejuistemanieropgenomenineenJinja-sjabloon?
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Doordefor-herhalingslusoptenementussen{%for%}en{%endfor%}Jinja-blokken.
Doordefor-herhalingslusrechtstreeksindeHTML-codeoptenementussen<for>en</for>.
Doordefor-herhalingslusoptenementussen{{for}}en{{endfor}}Jinja-blokken.
Doordefor-herhalingslusoptenemenindeattributenvaneenHTML-element.
235 Blok5 Flask
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
236
BLOK6
MQTT
(ZONDERBEELD-EN TAALREDACTIE)
CONCEPT
MQTTstaatvoorMQTelemetryTransport.Hetiseenzogenoemdlichtgewichtprotocolgebaseerdopberichten. Hetisontworpenvoorbetrouwbare,efficiënteenreal-timecommunicatietussenapparatenineennetwerkmet eenbeperktebandbreedteofonbetrouwbareverbindingen,zoalshetInternetofThings(IoT).Deeenvoudvan hetprotocolmaaktdathetmakkelijkteimplementerenisenhetlichtgewichtprotocolzorgtervoordatook batterijgevoedeapparatennietteveelenergiehoeventegebruikenomtecommuniceren,wantcommunicatie verlooptviaeenbroker.
MQTT-brokersfungerenalstussenpersonendieberichtenrouterentussenapparatenineenMQTT-netwerk.
PopulaireMQTT-implementatieszijnondermeerEclipseMosquitto,HiveMQenVerneMQ.Inditblokgaanweons bezighoudenmethetversturenenontvangenvanberichtenmetMQTT.
Leerdoelen
1. JekuntuitleggenwatMQTTis.
2. Jekuntcommunicerenmeteenbroker.
3. Jekuntcommunicerentussenverschillendeapplicaties.
Opdracht1
OriëntatieopdrachtMQTT
TegenwoordigheeftvrijweliedereeneenIoTapparaatinhuis.Ofhetnugaatomeenthermostaat,eenslimme koelkastofintelligentetandenborstel,aldezeapparatenzijnmetjenetwerkverbonden.Zecommunicerenal dannietmetdeleveranciervoorupdatesofstatus.Viaeenappopjetelefoonkanjedanvaakzienwatergebeurt.
a. WatvoorIoTdevicehebjijthuisofweetjijiemanddieéénofmeerdereIoTdevicesthuisheeft?Geefaanwat voorsoortdevicehetisenwatvoordataervolgensjouwwordtverstuurd.
Tip:denkaanverlichting,deurbellen,etc.
(ZONDERBEELD-EN TAALREDACTIE)
b. Determhome-automationzaljeergenswelhebbengehoord.Watzoujethuisaanhome-automationwillen hebbenoferaantoevoegenalsjehetalhebt?
Tip:denkaanbewegingssensoren,temperatuursensoren,etc.
CONCEPT
c. WelkevandevolgendeuitsprakenzijnwaarmetbetrekkingtotMQTTenhetInternetofThings(IoT)?Erzijn meerdereantwoordengoed.
EenMQTT-brokerfungeertalseencentraleserverdieberichtenontvangtvanverzendendeapparatenen dezedoorstuurtnaargeïnteresseerdeontvangers.
TopicsinMQTTwordengebruiktomberichtentecategoriserenenteorganiseren,enspeleneenbelangrijke rolinhetpublicerenenabonnerenopberichtenbinneneenMQTT-netwerk.
HetInternetofThings(IoT)verwijstnaarhetconceptvanhetverbindenvanfysiekeapparaten,voertuigen enandereobjectenmethetinternetomgegevensteverzamelenentedelen.
MQTTiseenprotocoldatvaakwordtgebruiktvoorcommunicatietussenapparateninhetInternetof Things(IoT).
MQTTstaatvoorMessageQueuingTransportTechnologyenwordtvoornamelijkgebruiktvoorhetverzenden vane-mailsviahetinternet.
6.1 OpdrachtensetMQTTBasis
Opdracht1 MQTTBasis
RaadpleegzonodigdetheorieoverMQTTBasis.
a. WatisMQTT?
238
Eenprogrammeertaalvoorhetontwikkelenvanwebapplicaties.
Eenmachine-naar-machine(M2M)communicatieprotocol.
Eenprotocolvoorhetversturenvane-mails.
Eendatabase-enginevoorhetopslaanvangegevens.
b. WaarstaandelettersMQTTvoor?
MessageQueueTransferTool
MachineQueryTransferProtocol
MessageQueueTelemetryTransport
MachineQueryTelemetryTool
c. WatiseenbelangrijkkenmerkvanMQTT?
Hetvereisteencontinueinternetverbindingomtewerken.
Hetondersteuntalleencommunicatietussencomputersinhetzelfdelokalenetwerk.
Hetkanalleenwordengebruiktvoorhetverzendenvantekstberichten.
Hetisontworpenvoorefficiëntecommunicatiemetbeperktebandbreedteenverbindingenmeteenhoog latentieniveau.
d. LeguitwateenMQTT-brokerisenwatzijnrolisineenMQTT-netwerk.
e. NoemdebelangrijkstekenmerkenvanMQTTdiehetgeschiktmakenvoorIoT-toepassingen.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
6.2 OpdrachtensetMQTTPublish
Opdracht1 MQTTPublish
RaadpleegzonodigdetheorieoverMQTTPublish
a. WatisderolvaneenMQTT-publisher?
HetontvangenvanberichtenvaneenMQTT-broker.
HetopslaanvanberichtenineenMQTT-broker.
HetfilterenvanberichtenineenMQTT-netwerk.
HetversturenvanberichtennaareenMQTT-broker.
239 Blok6 MQTT
b. WatiseenMQTT-topic?
HetberichtzelfdatwordtverzondenineenMQTT-netwerk.
EenuniekenaamdiewordtgebruiktomberichtentecategoriserenenterouterenineenMQTT-netwerk.
HetIP-adresvandeMQTT-broker.
EenuniekenaamdiewordtgebruiktomberichtentecategoriserenenterouterenineenMQTT-netwerk.
c. WelkvandevolgendeQoS-niveausgarandeertdateenberichtminstenseenmaalwordtafgeleverdbijde ontvanger?
QoS0(Atmostonce)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
QoS1(Atleastonce)
QoS2(Exactlyonce)
QoS3(Onlyonce)
d. HoekunnentopicswordengestructureerdomberichtenteorganiserenenrouterenbinneneenMQTT-netwerk?
e. WatzijndebelangrijksteverschillentussenMQTTenHTTP?
6.3 OpdrachtensetMQTTClient
Opdracht1 MQTTClient
RaadpleegzonodigdetheorieoverMQTTClient.
a. WatisderolvaneenMQTT-client?
HetopslaanvanberichtenineenMQTT-broker.
HetontvangenendoorsturenvanberichtennaarandereMQTT-clients.
HetbeherenvandenetwerkconfiguratievoorMQTT-brokers.
Hetverzendenen/ofontvangenvanberichtennaar/vaneenMQTT-broker.
b. WatiseenbelangrijkkenmerkvaneenMQTT-client?
HetmoetaltijdeenactieveverbindingmetdeMQTT-brokerbehouden.
Hetkanwordengeïmplementeerdopeenverscheidenheidvanapparaten,inclusiefIoT-apparaten.
Hetkanalleenberichtenverzendennaarandereclientsenkangeenberichtenontvangen.
HetkanmeerdereMQTT-brokerstegelijkertijdbedienen.
240
c. WelkvandevolgendeprotocollenwordtmeestalgebruiktvoordecommunicatietusseneenMQTT-clienten eenMQTT-broker?
TCP/IP
HTTP
SSH
FTP
d. WatishetverschiltusseneenMQTT-publishereneenMQTT-subscriber?
e. HoeondersteuntMQTTasynchronecommunicatietussenclients?
6.4 TheorieMQTT MQTTbasis
(ZONDERBEELD-EN
CONCEPT
TAALREDACTIE)
HetdoelvanhetMQTT-protocolisomcommunicatietussenapplicatiesmogelijktemaken.Omditefficiëntte doen,moetenweeenaantalbasisprincipesbegrijpen.MQTTisonderandereontworpenomapparatenmetelkaar tekunnenlatencommuniceren,zonderdatzeaanelkaargekoppeldzijn.Vooralomdathetbedoeldisvoor apparatenmeteenzwakkeofslechteverbinding.Apparatencommunicerenviadebrokermetelkaar. MQTT
241 Blok6 MQTT
Broker
Apparatenofapplicaties(clients)dieinformatiekunnenleveren,denkaanmetingen(temperatuur,afstand,etc.) meldenditbijdebroker.Apparatenofapplicaties(clients)dieinformatiewillenhalenmeldenditookbijdebroker. Debrokergeeftdesignalendiehetontvangtdooraanalleclientsdieomhetdesbetreffendesignaalhebben gevraagd.Inhetprotocolzittenmechanismenombepaaldegarantiesdaaraantehangen.
Voordatweermeekunnenwerken,moetenwedebibliotheekinstalleren.
InstallerenvandeMQTT-bibliotheek
VoordatwedeMQTT-bibliotheekgaaninstallerenmakenweeersteennieuwevirtualenvironmentaan,zodat onzeinstallatievandeMQTT-bibliotheekgeenandereinstallatiesindewegzit.Hoeditmoethebbenwealgezien inBlok3Bestanden.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
NadatwedevirtualenvironmenthebbenaangemaaktkunnenwedeMQTT-bibliotheekinstalleren.De MQTT-bibliotheekheetpaho-mqttenkanviadePyCharmoptieswordengeïnstalleerd.Hoejeeenbibiliotheek inPyCharminstalleert,hebbenweeerdergezieninBlok3Bestanden.
Debroker
OmhetMQTT-protocoltegebruiken,moetenweeenbrokerhebbenomtecommuniceren.Ditkaneenlokale brokerzijn,opjeeigencomputerofnetwerkofeenbrokerindecloud.Omeventetestenhoeeenbrokerwerkt, isdebrokerindecloudhandig.Eriseenaantalbedrijvendateenbrokerindecloudheeftwaarvanwegebruik kunnenmaken.Zehebbeneengratisvariant,waarjetoteenbepaaldehoeveelheidapparatenofberichtengratis kuntcommuniceren.Vooronzeexperimentenisditruimvoldoende.Eénvandebrokersindeclouddiegoed werktisHiveMQ.
DownloaddehandleidingvoorhetgebruikvanHiveMQvanBoomDigitaal.
PublishandSubscribe
Hetcommunicatiepatroonpublishensubscribe,ookwelpub/subgenoemd,wordtgebruiktingedistribueerde systemenomberichtenteverzendenenontvangentussenverschillendeonderdelenvanhetsysteem.Indit patroonzijnertweehoofdrolspelers:depublisher(uitgever)endesubscriber(abonnee).
Stel,jezieteentijdschriftmetinformatiediejeaanspreekt.Eentijdschriftwordtdoorverschillendeschrijvers gemaakt.Eriseenuitgeverdiehettijdschriftpubliceert.Jeregistreertjebijdeuitgeveropdattijdschrift.Jebent nietdeenigediedittijdschriftwilontvangen.Deuitgeverregistreertmeerdere,bijeenpopulairtijdschriftheel veel,abonnees.Zodraereennieuweuitgavevanhettijdschriftis,wordtdezemeteennaarallegeregistreerde abonneesverstuurd.
Wanneerwedeabonneesvervangendoorapparaten,debrokeralsuitgeverendeschrijversalsdatabronnen zien,danhebbenwededigitalevariantvandepatrooninbeeld.
242
Callbackfuncties
Wehebbenhetaloverfunctiesgehadwaarmeeweduplicatieuitdecodehalen,zorgendatwegeengrotestukken codekrijgenendatallescompactengoedonderhoudbaarblijft.Callbackfunctieszijnvaneenandereorde.Dit zijnfunctiesdiealsargumentaaneenanderefunctiewordendoorgegevenenopeenlatertijdstipwprden uitgevoerd.Defunctiediedecallbackaccepteert,kandecallback-functieaanroepenwanneerbepaalde voorwaardenzijnvervuldofbepaaldegebeurtenissenoptreden.
Callbackfunctieswordenvaakgebruiktbijasynchronetaken.Decodewordtdanuitgevoerdopeenlatertijdstip, bijvoorbeeldwanneereenasynchronetaakisvoltooid.Eenandervoorbeeldisdynamischgedrag.Afhankelijk vanbepaaldeconditieskanjefunctiexaanroepenoffunctiey.
Onderstaandeenvoorbeeldvaneencallbackfunctie.
import random
def optellen(lijst_getallen):
print("Optellen")
return sum(lijst_getallen)
def gemiddelde(lijst_getallen):
print("Gemiddelde")
return sum(lijst_getallen) / len(lijst_getallen)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
for aantal in range(20):
if random.choice(["optel_som", "gemiddelde_som"]) == "optel_som": actie = optellen
else:
actie = gemiddelde
243 Blok6 MQTT
resultaat = actie([7, 12, 9, 14, 5, 11, 8, 6, 10, 13]) print(resultaat)
(ZONDERBEELD-EN TAALREDACTIE)
Wehebbentweenormalefunctiesgenaamd optellen() en gemiddelde().Beidehebbendezelfde functieparameter:eenlijstmetgetallen.Vervolgenshebbenweeenfor-loopwaarweeen random.choice() optiegebruiken.De random.choice() optieleverteen optel_som of gemiddelde_som op.
Wanneerereen optel_som uitkomtdankrijgtdevariabele actie denaamvandefunctie optellen() toegewezen. Inalleanderegevallenkrijgtdevariabele actie defunctie gemiddelde() toegewezen.
Opderegelvan resultaat wordtdevariabele actie aangeroepenalsofheteenfunctieismetdelijstvangetallen. Afhankelijkvanwelkefunctiealslaatsteaandevariabeleactiewerdtoegekend,wordtdiefunctieaangeroepen.
Topics
BijMQTTwordtergesprokenovertopics.EentopiciseenUTF-8stringdiedebrokerkangebruikenomtefilteren welkeinformatievoorjouinteressantis.Eentopicbestaatuitéénofmeerderelevelsenzieteruitalseenpadnaar eenfolder.
Voorbeelden van een topics, waarbij elke regel is 1 topic is:
mijn_huis/begane_grond/huiskamer/temperatuur
mijn_huis/begane_grond/keuken/temperatuur
mijn_huis/begane_grond/keuken/helderheid fabriek/pompen/1/toerental
fabriek/pompen/1/druk
CONCEPT
Jekanwildcardsgebruikenbijhetabonnerenopéénofmeerderetopics.Jehebtdesinglelevelendemultiple levelwildcard.
244
Single level wildcard
Desinglelevelwildcardisde '+'.Degeeftaandateropdatniveauindetopicelkewaardemagstaan.Alleandere niveausmoetenexactzijn.Onderstaandeenvoorbeeld.
We abonneren op:
mijn_huis/begane_grond/+/temperatuur
We krijgen dan:
mijn_huis/begane_grond/huiskamer/temperatuur
mijn_huis/begane_grond/keuken/temperatuur
mijn_huis/begane_grond/keuken/helderheid
fabriek/pompen/1/toerental
fabriek/pompen/1/druk
Indevoorgaandecodekrijgenweopdegeabonneerdewildcardtopicdetweetopicsdieindikgedrukteletters zijnweergegeven.Hetbetreftalleendeniveau'smetmijn_huis, begane_gronden temperatuur. huiskamer en keuken zijndeniveau'svandewildcard.Deandereregelvan mijn_huiswordtnietmeegenomen, omdathelderheidnietvoorkomtindegeabonneerdewildcardtopic.
Multilevel wildcard
Demultilevelwildcardisde '#'.Diegeeftaandateropdatniveauenalleniveausdievolgenelkewaardemag staan.Demultilevelwildcardmagalleenalslaatstetekenineentopicstaan.Onderstaandeenvoorbeeld.
We abonneren op:
mijn_huis/begane_grond/#
We krijgen dan:
mijn_huis/begane_grond/huiskamer/temperatuur
mijn_huis/begane_grond/keuken/temperatuur
mijn_huis/begane_grond/keuken/helderheid
fabriek/pompen/1/toerental
fabriek/pompen/1/druk
Inbovenstaandevoorbeeldkrijgenweopdegeabonneerdewildcardtopicdedrietopicsdieindikgedrukteletters zijnweergegeven.Alleniveau'sna begane_grond wordenhierinmeegenomen.
Uitzondering
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Inprincipemagjeeentopicnoemenzoalsjewilt,metéénuitzondering.Eentopicdiebegintmeteen '$' heeft eenanderdoel.Topicsmetde '$' zijngereserveerdvoorinternestatistiekvandebroker.Clientskunnenniet naardezetopicspublishen,maarerwelopabonneren.Erisvoordezetopicsgeenstandaardafspraakoverde signalendiegebruiktmoetenworden.Elkeleverancierdieeenbrokermaaktkanzelfbepalenwatvoortopicsze daarinvullen,omdatditnietisvastgelegd.Maarde '$SYS/' topicwordtnormaalgesprokengebruiktvoor:
$SYS/broker/clients/connected
$SYS/broker/clients/disconnected
$SYS/broker/clients/total
$SYS/broker/messages/sent
$SYS/broker/uptime
245 Blok6 MQTT
Bestpractices
Hetishetbesteomjetopicniettebeginnenmeteen'/'.Ditintroduceerteenextralevelmeteen0ervoor.Dit geeftverwarring.
Gebruikgeenspatiesinjetopics.Foutenzijnvreselijkmoeilijktevinden,omdaterbinnenUTF-8veelverschillende whitespacekaraktersbestaan.
Houjetopicskort,maarprecies.Datwilzeggengoedleesbaretekst,maarzokortmogelijk.
Gebruikalleenprintbaretekensengeenniet-printbarekarakters.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
MQTTTest
WehebbennuallekennisomeenMQTT-testprogrammatemaken.Metditprogrammagaanweviaeenalgemene publiekebrokerindecloudcommuniceren.Alsclientabonnerenweonsopalgemeneberichtendieinformatie gevenoverdebrokerzelf.
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, reason_code, properties): print(f"Verbonden, resultaat code {reason_code}")
client.subscribe("$SYS/#")
def on_message(client, userdata, msg): print(f"{msg.topic} {msg.payload.decode('UTF-8')}")
mqttc = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
mqttc.on_connect = on_connect
mqttc.on_message = on_message
mqttc.connect("mqtt.eclipseprojects.io", 1883, 60)
mqttc.loop_forever()
AlseersteimporterenwedebibliotheekommetMQTTtekunnencommuniceren.Hierzienweookeenvariant opde import Erishiergekozenomeenkorterenaamtegebruikendooreenaliastemaken.Dealiasheeftde naam mqtt.Overalwaarmqttstaatkanjelezen paho.mqtt.client.Wanneerweeenfunctionaliteituitde paho-mqttbibliotheeknodighebbendankunnenwedus mqtt tikkeninplaatsvan paho.mqtt.client
246
Defunctie on_connect() wordtaangeroepenophetmomentdatwezijnverbondenmetdebroker.Opdat momentmakenwevandegelegenheidgebruikomaantegevenopwelketopicswewillenabonneren.Debroker weetdan,datalsdattopicwordtontvangen,dathetdezenaaronsdoormoetsturen.Hierabonnerenweonsop deinternebrokerstatistiek '$SYS/#'
Defunctie on_message() iseeninteressantefunctie,wantditisdecallbackdiewordtaangeroepenzodraereen publishberichtopdebrokerwordtontvangenmetdezelfdetopicalsjouwgeregistreerdetopic.Binnende on_message() functiekunnenwedewaardetopiczien.Ditwordtde msg (message,berichtinhetNederlands) genoemd.Demessagebestaatuiteentopiceneenpayload.Detopickunnenweopvragenmet message.topic.
Ditishandig,omdatwedanwetenbijwelkeregistratiehetberichthoorde.Depayloadisdeuiteindelijkewaarde diebijhettopichoort.Dezewordtopgevraagdmet message.payload Dezepayloadiseensequentievanbytes.
Hetisdaardoormogelijkombinaireinformatieteontvangen,zoalsafbeeldingen.Inhetvoorbeeldwetenwedat hetomeenstringgaat.Wemoetendebytesomzettennaareenstringmetbehulpvan msg.payload.decode('UTF-8').
BijdemqttcregelwordtdeclientaangemaaktenwordteraangegevendathetgaatomAPI-versie2.APIversie1 isnogaanwezigvoorcompatibiliteitsredenen,maarzalbijdevolgendeversieverdwijnen. Nadatdeclientisaangemaaktwordendecallbackfunctiesgekoppeld.De on_connect() wordtgekoppeldaan onze on_connect().Hetzelfdegeldtvoorde on_message(),dezewordtgekoppeldaanonze on_message().
Allesstaatnugoedomdewerkelijkeconnectietemaken.Inditvoorbeelddoenweditmeteenalgemenepublieke broker.Wekunnenvandebrokerdeverschillendestatistiekenzien.Debrokerheefteenurl,poortadreseneen keepalive-tijd.
Delaatsteregelzorgtervoordathetprogrammablijftdraaienendeverbindingmetdebrokerblijftbewaken. Zodraereenberichtbinnenkomtvandebrokerwordtdejuistecallbackfunctieaangeroepen.Vanafditmoment zijnwedecontroleoverhetprogrammakwijtenisdeverwerkingvolledigindehandenvande paho.mqtt.client bibliotheek.Ditishandigbijeenprogrammawaarinwealleenwillenmonitoren.Wekunnennamelijkdeontvangen berichteninde on_message() functieweergevenofloggen.
MQTTpublish
MetdebasisvanMQTTonderdeknie,kunnenwenueenprogrammamakendatookdatapubliceert.Wegaan nuonzeeigenbrokergebruiken.Zorgervoordatjebijeenbrokereenaccountenusernamehebt,waarjemeeop jebrokerinstatiekaninloggen.
Functiesenscope
WanneerjeinPythoneenvariabelegebruikt,diebuitendefunctieisgedefinieerd,danheeftdezevariabelebinnen defunctiedezelfdewaardealsbuitendefunctie.Ziedevolgendecode.
groet = "hey"
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
def toon_groet():
print(groet)
toon_groet()
print(groet)
247 Blok6 MQTT
Deoutputis hey
hey
Deglobalevariabelegroetheeftdewaarde "hey" Wanneerwedefunctie toon_groet() aanroependiedegroet ophetschermweergeeftofrechtstreeksdevariabele groet afdrukken.Deoutputishetzelfde.
(ZONDERBEELD-EN TAALREDACTIE)
Wanneerjeineenfunctieeenvariabeleaanmaakthebjetemakenmetietsdatwordtdelokalescopegenoemd. Devariabeleisalleenbinnendefunctiebekendennietdaarbuiten.Vandaarlokalescope.
groet = "hey"
def toon_groet(): groet = "hello"
print(groet)
toon_groet()
print(groet)
CONCEPT
Wanneerweeenvariabelemetdezelfdenaamalseenglobalevariabelemakeninonzefunctie,danzijndatvoor Pythontweeverschillendevariabelen.Deoutputisalsvolgt:
hello
hey
Wanneerwedeglobalevariabelewillenbenaderen,datisinonsvoorbeelddegroetbuitendefunctie,danmoeten wedataankondigen.Datdoenwemethetkeyword global
groet = "hey"
def toon_groet():
global groet
groet = "hello"
print(groet)
toon_groet()
248
print(groet)
Wegevenmethetkeyword global aandatweeenvariabelebedoelendiebuitendefunctiebestaat.Dusalswe eentoekenningvaneenwaardedoenaandievariabele,danisdathetzelfdealseentoekenningaandevariabele buitendefunctie.Deoutputisdanalsvolgt:
hello
hello
QualityofService
QualityofService(QoS)bijMQTTverwijstnaarhetniveauvanbetrouwbaarheidenleveringsgarantievoorberichten tusseneenMQTT-clienteneenMQTT-broker.MQTTbiedtdrieniveausvanQoS,diewordengebruiktomde betrouwbaarheidvandeberichtenoverdrachttebeheren.
1. Niveau0:Maximaal1xversturen.Berichtenwordenslechtseenmaalverzondenenerwordtgeenbevestiging vandeontvangstdoordeontvangergevraagd.
2. Niveau1:Opzijnminst1xversturen.Berichtenwordenverzondenmeteenverzoekombevestigingvan ontvangst.Kansopdubbeleberichten.
TAALREDACTIE)
Publisher
3. Niveau2:Precies1xversturen.Berichtenwordenverzondenmeteenhandshake-protocolomdeontvangst tebevestigen.
Wehebbeneenpublishernodig,datishetgenewatdatagaatversturen.NuishetmetMQTTmogelijkomzowel publisheralsclienttegelijktezijn.Inhetvolgendevoorbeeldmakenwealleendedataleverendepublisher.
Wezorgenervoordatwemetdebrokerverbondenzijnenvragendanaandegebruikereengetaltussende0en de9.Zodradegebruikeropenterdrukt,danwordthetgetalverstuurdnaardebroker.Latermakenwedeclient diegeabonneerdisoponstopic.
import time
import paho.mqtt.client as mqtt
import json
verbonden = False geabonneerd = False
CONCEPT (ZONDERBEELD-EN
def on_connect(client, userdata, flags, rc, properties=None):
print(f"CONNACK ontvangen met code: {rc}")
global verbonden
verbonden = True
def on_subscribe(client, userdata, mid, granted_qos, properties=None):
249 Blok6 MQTT
print(f"Geabonneerd: {mid} {granted_qos}")
global geabonneerd
geabonneerd = True
def
lees_credentials(path_to_credentials): with open("credentials.json", "r") as credentials: data = json.load(credentials)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
return dict(data)
if __name__ == "__main__":
credentials = lees_credentials("credentials.json")
api_version = mqtt.CallbackAPIVersion.VERSION2
client = mqtt.Client(callback_api_version=api_version)
client.on_connect = on_connect
client.tls_set(tls_version=mqtt.ssl.PROTOCOL_TLS)
user = credentials["login"]["user"]
password = credentials["login"]["password"]
client.username_pw_set(user, password)
url = credentials["broker"]["url"]
port = credentials["broker"]["port"]
client.connect(url, port)
client.on_subscribe = on_subscribe
client.subscribe("learning/#", qos=1)
client.loop_start()
while not geabonneerd: print("Subscribing ...") time.sleep(1)
while not verbonden:
250
print("Connecting ...") time.sleep(1)
stop = False
while not stop: message = input("Enter number 0..9: ") if not "stop" in message:
client.publish("learning/mqtt", payload=message, qos=1) print(f"Sending: {message}") else:
stop = True
client.loop_stop()
import time
import paho.mqtt.client as mqtt
import json
verbonden = False geabonneerd = False
TAALREDACTIE)
Decodeiswatlangerdanonzevooorbeeldcode,maarisopheelveelpuntenhetzelfde.Deverschillenwordenin delentoegelicht.
def on_connect(client, userdata, flags, rc, properties=None):
print(f"CONNACK ontvangen met code: {rc}")
global verbonden
verbonden = True
CONCEPT (ZONDERBEELD-EN
def on_subscribe(client, userdata, mid, granted_qos, properties=None):
print(f"Geabonneerd: {mid} {granted_qos}")
global geabonneerd
geabonneerd = True
Nadeimportziejedevariabelen verbonden en geabonneerd op False Ditzijnzogenaamdeglobalevariabelen, omdatiedereeninditPythonbestanddezevariabelenkanlezeneneenanderekanwaardegeven.De on_connect() ende on_subscribe() functieshebbenhetzelfdedoelalsinonsbasisvoorbeeld.Ophetmoment datzewordenaangeroepenalscallbackfunctie,danzettenhunstatusbooleanop True.
251 Blok6 MQTT
Indevariantgaanwealleinformatiege-encryptversturen.Wemoetenonsookaanmeldenbijdebroker.Deze inlogcredentialswiljenooitinjesourcecode,vandaardatdezeineentekstbestandstaandatnietinhet versiebeheersysteemwordtopgenomen.Daarzijnanderetechniekenvoor.Zekeralsjeineenteamwerkt,isdit belangrijkomgoedteregelen.
def
lees_credentials(path_to_credentials): with open("credentials.json", "r") as credentials: data = json.load(credentials)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
return dict(data)
if __name__ == "__main__":
credentials = lees_credentials("credentials.json")
Dooreenfunctietemaken, lees_credentials() functie,diedecredentialsinleest,omzeiljehetprobleemdat decredentialsooitperongelukinderepositorykomen.Inhettekstbestandkanjeooknogeenhashtoepassen. Datishiervoordeeenvoudnietgebruikt.
api_version = mqtt.CallbackAPIVersion.VERSION2
client = mqtt.Client(callback_api_version=api_version)
client.on_connect = on_connect
NetalsinonsbasisMQTT-programma,wordtdeclientaangemaaktenkoppelenwede on_connect() callback functie.
client.tls_set(tls_version=mqtt.ssl.PROTOCOL_TLS)
user = credentials["login"]["user"]
password = credentials["login"]["password"]
client.username_pw_set(user, password)
url = credentials["broker"]["url"]
port = credentials["broker"]["port"]
client.connect(url, port)
Wegaanindepublisherdeberichtenge-encryptversturen.WegevendataandoorhetTLSprotocoltegebruiken. Vanuitdecredentialsdiewevanafdeharddiskhebbeningelezenkunnenwedeuserenpaswoordzetten.Uit dezelfdecredentialshalenwedeurl,enpoortnummer.Metaldezegegevensverbindenwemetdebroker.
client.on_subscribe = on_subscribe
client.subscribe("learning/#", qos=1)
252
client.loop_start()
Wekoppelendecallbackfunctieenabonnerenonsopdetopic "learning/#".Demeestedingenwordenmet eenQoSniveau1verstuurd.Datdoenwehierook.
Vervolgensmakenwegebruikvan loop_start() omdecommunicatieopgangtebrengen.De loop_start()-functiezorgtervoordateropdeachtergrondnaarberichtenvandebrokerwordtgekeken,de pingwordtverstuurd,etc.Wehoudenhiernogcontroleoveronsprogramma. while not geabonneerd:
print("Subscribing ...")
time.sleep(1)
while not verbonden: print("Connecting ...") time.sleep(1)
Wehebbendevariabelegeabonneerdenverbondenviade on_connect() en on_subscribe().Wanneerdeze nognietzijnaangeroepen,wordtdedesbetreffendewhile-herhalingslusactiefenwordterelkesecondegekeken ofdeverbindingeralis.Desecondevertragingontlastdeprocessorengeefthetprocesdekansomdeverbinding optebouwen.
stop = False
while not stop:
message = input("Enter number 0..9: ")
if not "stop" in message:
client.publish("learning/mqtt", payload=message, qos=1)
print(f"Sending: {message}")
else:
stop = True
client.loop_stop()
Inhetlaatstestukzijnweverbondenmetdebrokerenvragenweaandegebruikeromeencijfervan0tot9te kiezenenintevoeren.Bijhetintikkenwordtergekekenofdegebruikerstopheeftgetikt.Zoja,danstopthet programma.Elkeandereinputwordtnaardebrokerverstuurdviaeenpublishophettopic "learning/mqtt" metalspayloadhetingevoerdegetal.
Alshetprogrammastopt,danwordtookdeclientloopgestopt.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
MQTTclient
AlsdeMQTT-publisheractiefdraait,kunnenwedeclientmaken.
import time
import paho.mqtt.client as mqtt
import json
253 Blok6 MQTT
def
lees_credentials(path_to_credentials): with open("credentials.json", "r") as credentials: data = json.load(credentials)
return dict(data)
def converteer_naar_nummer(string_text): nummer = ""
try:
nummer = int(string_text)
except ValueError:
nummer = 99999
return nummer
def geef_quote(index):
quotes = [
"It always seems impossible until it's done",
"It does not matter how slowly you go as long as you do not stop",
"If you're going through hell, keep going",
"Start where you are. Use what you have. Do what you can",
"The only impossible journey is the one you never begin",
]
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
"When you know what you want, and want it bad enough, you’ll find a way to get it",
"Never let the fear of striking out keep you from playing the game",
"You don’t have to be great to start, but you have to start to be great",
"Whether you think you can or think you can’t, you’re right",
"Dream big and dare to fail"
if 0 <= index < 10:
quote = quotes[index] else:
quote = ""
return quote
def on_connect(client, userdata, flags, rc, properties=None):
254
print(f"CONNACK ontvangen met code: {rc}")
def on_subscribe(client, userdata, mid, granted_qos, properties=None): print(f"Geabonneerd: {mid} {granted_qos}")
def on_message(client, userdata, msg): message = msg.payload.decode("utf-8")
nummer = converteer_naar_nummer(message)
if 0 <= nummer < 10: print(geef_quote(nummer))
else:
print("-")
if __name__ == "__main__":
credentials = lees_credentials("credentials.json")
api_version = mqtt.CallbackAPIVersion.VERSION2
client = mqtt.Client(callback_api_version=api_version)
client.on_connect = on_connect
client.tls_set(tls_version=mqtt.ssl.PROTOCOL_TLS)
user = credentials["login"]["user"]
password = credentials["login"]["password"]
client.username_pw_set(user, password)
url = credentials["broker"]["url"]
port = credentials["broker"]["port"]
client.connect(url, port)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
client.on_subscribe = on_subscribe
client.on_message = on_message
client.subscribe("learning/#", qos=1)
client.loop_start()
255 Blok6 MQTT
while True: time.sleep(0.25)
client.loop_stop()
Hetgrootstedeelvandecodeishetzelfde.Daarstappenwedangewoonoverheen.Voordeuitlegverwijzenwe jenaardePublisher.
Erzijntweefunctiesnieuwindeclientversie.Tebeginnenmetdefunctie converteer_naar_nummer().
def converteer_naar_nummer(string_text):
nummer = ""
try:
nummer = int(string_text)
except ValueError:
nummer = 99999
CONCEPT (ZONDERBEELD-EN
return nummer
TAALREDACTIE)
Dezefunctieconverteerteenstringnaareennummer,metalsextrafunctiedaterwordtgecontroleerdofhetwel omeennummergaat.Wanneerditniethetgevalis,wordtereen99999geretourneerd.
def geef_quote(index):
quotes = [
"It always seems impossible until it's done",
"It does not matter how slowly you go as long as you do not stop",
"If you're going through hell, keep going",
"Start where you are. Use what you have. Do what you can",
"The only impossible journey is the one you never begin",
"When you know what you want, and want it bad enough, you’ll find a way to get it",
"Never let the fear of striking out keep you from playing the game",
"You don’t have to be great to start, but you have to start to be great",
"Whether you think you can or think you can’t, you’re right",
"Dream big and dare to fail"
]
if 0 <= index < 10:
quote = quotes[index]
256
else:
quote = ""
return quote
Detweedenieuwefunctieisdegeef_quote()-functie.Dezeheeftinessentieeenlijstmetquotesinstrings.Als parameterkrijgtdezefunctieeenindexmeeomindelijstnaareenquotetezoekenopdiepositie.Wanneerde indexbinnenderangevalt,wordtereenquotegeretourneerd.Zoniet,wordtereenlegequotegeretourneerd.
client.loop_start()
while True: time.sleep(0.25)
client.loop_stop()
Wanneerdeherhalingslusisgestart,danbegintereenwhileTrue.Hierinwordtelkekeer250msgeslapenomdat vervolgensweertedoen.Ditiseenoneindigelus.Desleepvan250msisomervoortezorgendatdeCPUniet vollediginbeslagwordtgenomen.Doordetimerblijftallesnogresponsief.
Testencommunicatie
Wehebbendepublishergemaakt,gevolgddoordeclient.Nukunnenwedeclientstarten.Dezeverbindtmetde brokerenwachtvervolgenstotereenberichtkomtophettopic "learning/#"
Vervolgensstartenwedepublisher.Ookdezemaaktverbindingmetdebrokerenwachtopinvoervandegebruiker. Degebruikerkaneencijfervan0totenmet9invoerenenopenterdrukken.Weziendanopdeclienteenquote verschijnen.Alsjestoptikt,danstoptdepublisher.Declientblijftdoordraaien.
Jekuntdebeideprogramma'sopdeeigenlaptop/PC/serverrunnen.Jekanzeookelkopeenanderelaptop/PC runnen.Depublisherkanjeookmeerderekerenstarten.Alleslooptviadebrokerindecloud.
6.5 Begrippen
6.6 Testjekennis
Opdracht1
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
WatisMQTT?
Eennetwerkprotocolvoorhetversturenvanberichtentussenapparaten.
Eenprogrammeertaalvoorhetbouwenvanwebapplicaties.
Eendatabasebeheersysteemvoorhetopslaanvangegevens.
Eenbestandsindelingvoorhetcomprimerenvanafbeeldingen.
Opdracht1
HoewordenberichteninMQTTverstuurd?
257 Blok6 MQTT
ViaHTTP-verzoeken.
ViaUDP-pakketten.
ViaTCP-verbindingen.
ViaAMQP(AdvancedMessageQueuingProtocol).
Opdracht1
WatiseenkenmerkendeeigenschapvanMQTTintermenvanbandbreedtegebruik?
Hetminimaliseertbandbreedtegebruikdoorefficiëntgegevenstecomprimeren.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Hetvereistveelbandbreedtevoorhetverzendenvanberichten.
Hetheeftgeeninvloedophetbandbreedtegebruikomdathetalleenwerktvialokalenetwerken.
Hetgebruiktdynamischschalenomzichaantepassenaandebeschikbarebandbreedte.
Opdracht1
WelkeQoS-niveaus(QualityofService)wordenondersteundinMQTT?
AlleenQoS0(atmostonce).
AlleenQoS1(atleastonce).
AlledrieQoS-niveaus:0,1en2.
AlleenQoS2(exactlyonce).
Opdracht1
WatisderolvaneenMQTT-clientinhetMQTT-protocol?
Hetopslaanvanberichtenineencentraledatabase.
HetfungerenalseeninterfacetussendegebruikerenhetMQTT-broker.
Hetversleutelenvanberichtenvoordatzewordenverzondenviahetnetwerk.
Hetbeherenvandeconnectietussendepublisherensubscriber.
Opdracht1
HoewordteenberichtbezorgdbijeensubscriberinMQTT?
Metbehulpvanmulticast-berichten.
Doordeberichtentepublicerennaareencentralecloud-server.
Doordeberichtenteverzendenviaeenpeer-to-peer-netwerk.
DoordeberichtenterouterenviadeMQTT-broker.
Opdracht1
WatgebeurteralseensubscriberofflineiswanneereenberichtwordtgepubliceerdinMQTT?
Hetberichtwordtautomatischopgeslagentotdatdesubscriberonlinekomt.
Hetberichtgaatverlorenenwordtnietmeerafgeleverdbijdesubscriber.
HetberichtwordtopgeslagenineenbufferopdeMQTT-brokertotdatdesubscriberonlinekomt.
HetMQTT-brokerstuurthetberichtdoornaareenanderesubscriber.
Opdracht1
WatiseentypischtoepassingsgebiedvoorMQTT?
258
Real-timemonitoringvansensoreninhetInternetofThings(IoT).
Bestandsoverdrachttussencomputers.
Videostreamingviahetinternet.
Socialenetwerkenenberichtendiensten.
Opdracht1
WelkprotocolwordtmeestalgebruiktvoorbeveiligdecommunicatiemetMQTT?
SSL/TLS
HTTP
TCP
UDP
Opdracht1
WatisderolvandepublisherinhetPublish-SubscribemodelbijMQTT?
Depublisherontvangtberichtenvandebroker.
Depublisherontvangtberichtenvanandereclients.
Depublisherontvangtupdatesvandebrokeroverabonnementen.
Depublisherverzendtberichtennaardebroker.
Opdracht1
Watiseenvoordeelvanhetpublish-subscribe-modelvergelekenmetpoint-to-pointcommunicatie?
Hetisminderschaalbaar.
Hetvereistminderbandbreedte.
Hetisminderflexibel.
CONCEPT
Hetheeftgeenondersteuningvoorasynchronecommunicatie.
Opdracht1
Watiseencallbackfunctieinsoftwareontwikkeling?
Eenfunctiediewordtaangeroepenvoordateenanderefunctiewordtuitgevoerd.
Eenfunctiediewordtaangeroepenvoorennaeenanderefunctie.
Eenfunctiediewordtaangeroepennadateenanderefunctieisuitgevoerd.
Eenfunctiediewordtaangeroepenzonderdateenanderefunctieisuitgevoerd.
Opdracht1
WatiseenMQTT-topic?
(ZONDERBEELD-EN TAALREDACTIE)
EenuniekeidentificatorvooreenMQTT-broker.
EenIP-adresvaneenMQTT-client.
EentekenreeksdiewordtgebruiktomberichtentecategoriserenenrouterenbinneneenMQTT-netwerk.
EenprotocoldatwordtgebruiktvoorhetversleutelenvanMQTT-berichten.
Opdracht1
Watisscopeindecontextvanprogrammeren?
259 Blok6 MQTT
Hetbereikofdezichtbaarheidvaneenvariabelebinneneenprogramma.
Dehoeveelheidgeheugendiewordttoegewezenaaneenvariabele.
Devolgordewaarininstructieswordenuitgevoerdineenprogramma.
Decomplexiteitvaneenalgoritme.
Opdracht1
Watisderolvandeon_connect-functieindeMQTT-client?
Hetcontroleertofdeclientcorrectisverbondenmetdebroker.
Hetwordtaangeroepenwanneerdeclientverbindingmaaktmetdebroker.
Hetwordtgetriggerdwanneereenberichtwordtgepubliceerdnaareenspecifiektopic.
Hetwordtgebruiktomdeverbindingmetdebrokerteverbreken.
6.7 Praktijkopdrachten
Inleidingpraktijkopdracht
Voordepraktijkopdrachtengaanweeensituatieschetsenwaarbijallekennisvandevoorgaandetheoriemoet wordengebruikt.Breekeenprobleemaltijdopinkleinerestukken.Houerrekeningmeedatjeviadecloudwerkt. Somskandeverbindingwegvallenofvergeetjedecommunicatiepartnertestarten.Checkaltijdjeworkflow.
Opdracht1 MQChat
MaakeenchatprogrammametbehulpvanhetMQTT-protocol.
(ZONDERBEELD-EN
TAALREDACTIE)
Alshetprogrammastart,vraagjedenaamvandegebruiker.Hetprogrammastuurteenberichtdatdegebruiker isingelogd.Daarbijwordtdeingevoerdenaamgebruikt.Bijelkvolgendeberichtwordtdenaammeegestuurd.
Degebruikerkanvervolgenselkekeereenberichttikkenenversturendooropentertedrukkennahettikkenvan eenbericht.Hetberichtwordtverstuurdnaardebroker.
CONCEPT
Alserberichtenwordenontvangendanwordendezeophetschermweergegeven,inclusiefdenaamvande afzender.
Alsdegebruiker $$Stop$$ intikt,danstopthetprogramma.Erwordteerstnogeenberichtverstuurdmetde medelingdatdegebruikeruitlogt.
Gebruikvoorhetzendenvaneenchatberichteenanderetopicalsvoorhetontvangenvandeberichtenvan anderen.
Opdracht1 Remotedataselectie
Wegaaneenremotedataselectormaken.Daarvoorhebbenwetweeapplicatiesnodig.Depublisherendeclient. Depublishernoemenwe"Datagenerator".
DataGenerator
Dedatageneratorheefteenfunctiedierandomdatagenereert.Onderstaanddefunctiediejeoverneemtinje applicatie.
import random
260
def sensor_data():
""" Geeft sensor data terug
:returns: Informatie van 4 trillingssensoren
"""
sensor1 = random.random() * 25.3
sensor2 = random.random() * (random.random() * 9.2)
sensor3 = random.random() * 236.83
sensor4 = random.random() * 492.71
return (sensor1, sensor2, sensor3, sensor4)
Jeblijftelke0.25sdedatavanéénvandesensorenversturennaardebroker.Welkesensordataverstuurthangt afvanwatdeclientvraagt.Afhankelijkvanhetgewenstenummerwatdeclientvraagt,geeftdepublisherdedata vandegevraagdesensorteruginhetformaat: <sensornummer>, <sensordata>.Waarbijhetgeentussende<>moetwordenvervangendoordebenodigde informatie.Alstopicgebruikje trillingssensoren voorhetversturenvandesensorwaardenengebruikjeals topic selectie voorhetselecterenvandesensoren.
Alsdeclientnognietsheeftgevraagdwordthetgetal0.0verstuurd.
Client
Declientvraagtaandegebruikerwelksignaal,keuze1t/m4.Zodradegebruikerhetgetalinvoertwordtditgetal naardebrokergestuurd.Vervolgenswordensamplesvandegevraagdesensorontvangenenweergegevenop hetscherm.
Alswenoggeendatahebbenontvangendanhoevenwenietstetonen.
Letop:Deontvangendatamoetvandegevraagdesensorkomen.
Opdracht1 SmartHome(sim)
Wehebbentweeapplicaties.DeeneapplicatiesimuleertdeSmartHome,deanderestuurtdecommando'som deSmartHomeaantesturenviahetMQTT-protocol.
ApplicatieSmartHome
DeapplicatieSmartHomeheeftdevolgendefeatures:
• Lampaan/uit,woonkamer
• Lampaan/uit,keuken
• Koffieapparaataan/uit,keuken
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
• Alarmaan/uit,woning
261 Blok6 MQTT
Vanuiteenapplicatiekunnendefeatureswordenaangestuurd.Elkefeaturediewordtaangestuurdgeeftophet schermweerwatdestatusvandefeatureis.Vervolgenswordterteruggestuurdwatdehuidigestatusisvanalle apparaten.Indevorm <locatie>,<apparaat>, <status> Topicsmart_home
Deandereapplicatiekancommando'ssturennaardeSmartHome.Deapplicatiemoetdancommando'ssturen indevormvan: <locatie>, <apparaat>, <commando>.Waarbijhetapparaat,commandoenlocatiedata moetwordeningevuld.
Vraagaandegebruikerwelkeapparaatmoetwordenbedient.Vervolgenswordtgevraagdwelkcommandomoet wordengestuurd.Waarnadevraagkomtwelkelocatiemoetwordenbereikt.Alsalleinformatiecompleetiswordt deinformatieviadebrokernaardeSmartHomeverstuurd.
6.8 Terugblik
Opdracht1 Terugblik
Zeteenkruisjeindekolomdievoorjouvantoepassingis.
Beoordelingscriteria
JekuntuitleggenwatMQTTis.
Jekuntcommunicerenmeteenbroker.
Jekuntcommunicerentussenverschillendeapplicaties.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Nee Ja
Opdracht1 Terugblik
Denknaoverwatjehebtgedaaninditblok.
a. Noemtweedingenwaaroverjetevredenbent.
1.
2.
b. Noemtweedingendiejedevolgendekeeranderswiltdoen.
1.
2.
c. Vraagjedocenten/ofleermeesteromfeedback.
Tops:
Tips:
262
6.9 Toets
Opdracht1
WelktypecommunicatiewordtondersteunddoorMQTT?
Synchroniseerbarecommunicatie.
Unicastingcommunicatie.
Multicastingcommunicatie.
Publish-subscribecommunicatie.
Opdracht1
WatbetekentdeafkortingMQTT?
MessageQueuingTelemetryTransport.
ManagedQueueTelemetryTransport.
MobileQueueTelemetryTransmission.
MulticastQueueTransportTransmission.
Opdracht1
WatiseenMQTT-broker?
EenapparaatdatwordtgebruiktomgegevensopteslaanineenMQTT-netwerk.
EenpersoondieverantwoordelijkisvoorhetbeherenvanMQTT-netwerken.
Eensoftwaretoepassingdieberichtenontvangt,filtertendoorstuurtineenMQTT-netwerk.
EenprotocoldatwordtgebruiktomapparatenaantesluitenopeenMQTT-netwerk.
Opdracht1
WatishetverschiltusseneenpublishereneensubscriberinMQTT?
Eenpublisherisverantwoordelijkvoorhetontvangenvanberichten,terwijleensubscriberberichtenverzendt.
EenpublisheriseenapparaatdatberichtenverzendtnaarhetMQTT-broker,terwijleensubscriberberichten ontvangtvanhetMQTT-broker.
EenpublisheriseenclientdieverbindingmaaktmethetMQTT-broker,terwijleensubscribereenonderdeel isvanhetMQTT-broker.
Eenpublisherstuurtberichtennaardecloud,terwijleensubscriberberichtenontvangtvandecloud.
Opdracht1
WelkefactorheeftinvloedopdeQoS-niveausinMQTT?
Degroottevandeberichten.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Debetrouwbaarheidvanhetnetwerk.
Desnelheidvandeinternetverbinding.
DebeschikbaarheidvandeMQTT-broker.
Opdracht1
HoewordteenberichtbezorgdbijeensubscriberinMQTT?
263 Blok6 MQTT
Metbehulpvanmulticast-berichten.
Doordeberichtentepublicerennaareencentralecloud-server.
Doordeberichtenteverzendenviaeenpeer-to-peer-netwerk.
DoordeberichtenterouterenviadeMQTT-broker.
Opdracht1
WatisderolvaneenMQTT-brokerinhetMQTT-protocol?
HetverbindenvandeMQTT-clientmetdecloud-server.
Hetontvangen,filterenendoorsturenvanberichtentussenpublishersensubscribers.
Hetopslaanvanberichtenvoortoekomstigeverwerking.
Hetomzettenvanberichtennaareenanderformaatvoordatzewordenafgeleverd.
Opdracht1
WatbetekenthetQoS-niveau"atleastonce"inMQTT?
Hetberichtwordthoogstenséénkeerafgeleverdbijdesubscriber.
Hetberichtwordtnooitafgeleverdbijdesubscriber.
CONCEPT (ZONDERBEELD-EN
Hetberichtwordtmeerderekerenafgeleverdbijdesubscriber.
Hetberichtwordtminstenséénkeerafgeleverdbijdesubscriber.
Opdracht1
TAALREDACTIE)
WatisdestandaardQoS-niveaubijhetpublicerenvaneenberichtinMQTT?
QoS0(AtMostOnce)
QoS1(AtLeastOnce)
QoS2(ExactlyOnce)
QoS3(Reserved)
Opdracht1
Watgebeurteralseenclienteenberichtpubliceertopeenbepaaldonderwerp(topic)inhetPublish-Subscribe model?
Hetberichtwordtdirectafgeleverdbijalleclientsdiegeabonneerdzijnopdatonderwerp.
Hetberichtwordtalleenafgeleverdbijdebroker.
Hetberichtwordteerstopgeslagenopdebrokerenvervolgensafgeleverdbijalleclientsdiegeabonneerd zijnopdatonderwerp.
Hetberichtwordtalleenafgeleverdbijclientsdieverbondenzijnviaeenbeveiligdeverbinding.
Opdracht1
WatiseenkenmerkvansubscribersinhetPublish-SubscribemodelbijMQTT?
Subscribershebbengeencontroleoverwelkeberichtenzeontvangen.
Subscriberskunnenselectiefabonnerenopspecifiekeonderwerpen(topics).
Subscribersontvangenalleberichtendiewordengepubliceerdopdebroker.
Subscriberskunnengeenberichtenpublicerennaardebroker.
Opdracht1
Watiseenbelangrijkvoordeelvanhetgebruikvancallbackfuncties?
264
Callbackfunctiesmakenhetmogelijkomsynchronetakenuittevoeren.
Callbackfunctiesmakenhetmogelijkomasynchronetakenuittevoeren.
Callbackfunctiesmakenhetmogelijkomfoutentevoorkomentijdensdeuitvoeringvaneenprogramma.
Callbackfunctiesmakenhetmogelijkomfunctiesteverbergenvoorexternetoegang.
Opdracht1
WatgebeurterwanneereenberichtwordtgepubliceerdnaareenMQTT-topicwaaropeenclientisgeabonneerd?
Hetberichtwordtalleenafgeleverdbijclientsdiezichopdatmomentactiefhebbengeabonneerdopdat topic.
Hetberichtwordtdirectafgeleverdbijdeabonnerendeclient.
HetberichtwordtopgeslagenineenbufferopdeMQTT-brokertotdatdeabonnerendeclientonlinekomt.
Hetberichtwordtgenegeerdalsdeabonnerendeclientnietactiefis.
Opdracht1
Watgebeurteralseenvariabelebinneneenfunctiewordtgedefinieerdzonderhetgebruikvanhet'global'keyword inPython?
Devariabelewordtbeschouwdalseenlokalevariabele,tenzijdezeeerderisgedefinieerdalsglobaal.
Devariabelewordtautomatischgepromoveerdtoteenglobalevariabele.
Devariabelewordtalleenlokaalbinnendefunctiegebruiktenheeftgeeninvloedopvariabelenbuitende functie.
Devariabelekannietwordengebruiktbinnendefunctieomdatdezebuitendescopevalt.
Opdracht1
Watishetdoelvandeon_messagefunctieindeMQTT-client?
Hetwordtuitgevoerdwanneerdeclientzichabonneertopeennieuwtopic.
Hetwordtgebruiktomberichtenteverzendennaardebroker.
Hetwordtaangeroepentelkenswanneerdeclienteennieuwberichtontvangtvandebroker.
Hetwordtgebruiktomdeverbindingtussendeclientendebrokertetesten.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
265 Blok6 MQTT
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
266
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Blok7
ObjectOriëntedProgramming
Objectgeoriënteerdprogrammeren(OOP)isbijzonderomverschillenderedenen.
• Hetismodulairdoorhetgebruikvanklassenenobjecten.Complexesystemenkunnendaardoorworden opgedeeldinkleinereherbruikbarestukken.
• Hetisflexibeldoorhetgebruikvanconceptenalsoverervingenpolymorfism,waaroordevelopersveelflexibeler zijnindemanierenwaaropzeeenapplicatieontwikkelen.
• Hetisabstract,enheeftdaarmeedekrachtomcomplexiteitteverbergenenalleendedetailsdiedegebruiker daadwerkelijknodigheefttetonen.
DoordezeeigenschappenisOOPeenkrachtigparadigmagewordenvoorhetontwikkelenvansoftware.Van desktopapplicatiestotwebontwikkelingenvanembeddedsystementotmobieleapps.
Leerdoelen
1. Jekuntuitleggenwatobjectenzijn.
2. Jekuntdevoordelenvanobjectoriëntedprogramminguitleggen.
3. JekuntOOPtoepassenineenapplicatie.
Opdracht1 OriëntatieopdrachtObjectOriëntedProgramming
a. Eengamecontrollerheeftknoppen,thumb-stickseneenskin.Ditzijneigenschappenvandegamecontroller. Demotortjesindegamecontrollerzorgenvoorhettrileffecttijdenshetgamen.Hettrileffectiseengedragvan degamecontroller.
Kijknueensinjekamerrondenkieseenobjectengeefeenvergelijkbarebeschrijving.Benoemenkele eigenschappenvanhetobject,enhetwathetobjectkandoen.
Tip,kijknaareenappparaatdatietsdoet.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
b. Kieseenappopjesmartphone.Watzijnenkelefunctiesvandieappdiejezoukunnentoewijzenaanobjecten?
Tip,denkaandeverschillendeitemsophetscherm.
7.1 OpdrachtenObjectOriëntedProgramming
Opdracht2 ObjectOriëntedProgramming
RaadpleegzonodigdetheorieoverObjectOriëntedProgramming.
a. Welkevandevolgendeconceptenzijnkenmerkendvoorobjectgeoriënteerdprogrammeren?Erzijnmeerdere antwoordengoed.
Overerving
Polymorfisme
Abstraction
While-herhalingslus
Encapsulation
b. Watisinheritance(overerving)inOOP?
Hetvermogenomeenobjecttemakenopbasisvaneenklasse.
Hetproceswaarbijeenklassewordtopgesplitstinmeerderekleinereklassen.
Hetproceswaarbijeenklasseattributenenmethodenerftvaneenandereklasse.
Hetproceswaarbijmethodenvaneenklassewordentoegevoegdaaneenandereklasse.
c. WatisencapsulatieinhetkadervanOOP?
Hetprocesvanhettoewijzenvanattributenaaneenobject.
Hetvermogenommethodenvaneenklassetehergebruikeninandereklassen.
Hetvermogenomverschillendeklassentecombinerentotéénenkeleklasse.
Hetverbergenvandeinterneimplementatiedetailsvaneenobjectenhetbeperkenvandetoegangtot zijngegevens.
268
d. WatispolymorfismeinOOP?
Hetproceswaarbijeenklasseattributenenmethodenerftvaneenandereklasse.
Hetvermogenomobjectenvanverschillendeklassentecombinerentotéénenkelobject.
Hetproceswaarbijeenklassewordtopgesplitstinmeerderekleinereklassen.
Hetvermogenommethodenmetdezelfdenaamtedefiniëreninverschillendeklassen.
e. NoemtweevoordelenvanOOP.
f. Watiseenmanieromobjectentevindenineenspecificatie?
7.2 OpdrachtenKlasseinPython
Opdracht3 KlasseinPython
RaadpleegzonodigdetheorieoverKlasseinPython.
a. WatiseenklasseinPython?
Eeninstantievaneenobject.
Eenblauwdrukvoorhetcreërenvanobjectenmetbepaaldeeigenschappenenmethoden.
Eenverzamelingvanfuncties.
Eenspeciaalsoortvariabelediegebruiktwordtomgegevensopteslaan.
b. Watishetdoelvaneen __init__() inPython?
Hetvernietigenvaneenobject.
Hetverwijderenvanoverbodigemethodenuiteenklasse.
Hetbepalenvandescopevanattributenenmethodenineenklasse.
Hetinitialiserenvaneenobjectmetstandaardwaarden.
c. WatishetverschiltusseneenklasseeneenobjectinPython?
Eenklasseiseenabstracterepresentatie,terwijleenobjecteeninstantieisvandierepresentatie.
Eenklasseiseenspecifiekexemplaarvaneenobject.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Eenklasseheeftalleenmethoden,terwijleenobjectalleenattributenheeft.
Erisgeenverschil,determenwordendoorelkaargebruiktinPython.
d. Geefeencodevoorbeeldvaneenklassevaneendeurmetslot.
e. Geefeencodevoorbeeldvaneenobjectwaarjeklassevariabelenzougebruiken.
Denkaanconstanten,maximaleaantallen.
269 Blok7 ObjectOriëntedProgramming
7.3 OpdrachtenPyGame
Opdracht4 PyGame
RaadpleegzonodigdetheorieoverPyGame.
a. WatisPygame?
Eenprogrammeertaal.
Eenbesturingssysteemvoorgame-ontwikkeling.
EenPython-bibliotheekvoorhetmakenvanvideogames.
EengamegemaaktinPython.
b. Watisdefunctievandeclock.tick()methodeinPygame?
Hetmaakteennieuweklokaanvoorhetspel.
Hetzorgtvoordepositioneringvanspritesophetscherm.
Hetcontroleertdetoetsaanslagenvandespeler.
Hetregeltdeframesnelheidvanhetspel.
c. Watisdefunctievandepygame.event.get()methodeinPygame?
Hethaaltallegebeurtenissenuitdegebeurteniswachtrij.
Hetcreëerteennieuwvenstervoorhetspel.
Hetlaadtafbeeldingenengeluidenvoorhetspel.
Hetzetdeframesnelheidvanhetspel.
d. GeefineigenwoordenaanwatdegameloopinPyGamedoet.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
e. WatzijneventsinPyGame?
7.4 TheorieObjectOriëntedProgramming
ObjectOriëntedProgramming
Pythoniseentaalwaarinjeookobjectgeoriënteerdkuntprogrammeren.Daarbijwordendeconceptenvaneen objectgeoriënteerdetaalondersteund.Hetgaatnamelijkommeerdaneenaantalkeywordsindetaal.Hetgaat omzakenals:
• Encapsulation,inkapselinginhetNederlands,verbergtdeinternestatusvanhetobjectvoorandereobjecten. Dedetailsvandewerkingwordenuithetzichtgehouden.Ditkunjevergelijkenmethetrijdenopeenelektrische fiets.Omopeenelektrischefietsterijdenishetalleennoodzakelijkomtewetenhoewemoetensturen, trappen,eventueelmetelektrischeondersteuning,enhoewemoetenremmen.Hetisnietnodigomteweten hoedespanningvandeaccuervoorzorgtdatdemotorgaatdraaien.Ofhoeonzetrapkrachtbepaalthoeveel ondersteuningwekrijgenineenbepaaldeversnelling.Dezeinformatieisvooronsverborgen.
270
• Inheritance,overerveninhetNederlands,zorgtvooreen‘iseen’relatietussenobjecten.Hetchild-object (kindobject)erftalledataenhetgedragvandeparent-object(ouderobject).Ditkunjevergelijkenmetdefiets alsvoertuig.Defietsiseenvoertuigenerftdaardanalleeigenschappenvan.Defietsiseenchild-objectvan voertuig.Heterftdanbijvoorbeeldhetgedragsturenenremmen.Hetkanechterdeimplementatie(de uitvoering)vanhetgedragveranderen.Hetsturengaatandersdanineenauto.
• Polymorphism,polymorfismeinhetNederlands,betekentveelvormigheidofmeerderegezichtenhebben.
Hetiseeneigenschapvaneenobject,waardoorhetgebruiktkanwordenalsofheteenanderobjectis.Wanneer wekijkennaareenfiets,danbehandelenwedezealseenvoertuig.Eenauto,brommerofscooterbehandelen weookalsvoertuigen.Zekunnenallemaalrijden,sturenenremmen.Ondanksdeverschillenhebbenzeeen gelijkwaardigeinterface.Deuiteindelijkeuitvoeringvaneenbepaaldefunctiekanverschillen.Eenhandrem opeenfietseneenpedaalremineenauto.Wekunnendefietsdusalsfietsbehandelenmaarookalsvoertuig, vandaarhetideevanmeerderegezichten.
Voordelen
DezeconceptenzorgenervoordatOOPverschillendevoordelenbiedttenopzichtevanprocedureelprogrammeren:
• Modulariteit.Wanneerobjectensamenwerkenencommunicerenmetandereobjecten,dangajesnellerde objectenalsLegoblokjeszien.Jekuntdanmodulairwerken,jezietwelkeblokjesaanelkaarkunnenworden gekoppeld.Eenobjectkandaneenvoudigwordenuitgewisseldmeteenanderobject.
• Afscherming.Hierdoorishetvoorandereobjectennietbelangrijkhoehetobjecttoteenbepaaldeconclusie isgekomen.Deinternelogicakanwordengewijzigd,terwijlhetobjectnaarbuitentoehetzelfdegedragblijft vertonen.
• Codehergebruik.Ditgebeurtbijnavanzelfomdatjeobjecteneengedefinieerdeenafgebakendetaakgeeft.Je kandezetaakineenandereapplicatiezoweergebruiken.
• Uitbreidbaarheid Ditkomtvooraldoornieuwemanierenvansamenstellen,zoalsoverervenenhetcreëren vannieuwerelatiestussenobjecten,diejekuntgebruikenmetbestaandeobjecten.
Nadelen
Objectgeoriënteerdprogrammerenheeftookeenaantalnadelen.
• Deprogramma’szijnmoeilijkomgoedteontwikkelen.Echteproblemendiemoetenwordenopgelostpassen nietaltijdpreciesinobjecten.
• Kleineapplicatieskunnenvaakbeterprocedureelwordenopgezetinplaatsvaneencompleet objectgeoriënteerdeapplicatie.
• Debasisprincipeszijnergbelangrijkenmoetengoedwordentoegepastwiljeeensuccesvolobjectgeoriënteerde applicatiekunnenbouwen.
Objecten,klasseneninstanties
Vaakwordtergedachtdatdeobjectenbinneneenobjectgeoriënteerdeapplicatiealtijdovereenkomenmet tastbareobjectenuitdewerkelijkefysiekewereld.Ditisniethetgeval.Erzijnookabstracteobjecten,waaronder tijd,spelelement,compositie,etc.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Wanneerjeeenfunctionelespecificatievaneenapplicatiehebt,danishetzoekennaarzelfstandigenaamwoorden eenmanieromdeobjectenvoorjeapplicatietevinden.Doordezewoordenineenlijsttezetten,krijgjeeenidee vandemogelijkeobjecten.
Objecten
Eenobjectisdegeneriekebeschrijvingvaneending.Eenobjectheefteentoestand(data)engedrag(methoden). Eenfietsiseenobjectenheefteenstatus(actuelesnelheid,huidigeversnelling),maarookgedrag(remmen, sturen).
271 Blok7 ObjectOriëntedProgramming
Klassen
Vaneenobjectmakenweindeprogrameertaaleenklasse(class).Ditiseentemplatevanhetobject.Wegeven hierinaanwelkedatahetobjectheeftenwelkemethodenerzijn.Jekuntdeklassevergelijkenmeteen koekjesvorm,ombijvoorbeeldspeculaaspoppetjestemaken.
CONCEPT
(ZONDERBEELD-EN TAALREDACTIE)
Instanties
Alsweeenobjectwillengebruikenineenprogrammadanmakenweeeninstantievandeklasse.Deinstantieis hetconcreteuniekeobjectgebaseerdopjeklasse.Ditishetspeculaaspoppetjedateruitzietalshetvormpje waarmeehijisgemaakt.
Figuur 6.1 Een klasse, speculaaskoekjes vorm
272
CONCEPT
(ZONDERBEELD-EN TAALREDACTIE)
Connecties
Wanneerweeenobjectgeoriënteerdeapplicatiewillenontwikkelendanmoetenwealtijdnadenkenoverde klassendiewenodighebben.Wehaddenaleenlijstmetmogelijkekandidaatobjecten,waarbijwekunnenkijken welkeklassenwedaaruitkunnenhalen.
Deanderebelangrijkevraagis,hoegaanwedezeklassenmetelkaarverbinden?Erzijnviersoortenverbindingen mogelijk:
Figuur 6.2 Een instantie, het gemaakte speculaaskoekje op basis van speculaaskoekjesvorm
273 Blok7 ObjectOriëntedProgramming
• Composition,compositieinhetNederlands.Hiermeewordthetsamenstellenvanklassendoormiddelvan connectiestoteengrotergeheelbedoeld.Deklassewaarweeenconnectiemeehebbenbehoortooktotonze klasse.Zewordenaangemaaktenhebbendezelfdelevensduur.Deeneklassekannietzonderdeandere klasse.Dewielenvanonzefietsbehorenbijdefiets.Zonderdewielenishetgeenfijnefiets.
• Aggregation,aggregatieinhetNederlands.Hetsamenvoegenvandelentoteenverzamelingdiealsgeheel zinvolis.Eenaggregatietussendefietsendeeigenaarbetekentdatdeklassefietseeninstantieheeftvan klasseeigenaar.Deeigenaarkanechterzonderdefietsbestaan.Netzoalsdefietszondereigenaarkanbestaan. Sterkernog:defietskanvaneigenaarwisselen.
• Association,assosiatieinhetNederlands.Eenrelatieofverbindingtussenklassen.Defietskaneveneen instantievaneenanderegebruikerhebben.Meestalgaathetomeenkortstondigerelatie,bijvoorbeeldbij valetparkeren.Defietsheeftdantijdelijkeenanderegebruiker,diehemnaareenparkeerplaatsbrengt.
• Inheritance/generalisation,overerving/generalisatieinhetNederlands.Defietsiseenspecialeversievan voertuig.Defietsishetkindvandevoertuig-klasse,welkealsouderklasseoptreedt.
KlasseinPython
Wewetennuwatobjectgeoriënteerdprogrammerenis,daterklassenenobjectenzijnenhandigengoedhetwel nietis,maarhoezietzo'nklasseerdaninPythonuit?
class Computer:
def __init__(self, merk, type, kleur):
self._merk = merk
self._type = type
self._kleur = kleur
(ZONDERBEELD-EN
TAALREDACTIE)
CONCEPT
InhetvoorbeeldiseenklasseComputerweergegeven.EenklasseinPythonwordtgedefinieerdmethetkeyword class gevolgddoordenaamvandeklasse.Denaambegintvolgensconventiemeteenhoofdletterenvolgthet pascalcase-principe.Nadenaamkomteendubbelepunt,omaantegevendatereencodeblokvolgt.Ditisde werkelijkeinhoudvandeklasse.
Wanneerwevaneenklasseeeninstantiemaken,endezedusgeïnstantieerdwordt,danmoetditresulterenin eengeldigobject.Datbetekenteenobjectklaarisvoorgebruik,metallestartwaardencorrectingevuld.Wedoen ditdooreen __init__()-functieaantemaken.Dezemethodewordtaltijduitgevoerdophetmomentdathet objectwordtgeïnstantieerd.
Wanneerjegeen __init__()-methodeaanmaaktdangebruiktPythoneendefault __init__() vandebasisklasse. De __init__()-methodekan0ofmeerparametersmeekrijgen.Inhetvoorbeeldwordenerdrieparameters meegegevenexclusief self,namelijk: merk, type en kleur Demeegegevenparameterswordentoegekendaan deinternevariabelevandeklasse.Ditisteherkennenaanhet self-keyword.Denamenvandeinternevariabelen vaneenklassehebbenalsconventiedatzebeginnenmeteenunderscore, self._merk, self._type, self._kleur.
Deparameter self,diewordtmeegegevenaandemethode,verwijstnaardeinstantievandeklasse.Wekomen hierinparagraafKlasseeninstantievariabelennogopterug.
Methoden
Eenklasseheeftvaakmethoden.Ditzijnfunctiesdiehorenbijdeinstantievandeklasse.Viademethodenkunnen weinteractiemetdeinstantiehebben.Wekunnendeinstantieviademethoden‘gedrag’meegeven.
274
Eenmethodewordtgedefinieerdmet def,netalsbijeenfunctie.Denaamvandemethodevolgthetzelfdeprincipe alsbijdefuncties.Allesmetkleinelettersendeverschillendewoordenwordengescheidendooreenunderscore.
class Computer:
def __init__(self, merk, type, kleur):
self._merk = merk
self._type = type
self._kleur = kleur
self._opgestart = False
def start_op(self):
""" Start de computer op """
self._opgestart = True print("Opgestart")
def sluit_af(self):
""" Sluit de computer af """
self._opgestart = False print("Afgesloten")
Invoorgaandvoorbeeldzienwedemethode start_op(self).Demethodeheeftvolgensdeconventiealseerste parameter self Demethodewordtdaardooreenmethodebehorendebijeeninstantie.Ditbetekentdatde methodeactieskanuitvoerenopdehuidigeinstantie.
Invoorgaandvoorbeeldzienwedatdeinternevariabele self._opgestart op True wordtgezetalsdemethode wordtaangeroepen.Vervolgenswordtdenieuwestatusophetschermweergegeven.
Deanderemethode sluit_af(self) werktopdezelfdemanier.Deinternevariabelewordtop False gezeten denieuwestatuswordtophetschermafgedrukt.
class Computer:
def __init__(self, merk, type, kleur):
self._merk = merk
self._type = type
self._kleur = kleur
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
self._opgestart = False
def start_op(self):
""" Start de computer op """
self._opgestart = True print(f'Opgestart {self._merk} {self._type} {self._kleur}')
275 Blok7 ObjectOriëntedProgramming
def sluit_af(self):
""" Sluit de computer af """
self._opgestart = False print(f'Afgesloten {self._merk}')
mijn_computer = Computer('Microsoft', 'Surface Pro', 'Grijs') mijn_computer.start_op() mijn_computer.sluit_af()
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Omdeklassetekunnengebruiken,moetenweereenobjectvanmaken.Ditdoenwedoordeklasseteinstantiëren. Wegevendedrieparametersmeeenkennendeinstantievanonze Computer klassetoeaandevariabele mijn_computer.
Devariabele mijn_computer heeftnueeninstantievandeklasse Computer Vervolgensroepenwemethoden start_op() en sluit_af() aan.Aandeuitvoerzienwedatdemethodendeinformatieophetschermhebben gezet.
Opgestart Microsoft Surface Pro Grijs
Afgesloten Microsoft
Hetisnueenvoudigommeerdereobjectentemakenwaarbijelkeinstantiehaareigeninstellingenbehoudt.In hetvolgendevoorbeeldgaanweintotaaldrieComputer-instantiesmaken,metelkhuneigen merk, type en kleur
class Computer:
def __init__(self, merk, type, kleur):
self._merk = merk
self._type = type
self._kleur = kleur
self._opgestart = False
def start_op(self):
""" Start de computer op """
self._opgestart = True print(f'Opgestart {self._merk} {self._type} {self._kleur}')
def sluit_af(self):
""" Sluit de computer af """
self._opgestart = False print(f'Afgesloten {self._merk}')
276
mijn_computer = Computer('Microsoft', 'Surface Pro', 'Grijs') game_computer = Computer('Dell', 'XPS', 'Zwart/Rood') werk_computer = Computer('BTO', 'X-Book', 'Antraciet')
mijn_computer.start_op() game_computer.start_op() werk_computer.start_op()
mijn_computer.sluit_af() game_computer.sluit_af() werk_computer.sluit_af()
VandeComputer-klassezijndrieinstantiesgemaakt,namelijk: mijn_computer, game_computer en werk_computer.Elkeinstantieheefthaareigenparametersmeegegevenbijhetinstantiërenvandeklasse.Bij deaanroepvandeinstantiemethodenzienwedatterug.Elkeinstantiereageertmethaareigen merk, type en kleur.
Opgestart Microsoft Surface Pro Grijs
Opgestart Dell XPS Zwart/Rood
Opgestart BTO X-Book Antraciet
Afgesloten Microsoft
Afgesloten Dell
Afgesloten BTO
Klasseeninstantievariabelen
TAALREDACTIE)
WehebbenbijklasseninPythononderanderedemogelijkheidomklassevariabeleneninstantievariabelente maken.Beidehebbeneenspecifiekdoel.Hetisbelangrijkomhetonderscheidteweten,zodatjeheteffectiefkan inzetten.
Eenklassevariabeleiseenvariabelediebijdeklassehoort.
class Computer:
scherm = 'Full HD'
CONCEPT (ZONDERBEELD-EN
laptop = Computer()
desktop = Computer()
print(laptop.scherm)
print(desktop.scherm)
Ditgeeftalsoutput:
277 Blok7 ObjectOriëntedProgramming
Full HDFull HD
Wanneerweeenvariabeleaanmakenzonder self ervoorkrijgenweeenklassevariabele.Dezevariabelehoort bijdeklasse.Elkeinstantiedievandezeklassewordtgemaakt,krijgtexactdezelfdewaardeindeklassevariabele.
class Computer:
scherm = 'Full HD'
def __init__(self, merk): self._merk = merk
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
laptop = Computer('Surface') desktop = Computer('Dell') print(laptop._merk)
print(laptop.scherm)
print(desktop._merk)
print(desktop.scherm)
Ditgeeftalsoutput:
Surface
Full HD
Dell
Full HD
Wanneerwedeinitialisatie __init__() methodetoevoegen,dankunnenwehetmerkvandecomputeraande instantiedoorgeven.Hetmerkwordtopgeslagenindevariabele self.merk Doordathier self voorstaatgaat hetomeeninstantievariabele.Dewaardevandevariabeleisvoorelkeinstantieuniek.
Wezieninhetvoorbeelddatde laptop ende desktop vaneenandermerkwaren.Bijdeprintstatementsvan hetmerkwerdditbevestigd.Deprintstatementsvanhetschermlatenziendatbeideinstantiesdezelfdewaarde hebben.
class Computer:
scherm = 'Full HD'
def __init__(self, merk): self._merk = merk
def scherm_type(self, nieuw_scherm): Computer.scherm = nieuw_scherm
laptop = Computer('Surface') desktop = Computer('Dell') print(laptop._merk)
278
•
print(laptop.scherm)
print(desktop._merk)
print(desktop.scherm)
desktop.scherm_type('Ultra Wide')
print(desktop.scherm)
print(laptop.scherm)
Ditgeeftalsoutput:
Surface
Full HD
Dell
Full HD
Ultra Wide
Ultra Wide
Invoorgaandvoorbeeldzienwedemethode scherm_type()toegevoegdaandeklasse Computer.Indeze methodewordtdewaardevandeklassevariabelegewijzigdnaardemeegegevenwaardevia nieuw_scherm Wanneerwenuaanverschillendeinstantiesvragenwatdewaardevandeklassevariabele scherm is,dankrijgen wedenieuwewaardeUltraWidetezien.Alleinstantiesgebaseerdopdezeklasseziendezelfdewaarde.Datis hetverschiltusseneeninstantievariabeleeneenklassevariabele.
Letop:wanneerweindemethode scherm_type() hetvolgendehaddengedaan: scherm = nieuw_scherm
Danwas scherm eeninstantievariabelegewordenendusuniekvoordeinstantie,maarnietmeerbijalleinstanties gelijk.Wanneerjedewaardevaneenklassevariabelewilveranderenvooralleobjecten,danmoetjeaande variabelereferenviadeklasse,alsin: Computer.scherm.
PyGame
Pygameiseenpopulaireenkrachtigebibliotheekvoorhetontwikkelenvangamesenmultimedia-toepassingen indeprogrammeertaalPython.Hetbiedtfunctionaliteitvoorhetmakenvaninteractieveapplicaties,waaronder hetweergevenvanafbeeldingen,hetafspelenvangeluid,hetregistrerenvangebruikersinvoerenhetbeheren vanspritesenanimaties.InessentieisPyGameeengameengine.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Eengameenginewordtgebruiktvoorhetontwikkelenvangamesensimulaties.Vaakiseengameengine opgebouwduitmeerderecomponenten.Bijvoorbeeld:
• Renderingenginevoordegrafischebeelden
• Renderingenginevoorde3D-audiogeluiden
• Physicsenginevooro.a.derealistischezwaartekrachteffectenenbotsingen
• Abstractievandeonderliggendehardware
• Inputvoorverschillendebronnen,muis,keyboard,controller,etc.
• Netwerkmogelijkheden
• Scriptingvooranimatiescenes
279 Blok7 ObjectOriëntedProgramming
Populairegameengineszijn:CryEngine,UnrealEngine,Frostbite2.Dezezijnechternietdirectgeschiktvoor Python,maarvoorC++.GameenginesvoorPythonzijnonderandere:PyGame,Panda3Denpyglet.
Nietelkegameengineheeftalleonderdelenenerzijnenginesmetmeerdandebeschrevenonderdelen.Elke engineheefthaarsterkeenzwakkepunten.Sommigeengineszijngeoptimaliseerdvoorgrotespeelvelden,andere weervoorspecialegrafischelichteffecten.Hethoofddoelisiniedergevalhetverlichtenvandetaakvande gameontwikkelaar.
VoorhetontwikkelenvandegamesinditboekmakenwegebruikvanPyGame.Dezegameenginemaaktgebruik vanSDL(SimpleDirectMediaLayer).MetPyGamekunnenweeenvoudig2D-gamesmakendieeengrafische interfacehebbenenmethettoetsenbord,muisenjoystickkunnenwordenaangestuurd.Veeldetailzakenworden doorPyGamevooronsopgelost,waaronderhetladenvanafbeeldingen,afspelenvangeluidenenhetmanagen vanevents.
Ondanksallehulpblijfthetontwikkelenvaneengameeenhoopwerk.Helemaalwanneerhetooknogeenleuke gamemoetworden.Desalnietteminvindendevelopershetmakenvaneengameeenontzettendleukeervaring.
InstallerenvandePyGame-bibliotheek
CONCEPT (ZONDERBEELD-EN
VoordatwedePyGame-bibliotheekgaaninstallerenmakenweeersteennieuwevirtualenvironmentaan,zodat onzeinstallatievandePyGame-bibliotheekgeenandereinstallatiesindewegzit.Hoeditmoet,hebbenweal gezieninBlok3Bestanden.
NadatwedevirtualenvironmenthebbenaangemaaktkunnenwedePyGamebibliotheekinstalleren.DePyGame bibliotheekheetpygameenkanviadePyCharmoptieswordengeinstalleerd.Hoeditinzijnwerkgaathebben weeerdergedaaninBlok3Bestanden.
Animatie
TAALREDACTIE)
PyGamemoetwetendatwehetgaangebruiken.Ditmoetenwedus‘vertellen’.Daarnaastgaanwebepaalde takendoorPyGamelatenregelen,waaronderaansturingvanhetscherm,deeventsenhettoetsenbord.
WezulleneerstdebasisprincipesvanPyGamedoorlopen,omeenideetekrijgenhoewePyGamekunnengebruiken. Weprintenhetwelbekende‘HelloWorld’,maardanmetanimatie.
import pygame pygame.init()
schermafmeting = breedte, hoogte = 640, 480
scherm = pygame.display.set_mode(schermafmeting)
klok = pygame.time.Clock()
font_naam = pygame.font.get_default_font()
font = pygame.font.Font(font_naam, 18)
tekst = font.render("Hello, World", True, (0, 128, 0))
tekst_afmeting = tekst.get_width(), tekst.get_height()
280
stop = False
tekst_hoogte = 0
horizontale_positie = 0
while not stop: for event in pygame.event.get():
if event.type == pygame.QUIT: stop = True
if tekst_hoogte < hoogte - tekst_afmeting[1]: tekst_hoogte += 1 else:
if horizontale_positie < breedte - tekst_afmeting[0]: horizontale_positie += 1
scherm.fill((0, 0, 0))
scherm.blit(tekst, (horizontale_positie, tekst_hoogte)) pygame.display.flip()
klok.tick(60)
Hetvoorbeeldiseenanimatie,waarbijdetekst ‘Hello World’ naarbenedenscroltomvervolgenslangsde onderzijdenaarrechtstescrollen.Wezullenditinstukkenbrekenendedelenbespreken.
import pygame pygame.init()
schermafmeting = breedte, hoogte = 640, 480 scherm = pygame.display.set_mode(schermafmeting)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
ZoalsaangegevenmoetPyGameeerstwordengeïnitialiseerdvoordatwedefunctionaliteitenkunnengebruiken. EerstwordtdePyGame-modulegeïmporteerd,waardoorwedePyGamefunctionaliteitaanroepen.
VervolgenswordtPyGamegeïnitialisseerd,afhankelijkvanhetplatform,Windows,Linux,MacOS,wordendejuiste zakenvoorbereidindebibliotheek
281 Blok7 ObjectOriëntedProgramming
Delaatstetweeregelsmakeneengrafischschermaan,meteenvlakwaarweopkunnentekenen.Ditwordtbinnen PyGamede Surface genoemd.Deafmetingenwordengegevenalseentuple.Deregelwaardevariabele schermafmeting wordtgemaaktisinteressant.Hierwordeneenaantalzakenbijelkaartoegepast.Indeeerste afbeeldingwordtunpackinggetoond.Ditishetuitelkaarhalenvaneenvariabelelijst(640, 480) endeseparate waardeninapartevariabelenstoppen.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Figuur 6.3 Unpacking van waarden
Wanneerwevanrechtsnaarlinkskijken,danwordtde480aandevariabelehoogtetoegekend.Dewaarde640 wordtaandevariabelebreedtetoegekend.Ditwordtunpackinggenoemd.
Breedteenhoogtewordensamenaandevariabeleschermafmetingtoegekend.Ditwordtpackinggenoemd. DatagescheidendooreenkommawordtinPythonalseentuplebehandeld.Vandaardatschermafmetingeen tuplemetdewaarde(640,480).
klok = pygame.time.Clock()
font_naam = pygame.font.get_default_font()
font = pygame.font.Font(font_naam, 18)
tekst = font.render("Hello, World", True, (0, 128, 0))
tekst_afmeting = tekst.get_width(), tekst.get_height()
DeklokvanPyGamewordttoegekendaaneenlokalevariabele.Hierkomenwelateropterug.
Vervolgenswordthetbasisfontgekozen.Defunctielevertdenaamopvanhetbasisfont.Defontszijnnamelijk opelkplatformandersennietelkplatformheeftallefontsbeschikbaar.Gebruikerskunnendaarnaastookzelf fontsophunsysteeminstalleren.
Hetfontwordtaangemaaktdoordenaamvanhetfontoptegeveneneenafmetingvoorhetfont.Alsdeopgegeven naamvanhetfontnietbestaat,danwordterteruggevallenophetdefaultfont.Bijdeontwikkelingvoor multi-platformgebruikishetverstandigomdebeschikbarefontsoptevragenendaareenselectieuittemaken. Debeschikbarefontskunjeopvragenmetdefunctie pygame.font.get_fonts() Ditleverteenlijstmetnamen vanbeschikbarefontsophethuidigeplatform.Eennaamvaneenfontuitdezelijstkandanwordengebruiktbij deselectievanhetfont.JekanditeenvoudigensnelindeREPLtesten.
>>> import pygame pygame 1.9.4
Hello from the pygame community. https://www.pygame.org/contribute.html
>>> pygame.font.get_fonts()
['arial', 'arialblack', 'bahnschrift', 'calibri', 'cambriacambriamath', 'cambria', 'candara', 'comicsansms', 'consolas', 'constantia', 'corbel',
282
'couriernew', ... 'opensanssemibold', 'adobedevanagariregular', 'adobedevanagaribold', 'adobedevanagaribolditalic', 'adobedevanagariitalic', 'zwadobef']
Nadathetfontisaangemaaktkanereentekstwordenbeschreven.Erkanalleenéénregelperkeerworden beschreven.Specialekaraktersals ‘\n’ wordennietbegrepen.Vandefontskunnenwebijhetschrijvenvande tekstanti-aliasaanzetten.Ookdekleurkanwordenbepaald,doormiddelvaneentuplebestaandeuitdriewaarden (rood, groen, blauw) Dewaardestellendeintensiteitvoorvandekleur,waarbij0nietaanwezigen255 maximaalaanwezigbetekent.Zwartheeftdusdewaarde (0, 0, 0) terwijlwitdewaarde (255, 255, 255) heeftengroendewaarde (0, 255, 0).
Wanneerermeerderetekstenophetschermmoetenwordengetoond,danmoetenermeerdererenderregels komen.Elkerenderregelleverteeneigen Surface terugmetdaaropdegerenderdetekst.
stop = False
tekst_hoogte = 0
horizontale_positie = 0
while not stop:
for event in pygame.event.get():
if event.type == pygame.QUIT:
stop = True
Nawatinitialisatiesvanvariabelenwordtdezogenaamdegame-loopgestart.DitishethartvaneenPyGame applicatie.
Degame-loopheefteenaantalbelangrijketaken:
• Verwerkenvanevents,systeem,keyboard,controllers,spelerspecifiek,etc.
• Gamelogic,delogicavandegame,condities,triggers,verplaatsingvankarakters,etc.
• Schermopbouw,hetweergevenvanallezichtbareschermelementen.
• Frameratevasthouden,zorgendatdegame-loopconsistentwordtdoorlopen.Ditbetekentdatdegame-loop elkekeernetzolangmoetduren.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Degame-loopiseenprincipedatookwelde‘messagepump’wordtgenoemd.Ineenkortestrakkeherhaallus wordenalleeventsdiestaantewachtenafgevraagdenbehandeld.Events,deletterlijkebetekenisis ‘gebeurtenissen’,kunnenopwillekeurigemomentenoptreden.Ookophetmomentdatwenietindezemessage pumpbezigzijn.Degameenginevangtdezeberichtenopenbewaartze.Zodrademessagepumpcodewordt aangeroepen,wordenaldeopgeslageneventsstukvoorstukgelezenendoorgegeven.Doormiddelvanhet vergelijkenvanheteventtypeenhetgewensteeventkunnenwereagerenopspecifiekeevents.Denkhierbijweer aanbijvoorbeeldtoetsenbord/joystickevents.
Hetafhandelenvandegewensteeventsdientuiteraardzosnelmogelijktegebeuren,zodatdegameloopniette veelwordtverstoord.Inditvoorbeeldzettenweeenbooleanop True zodrahetsysteemevent QUIT komt. Daarmeestoptdeapplicatie.
283 Blok7 ObjectOriëntedProgramming
Hetonderstaandedeel,isdeanimatievande‘HelloWorld’tekst.Zolangdezenognietonderaanhetschermis aangekomen,blijftdetekstzakken.Onderaanhetschermgaatdetekstnaarrechts.
if tekst_hoogte < hoogte - tekst_afmeting[1]: tekst_hoogte += 1
else:
if horizontale_positie < breedte - tekst_afmeting[0]: horizontale_positie += 1
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Indeanimatievanbovennaarbenedenwordtrekeninggehoudenmetdehoogtevandetekst Surface Inde animatievanlinksnaarrechtswordtrekeninggehoudenmetdebreedtevandetekst.
Elke Surface binnenPyGameheefthetzelfdecoördinatenstelsel,waarbijdeoorsprong (0, 0) linksboveninis. Demaximalehoogteenbreedteisrechtsonderintevinden.Bijons(640, 480).
Hetbegintmethetvullenvanhetschermmetdekleurzwart.Hetresultaatisdathetschermleegwordtgemaakt. Vervolgenswordtonzetekstophetschermge-blit.Determblittingwordtgebruiktvoorhetkopiërenvaneenarray metdatanaareenarraydieovereenkomtmeteenbitmap(grafischedata).
scherm.fill((0, 0, 0))
scherm.blit(tekst, (horizontale_positie, tekst_hoogte))
pygame.display.flip()
klok.tick(120)
Nadatallevisueleelementennaarde Surface zijnovergebracht,wordthetbeeldgewisseld.Ditgeefteenrustiger beeld.Wetekenenopeenverborgen Surface Ophetmomentvanwissel,metde pygame.display.flip() functie,wordtdeverborgen Surface naarvorengebrachtenweergegeven.Hetvorigezichtbare Surface vlak wordtnuhetactieve Surface vlakwaaropweachterdeschermenkunnentekenen.
Deregelmetde klok.tick() zorgtvooreenstabieleframerate,hetaantalframesperseconde(FPS).Wewillen datdegameloopconsistentisenelkekeernetzolangduurt.Doordeframerateconstanttehoudenkrijgenwe ditvoorelkaar.Alsdeberekeningensnelklaarzijn,gaatdeapplicatieineenwachtmodetotdatdegewenste framerateisbereikt.Degamezaldaardooropelkecomputernetzosneldraaien.Ervanuitgaandedatdeingestelde frameratehaalbaaris.
Meestaldraaiengamesop60FPS.Indenieuwegamesziejeframeratestot240FPS.Uiteraardhebbendie computers,naasthelegoedespecificaties,specialevideokaartenomdebeeldenzosneltekunnengenereren. Hetanderestruikelblokisdemonitor,dezemoetdesnelheidookaankunnen.Vandaardatjetegenwoordig monitorsenvideokaartenzietmetspecialesynchronisatiemogelijkheden.
Hettekstobject
WehebbengeziendatwevierregelsnodighebbenalsweeentekstinPyGamewillenlatenzien.Ermoeteenfont wordengeselecteerd,eenfontgemaakt,tekstgerenderdendeafmetingenopgevraagd.Alswerelatiefveeltekst hebben,isditeenaardigeklus.Alswekijkennaardehoeveelheidmogelijkeoptiesaanparametersdieweindie vierregelsmoetenopgevenaandeverschillendefuncties,danvalthetmakenvaneeneigenfunctiealaf.We
284
zoudendanteveelparametersmoetenmeegevenaandefunctie.Daardoorverliezenweookhetoverzicht.Wat hierbeterzouwerkenishetmakenvaneenobject.Eenobjectkanveelattributenhebben,maarisnogsteeds éénobject.Alsparametergevenwedusééndingdoor,hetobject,waardoordefunctieoverzichtelijkblijft,hoewel weindefunctieheelveelwaardenhebbenviadeattributenvanhetobject.
Wemakeneenobjectmetdenaamtekst.Eenobjectheeftattributenenmethoden.Deattributenzijndeparameters endemethodengevenhetobjectgedragofacties.EenvandebelangrijkstetakenbijOOPisdatweencapsulation gebruiken.Datbetekenthetafschermenvaninformatie.Wegaandeattributennietrechtstreeksbenaderen,maar doendatviamethoden.
class Tekst:
def __init__(self, tekst, kleur):
self._tekst = tekst
self._kleur = kleur
self._font_naam = pygame.font.get_default_font()
self._font = pygame.font.Font(self._font_naam, 18)
self._grafische_tekst = self._font.render(self._tekst, True, self._kleur)
def breedte(self):
return self._grafische_tekst.get_width()
def hoogte(self):
return self._grafische_tekst.get_height()
def blit(self, beeldscherm, coordinaten):
beeldscherm.blit(self._grafische_tekst, coordinaten)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Onzeklassetekstzoueralsvolgtuitkunnenzien.Inde __init__() methodezorgenwedatweeengeldigobject maken.Eenobjectdiegereedisomtoegepastteworden.Wemakenalsonzeattributenaan.Vervolgensmaken wedemethodendieonsinformatiegevenoverdetekst.Demethode breedte() en hoogte().Aandenaamis gelijkduidelijktezienwatdemethodedoet.Ditbevordertdeleesbaarheid.Omdetekstophetschermweerte gevenhebbenwedemethode blit().
Ommetdetekstklassetewerkenmoetenweonzeapplicatieaanpassen.
import pygame
class Tekst:
def __init__(self, tekst, kleur):
285 Blok7 ObjectOriëntedProgramming
self._tekst = tekst
self._kleur = kleur
self._font_naam = pygame.font.get_default_font()
self._font = pygame.font.Font(self._font_naam, 18)
self._grafische_tekst = self._font.render(self._tekst, True, self._kleur)
(ZONDERBEELD-EN TAALREDACTIE)
def breedte(self):
return self._grafische_tekst.get_width()
def hoogte(self):
return self._grafische_tekst.get_height()
def blit(self, beeldscherm, coordinaten): beeldscherm.blit(self._grafische_tekst, coordinaten)
pygame.init()
schermafmeting = breedte, hoogte = 640, 480
CONCEPT
scherm = pygame.display.set_mode(schermafmeting)
klok = pygame.time.Clock()
hello_world = Tekst("Hello, World", (0, 120, 0))
stop = False
tekst_hoogte = 0
horizontale_positie = 0
while not stop:
for event in pygame.event.get():
if event.type == pygame.QUIT:
stop = True
if tekst_hoogte < hoogte - hello_world.hoogte():
tekst_hoogte += 1
else:
286
if horizontale_positie < breedte - hello_world.breedte():
horizontale_positie += 1
scherm.fill((0, 0, 0))
hello_world.blit(scherm, (horizontale_positie, tekst_hoogte))
pygame.display.flip()
klok.tick(60)
Debeschrijvingvanonzeklassehebbenwebovenindecodegezet.Voordenetheidishethandigomklassenen functiesboveninhetbestandteplaatsennetonderdeimports.
Wemoetendeklasseinstantïeren,aanmaken,omhemtegebruiken.Inditvoorbeeldnoemenwedetekstklasse hello_world Wegevenhetobjectdirectdetekstenkleurmeeophetmomentdatwehemaanmakenen toekennenaandevariabele hello_world.
hello_world = Tekst("Hello, World", (0, 120, 0))
Devolgendeaanpassingisbijhetbepalenvandeschermgrenzen.Wevragennuaanhettekstobjectzelf,watde afmetingenzijn.
if tekst_hoogte < hoogte - hello_world.hoogte(): tekst_hoogte += 1 else:
if horizontale_positie < breedte - hello_world.breedte(): horizontale_positie += 1
Ookhierziejedeleesbaarheidverbeteren,inplaatsvan tekstafmeting[1] hebbenwe hello_world.hoogte().
Delaatsteaanpassingbetrefthetwerkelijknaarhetschermblittenvandetekst.
hello_world.blit(scherm, (horizontale_positie, tekst_hoogte))
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Eenstukjetekstophetschermzettenisnusnelgedaan.
Meerdereteksten
Wanneerwenumeerderetekstenophetschermwillenzetten,dankandateenvoudigdoormeerderevariabelen aantemakenen Tekst klassenteinstantiëren.Indehoofdloophebbenwedelogicaomdetekstoverhetscherm telatenbewegen.Alswenogeentekstwillenlatenbewegen,danmoetenweextraregelstoevoegenomdeandere tekst(en)telatenbewegenlangsderandenvanhetscherm.
287 Blok7 ObjectOriëntedProgramming
Ookhierkunnendeobjectenonshelpen.Opditmomentkanonsobjectperfecteentekstergensophetscherm neerzetten.Doormiddelvanoverervenkunnenweeenanimerendetekstobjectmaken.Eentjediewekunnen latenbewegen.
class AnimerendeTekst(Tekst):
def __init__(self, tekst, kleur, schermbreedte, schermhoogte):
super().__init__(tekst, kleur)
self._schermbreedte = schermbreedte
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
self._schermhoogte = schermhoogte
self._positie_x = 0
self._positie_y = 0
def naar_rechts(self, pixels): nieuwe_positie = self._positie_x + pixels
maximale_positie = self._schermbreedte - super().breedte() if nieuwe_positie > maximale_positie: nieuwe_positie = maximale_positie
self._positie_x = nieuwe_positie
def naar_beneden(self, pixels): nieuwe_positie = self._positie_y + pixels
maximale_positie = self._schermhoogte - super().hoogte() if nieuwe_positie > maximale_positie: nieuwe_positie = maximale_positie
self._positie_y = nieuwe_positie
def rechterkant_bereikt(self):
positie_rand = self._schermbreedte - super().breedte() return self._positie_x >= positie_rand
def onderkant_bereikt(self):
positie_rand = self._schermhoogte - super().hoogte()
return self._positie_y >= positie_rand
def blit(self, beeldscherm):
288
super().blit(beeldscherm, (self._positie_x, self._positie_y))
Onzeanimerendeklasseheeftaardigwatmethodenextra,maarisdanookinstaatomonzetekstoverhetscherm teverplaatsenbinnendemaximalehoogteenbreedte.
class AnimerendeTekst(Tekst):
Doortussenhaakjesde Tekst klasseteplaatsenzeggenwedatde AnimerendeTekst klassevande Tekst klasse overerft.De Tekst klasseisdeouderklasseende AnimerendeTekst klasseishetkind.
Omhetobjectgoedteinitialiserenmoetdezeindeeigen __init__() de __init__() vandeouderklasse aanroepen.Datdoenwemetde super() functie.Hiermeeroepenwede super().__init__() aanvande ouderklasse.Weroependezeaanalsofwezelfhetobjectinstantiërenengevendebenodigdeparametersdoor.
def __init__(self, tekst, kleur, schermbreedte, schermhoogte):
super().__init__(tekst, kleur)
self._schermbreedte = schermbreedte
self._schermhoogte = schermhoogte
self._positie_x = 0
self._positie_y = 0
Vervolgensinitialiserenwedeattributendiewezelfnodighebbenals AnimerendeTekst
Omdetekstnaarbenedentelatenbewegenhebbenwedemethodenaar_beneden()toegevoegd.Wehebbener ookvoorgezorgddatwenietverderkunnenzakkendanonderkantvanhetscherm.Daarnaastzoudenwemet eenmeerpixelstegelijkertijdkunnenverplaatsen,doordeverplaatsingalsaantalpixelsdoortegeven.
def naar_rechts(self, pixels):
nieuwe_positie = self._positie_x + pixels
maximale_positie = self._schermbreedte - super().breedte() if nieuwe_positie > maximale_positie: nieuwe_positie = maximale_positie
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
self._positie_x = nieuwe_positie
Webepaleneerstdenieuwepositie,doortekijkenwaarwestaanalswedegewensteverplaatsingzouden uitvoeren.Demaximalepositiebepalenwedooraandeouderklassetevragen:Hoebreedzijnwenueigenlijk?
Alserietsaandeouderklassemoetwordengevraagd,danroepjeditviade super() functie.Datisdemanier diewehebbengebruiktomdebreedtevandetekstoptevragen,zodatwekunnenberekenenofwealtegende randzittenofdatwenogkunnenverplaatsen.Vergelijkbarecodehebbenwegebruiktbijdemethode naar_beneden()
289 Blok7 ObjectOriëntedProgramming
Omtekijkenofwederechterrandalhebbenbereikt,hebbenwedaareendetectiemethodevoorgemaakt rechterkant_bereikt().Dezeleverteen True terugalsderechterkantisbereikt.
def rechterkant_bereikt(self):
positie_rand = self._schermbreedte - super().breedte()
return self._positie_x >= positie_rand
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Eerstwordtbepaaldwaarderechterkantzichbevindtalswedebreedtevandetekstinachtnemen.Danweten weonzemaximalepositie.Vergelijkbarecodehebbenwegebruiktbijdedetectievandeonderkant.
Ookhierhebbenweeen blit() methodetoegevoegd,maarzonderdatweeenpositieophoeventegeven, omdatwedepositieszelfalhebbenalsattribuut.
def blit(self, beeldscherm):
super().blit(beeldscherm, (self._positie_x, self._positie_y))
Weroepende blit() methodevandeouderklasseaan.Ditdoenweviade super() functieengevendepositie doorvanonzeeigenklasse.
Omhetgeheeltelatenwerkenisapplicatiealsvolgtgeworden.
import pygame
class Tekst:
def __init__(self, tekst, kleur):
self._tekst = tekst
self._kleur = kleur
self._font_naam = pygame.font.get_default_font()
self._font = pygame.font.Font(self._font_naam, 18)
self._grafische_tekst = self._font.render(self._tekst, True, self._kleur)
def breedte(self):
return self._grafische_tekst.get_width()
def hoogte(self):
return self._grafische_tekst.get_height()
290
def blit(self, beeldscherm, coordinaten): beeldscherm.blit(self._grafische_tekst, coordinaten)
class AnimerendeTekst(Tekst):
LINKERKANT =0
BOVENKANT = 0
def __init__(self, tekst, kleur, schermbreedte, schermhoogte): super().__init__(tekst, kleur)
self._schermbreedte = schermbreedte
self._schermhoogte = schermhoogte
self._positie_x = 0
self._positie_y = 0
def naar_links(self, pixels): nieuwe_positie = self._positie_x - pixels if nieuwe_positie < AnimerendeTekst.LINKERKANT: nieuwe_positie = AnimerendeTekst.LINKERKANT
self._positie_x = nieuwe_positie
def naar_rechts(self, pixels): nieuwe_positie = self._positie_x + pixels
maximale_positie = self._schermbreedte - super().breedte() if nieuwe_positie > maximale_positie: nieuwe_positie = maximale_positie
self._positie_x = nieuwe_positie
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
def naar_boven(self, pixels): nieuwe_positie = self._positie_y - pixels if nieuwe_positie < AnimerendeTekst.BOVENKANT: nieuwe_positie = AnimerendeTekst.BOVENKANT
self._positie_y = nieuwe_positie
def naar_beneden(self, pixels):
291 Blok7 ObjectOriëntedProgramming
nieuwe_positie = self._positie_y + pixels
maximale_positie = self._schermhoogte - super().hoogte() if nieuwe_positie > maximale_positie: nieuwe_positie = maximale_positie
self._positie_y = nieuwe_positie
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
def rechterkant_bereikt(self):
positie_rand = self._schermbreedte - super().breedte()
return self._positie_x >= positie_rand
def onderkant_bereikt(self):
positie_rand = self._schermhoogte - super().hoogte()
return self._positie_y >= positie_rand
def blit(self, beeldscherm): super().blit(beeldscherm, (self._positie_x, self._positie_y))
pygame.init()
schermafmeting = breedte, hoogte = 640, 480 scherm = pygame.display.set_mode(schermafmeting)
klok = pygame.time.Clock()
hello_world = AnimerendeTekst("Hello, World", (0, 120, 0), 640, 480)
sneller_hello_world = AnimerendeTekst("Sneller Hello, World", (0, 120, 120), 640, 480)
stop = False
tekst_hoogte = 0
horizontale_positie = 0
while not stop:
292
for event in pygame.event.get():
if event.type == pygame.QUIT: stop = True
if not hello_world.onderkant_bereikt():
hello_world.naar_beneden(1)
else:
hello_world.naar_rechts(1)
if not sneller_hello_world.onderkant_bereikt():
sneller_hello_world.naar_beneden(2)
else:
sneller_hello_world.naar_rechts(4)
scherm.fill((0, 0, 0))
hello_world.blit(scherm)
sneller_hello_world.blit(scherm)
pygame.display.flip()
klok.tick(60)
De AnimerendeTekst klasseisdirectnade Tekst klassegeplaatst.Vervolgensisde hello_world aangepast doorgebruiktemakenvande AnimerendeTekst klasseinplaatsvande Tekst klasse.
hello_world = AnimerendeTekst("Hello, World", (0, 120, 0), 640, 480)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
sneller_hello_world = AnimerendeTekst("Sneller Hello, World", (0, 120, 120), 640, 480)
Wegevennunaastdetekstendekleurookdemaximalebreedteenhoogteaan.Dezeheeftde AnimerendeTekst klassenodigomderandentekunnenbepalen.Omdatheteenklasseis,kunnenweeenvoudigeentweede animerendeteksttoevoegen.Enuiteraardnetzoveelalsonzecomputergeheugenheeft.
293 Blok7 ObjectOriëntedProgramming
Hetanimerenzelfisnueenvoudigergeworden.Omdatwedezelfdebewegingwildetonenisereenvergelijking nodigomtekijkenofwealaandeonderkantzijnaangekomen.Enuiteindelijkofwealaanderechterzijdezijn aangekomen.Zoalsjezietheeftde"sneller_hello_world"instantieeengrotereverplaatsing,respectievelijk 2en4pixelsperkeerdatdeherhalingluswordtdoorlopen.
if not hello_world.onderkant_bereikt():
hello_world.naar_beneden(1)
else:
hello_world.naar_rechts(1)
if not sneller_hello_world.onderkant_bereikt():
sneller_hello_world.naar_beneden(2)
else:
sneller_hello_world.naar_rechts(4)
Alslaatsteishetblittenaangepast.Wehoevenalleenhetschermwaaropwewillenblittendoortegeven.
hello_world.blit(scherm)
sneller_hello_world.blit(scherm)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Stuiterbal
Wegaannogeenvoorbeeldmakenmeteenobjectindevormvaneenstuiterbal.Deprincipeszijnhetzelfdeals bijdeanimerendetekst,maardoordegrenzenookbinnenhetobjectaftehandelenwordthetgebruikvanhet objectnogeenvoudiger.Hetobjectheeftmeerverantwoordelijkheidgekregen.Onderstaandedecodevoorde stuiterbalklasse.
class StuiterBal:
def __init__(self, radius, kleur):
self._kleur = kleur
self._radius = radius
self._x = 340
self._y = 0
self._x_snelheid = 0
self._y_snelheid = 0
self._zwaartekracht = 0.0981
self._wrijving = 0.8
self._stuiter_vloer = False
self._stuiter_muur = False
294
def _stuiter_op_vloer(self, vloer): self._stuiter_vloer = self._y > vloer
if self._stuiter_vloer:
self._y_snelheid *= self._wrijving
self._y_snelheid = -self._y_snelheid
self._y = vloer
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
return self._stuiter_vloer
def _stuiter_linkermuur(self, linkermuur): linkermuur_geraakt = self._x < linkermuur
if linkermuur_geraakt: self._x_snelheid *= self._wrijving
self._x_snelheid = -self._x_snelheid
self._x = linkermuur
return linkermuur_geraakt
def _stuiter_rechtermuur(self, rechterrmuur): rechtermuur_geraakt = self._x > rechterrmuur
if rechtermuur_geraakt:
self._x_snelheid *= self._wrijving
self._x_snelheid = -self._x_snelheid
self._x = rechterrmuur
return rechtermuur_geraakt
def _stuiter_tegen_muur(self, muur_links, muur_rechts): linker_muur = self._stuiter_linkermuur(muur_links)
rechter_muur = self._stuiter_rechtermuur(muur_rechts)
return linker_muur or rechter_muur
def blit(self, scherm):
self._stuiter_op_vloer(scherm.get_height())
295 Blok7 ObjectOriëntedProgramming
self._stuiter_tegen_muur(0, scherm.get_width())
pygame.draw.circle(scherm, self._kleur, [self._x, self._y], self._radius, 0)
def set_x_snelheid(self, snelheid_x): self._x_snelheid = snelheid_x
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
def set_y_snelheid(self, snelheid_y): self._y_snelheid = snelheid_y
def proces(self):
self._y_snelheid += self._zwaartekracht
self._x += self._x_snelheid
self._y += self._y_snelheid
Alseerstemoethetobjectgeïnitialiseerdworden.Ditgaatweermetde __init()__ methode.Demethodekrijgt eenaantalexterneparameters,deradiusendekleurvandestuiterbal.Daarnaastzijneraardigwatattributen dieweweliswaarinitialiseren,maarnietviadeparametersvande __init()__ methode.
Indecodezienwedatereenaantalmethodenzijndiebeginnenmeteen
def __init__(self, radius, kleur):
self._kleur = kleur
self._radius = radius
self._x = 340
self._y = 0
self._x_snelheid = 0
self._y_snelheid = 0
self._zwaartekracht = 0.0981
self._wrijving = 0.8
self._stuiter_vloer = False
self._stuiter_muur = False
Destuiterbalwillenweredelijkrealistischlatenstuiteren.Omditterealisereniseenaantalattributennodig.Als belangrijkstedepositieophetscherm,doormiddelvandex-,y-coordinaten.Debalkanookinelkerichtingsnelheid hebbenvandaardex_-eny_snelheid.Dezwaartekrachtzorgtervoordatdebalvaltopeenrealistischewijze.Met
296
dewrijvingzorgenweervoordathetstuiterensteedsminderwordt.Erwordtmetelkestuiterwatsnelheid weggehaald,waardoordestuiterbalsteedsminderhoogstuitert.Tenslottezijnernogtweebooleanswaarmee wordtaangegevenofdebaltegeneenwandisgestuiterd.
Omtekijkenofdestuiterbaldegrondheeftgeraaktisdemethode _stuiter_op_vloer() toegevoegd.Wat opvaltisdatdenaambegintmeteenunderscore.Hiermeegevenweaandatdemethodebedoeltisvoorintern gebruik.Datwilzeggendatanderemethodenbinnendeklassedezemethodenmogenaanroepen,maardatdeze methodenietvanbuitendeklassemogenwordenaangeroepen.Pythonbewaaktditniet.VeelIDE's,waaronder PyCharm,helpeneenbeetjedoordezemethodebuitendeklasseniettelatenzien.
def _stuiter_op_vloer(self, vloer):
self._stuiter_vloer = self._y > vloer
if self._stuiter_vloer:
self._y_snelheid *= self._wrijving
self._y_snelheid = -self._y_snelheid
self._y = vloer
return self._stuiter_vloer
Deinternelogicaisvrijrecht-toe-recht-aan.Wecontrolerenofdey-positievandestuiterbalvoorbijdehoogte vanhetschermis.Wanneerdathetgevalisdanwordtdesnelheideerstaangepastopbasisvandewrijving. Vervolgenswordtderichtingvandesnelheidomgedraaid.Datgeeftdirectdatterugstuitergevoel.Deactuele y-positievandebalwordtdirectopderandvanhetschermgezet.Datgeefteenrealistischstuitergevoel.
Vergelijkbaremethodenzijnervoordedetectiemetdemurenaandezijkant.
def blit(self, scherm):
self._stuiter_op_vloer(scherm.get_height())
self._stuiter_tegen_muur(0, scherm.get_width())
pygame.draw.circle(scherm, self._kleur, [self._x, self._y], self._radius, 0)
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Inde blit() methodewordendeinterne _stuiter_op_vloer() en _stuiter_tegen_muur() methoden aangeroepenomtecontrolerenofdestuiterbalnietbuitenbeeldgaatenhierdannaartehandelen.Dex-of y-coordinatenaanpassenalszebuitenbeeldzijnendesnelhedencorrigeren.
Metde set_x_snelheid() ende set_y_snelheid() methodekandestuiterbaleensnelheidworden meegegeven.
297 Blok7 ObjectOriëntedProgramming
def
set_x_snelheid(self, snelheid_x):
self._x_snelheid = snelheid_x
def
set_y_snelheid(self, snelheid_y):
self._y_snelheid = snelheid_y
Demethode proces() iseenmethodediedenieuwesituatievandestuiterbaluitrekent.Aandehandvande zwaartekrachtwordendenieuwesnelhedenenpositiesuitgerekend.Dezewordendanbijde blit() methode getekend.
def proces(self):
self._y_snelheid += self._zwaartekracht
self._x += self._x_snelheid
self._y += self._y_snelheid
Wanneerwenaarhetgeheleprogrammakijkenzietditeralsvolgtuit.
import pygame
class StuiterBal:
def __init__(self, radius, kleur):
self._kleur = kleur
self._radius = radius
self._x = 340
self._y = 0
self._x_snelheid = 0
self._y_snelheid = 0
self._zwaartekracht = 0.0981
self._wrijving = 0.8
self._stuiter_vloer = False
self._stuiter_muur = False
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
def _stuiter_op_vloer(self, vloer):
self._stuiter_vloer = self._y > vloer
if self._stuiter_vloer:
self._y_snelheid *= self._wrijving
self._y_snelheid = -self._y_snelheid
self._y = vloer
298
return self._stuiter_vloer
def _stuiter_linkermuur(self, linkermuur): linkermuur_geraakt = self._x < linkermuur
if linkermuur_geraakt:
self._x_snelheid *= self._wrijving
self._x_snelheid = -self._x_snelheid
self._x = linkermuur
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
return linkermuur_geraakt
def _stuiter_rechtermuur(self, rechterrmuur): rechtermuur_geraakt = self._x > rechterrmuur
if rechtermuur_geraakt:
self._x_snelheid *= self._wrijving
self._x_snelheid = -self._x_snelheid
self._x = rechterrmuur
return rechtermuur_geraakt
def _stuiter_tegen_muur(self, muur_links, muur_rechts): linker_muur = self._stuiter_linkermuur(muur_links) rechter_muur = self._stuiter_rechtermuur(muur_rechts)
return linker_muur or rechter_muur
def blit(self, scherm):
self._stuiter_op_vloer(scherm.get_height())
self._stuiter_tegen_muur(0, scherm.get_width())
pygame.draw.circle(scherm, self._kleur, [self._x, self._y], self._radius, 0)
def set_x_snelheid(self, snelheid_x): self._x_snelheid = snelheid_x
299 Blok7 ObjectOriëntedProgramming
def
set_y_snelheid(self, snelheid_y): self._y_snelheid = snelheid_y
def proces(self):
self._y_snelheid += self._zwaartekracht
self._x += self._x_snelheid
self._y += self._y_snelheid
(ZONDERBEELD-EN TAALREDACTIE)
pygame.init()
schermafmeting = breedte, hoogte = 640, 480 scherm = pygame.display.set_mode(schermafmeting)
klok = pygame.time.Clock()
stuiterbal = StuiterBal(5, (255, 0, 255))
stop = False
while not stop:
for event in pygame.event.get():
CONCEPT
if event.type == pygame.QUIT: stop = True
if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT:
stuiterbal.set_x_snelheid(-1)
if event.key == pygame.K_RIGHT:
stuiterbal.set_x_snelheid(1)
if event.key == pygame.K_SPACE:
stuiterbal.set_y_snelheid(-2)
scherm.fill((0, 0, 0))
stuiterbal.proces()
stuiterbal.blit(scherm)
pygame.display.flip()
300
klok.tick(60)
AllestandaarddingenrondomPyGamehebbenwealgezieninvoorgaandevoorbeelden.Wathierandersis,is hetgebruikvanhettoetsenbord.Daarnaastvaltopdatergeenlogicameerindegame-loopzit,omdatdezein destuiterbalverwerktzit.Destuiterbalkijktzelfofdewandenwordengeraakt.
Hettoetsenbordleverteventsop.Gebeurtenissendiekeyeventswordengenoemd.Inditgevalkijkenwenaar keydown,wanneeriemandeentoetsindrukt.Alsereentoestisingedruktkijkenwewelketoetsdatisenkunnen weeenactieuitvoeren.Hiergevenwedestuiterbaleensnelheidmee.
while not stop: for event in pygame.event.get(): if event.type == pygame.QUIT: stop = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT:
stuiterbal.set_x_snelheid(-1) if event.key == pygame.K_RIGHT:
stuiterbal.set_x_snelheid(1) if event.key == pygame.K_SPACE:
stuiterbal.set_y_snelheid(-2)
Onderstaandnogevenhoedeaangestuurdmoetworden.Ervindtprocessingplaats,berekenenvandenieuwe situatie,vervolgenswordtdenieuwesituatieophetschermweergegeven.
scherm.fill((0, 0, 0))
stuiterbal.proces()
stuiterbal.blit(scherm)
pygame.display.flip()
Hetblittengebeurtmetaforischgesprokenopdeachterkantvanhetbeeldscherm.Alsallesisgetekenddanflippen wehetbeeldschermmdede display.flip() methode,waardooronzenieuwetekeningtevoorschijnkomt.De volgendekeertekenenweweeropdeachterkant.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Delaatsteregelzorgterweervoordatweinde60xperseconderangeblijven.
klok.tick(60)
301 Blok7 ObjectOriëntedProgramming
Modulen
InPythoniseenmodulenietsandersdaneenbestandmetPythoncode.Weplaatsenbepaaldestukkencodein verschillendemodulenomhetoverzichttehouden.Zoalsfunctiesoverzichtgeveninhetscheidenvande verschillendefunctionaliteiten,gevenmodulenoverzichtbijhetscheidenvanverzamelingenvanfunctionaliteiten.
Eengoedegewoonteisomelkeklassediejehebtineenapartemoduleteplaatsen.Daardoorblijfthet hoofdprogrammaoverzichtelijk,zekeralsjemeerdereklassenhebt.
Import
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Zodrawedefuncties,variabelenofklassenuiteenmodulewillengebruikenmoetenwedemoduleimporteren. Wehebbenditaleenpaarkeergebruikt.Bijvoorbeeld import pathlib of import math Wanneerwehet voorbeeld import math bekijken,danzeggenweeigenlijkdatwedefuncties,classesenvariabelenvande math-modulewillengaangebruiken.
import math
print(f"Sin 30 graden = {math.sin(math.radians(30))}")
Wanneerwedituitvoerendankrijgenweonderstaandeoutput.
Sin 30 graden = 0.49999999999999994
Eenanderevormvanimportziejeookregelmatiginvoorbeeldenophetinternetenandereboeken.
from math import sin, radians
print(f"Sin 30 graden = { sin(radians(30))}")
Bijdezevormwordenalleenspecifiekefuncties,klassenofvariabelengeïmporteerd.Jehoeftdanooknietmeer denaamvandemoduleervoortezetten.Jekanmetdezemaniervanimporterenheelprecieseenbepaalde functionaliteitimporteren.Jehoeftookmindertetikken.Tochwordtditalsdemindereoptiegezien.Indenormale situatietikjeookdenaamvandegeïmporteerdemodule.Jeweetduswaarietsvandaankomt.Denaamvande modulewordtookdenamespacevandiemodulegenoemd.DeZenvanPythonzegtookdatnamespaceseen heelgoedideezijn.
Alias
Hetkanvoorkomendatjeeennaamvooreenfunctie,klasseofvariabelehebtbedachtengebruiktdieookdoor Pythonwordtgebruikt.Ofdatjeeennaamhebtbedachtdooreenanderederdepartijmodule.Jekuntdanhet bestegebruikmakenvaneenalias,endefunctieimporterenmeteenanderenaam:
302
import math as rekenen
print(f"Sin 30 graden = {rekenen.sin(rekenen.radians(30))}")
Jezietdatnudealiaswordtgebruiktomdefunctionaliteitindemodulemathaantespreken.
Refactorstuiterbal
Wehaddenonzestuiterbalenhoofdprogrammaineenbestand.Wegaanditrefactorennaarmeerderebestanden. Onzestuiterbalkrijgteeneigenbestandenwordtdaardooreenmodule.Demodulegaanvervolgensimporteren inonshoofdbestand.
Module stuiterbal.py
import pygame
class StuiterBal:
def __init__(self, radius, kleur):
self._kleur = kleur
self._radius = radius
self._x = 340
self._y = 0
self._x_snelheid = 0
self._y_snelheid = 0
self._zwaartekracht = 0.0981
self._wrijving = 0.8
self._stuiter_vloer = False
self._stuiter_muur = False
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
def _stuiter_op_vloer(self, vloer):
self._stuiter_vloer = self._y > vloer
if self._stuiter_vloer:
self._y_snelheid *= self._wrijving
self._y_snelheid = -self._y_snelheid
self._y = vloer
return self._stuiter_vloer
def _stuiter_linkermuur(self, linkermuur): linkermuur_geraakt = self._x < linkermuur
303 Blok7 ObjectOriëntedProgramming
if linkermuur_geraakt:
self._x_snelheid *= self._wrijving
self._x_snelheid = -self._x_snelheid
self._x = linkermuur
return linkermuur_geraakt
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
def _stuiter_rechtermuur(self, rechterrmuur): rechtermuur_geraakt = self._x > rechterrmuur
if rechtermuur_geraakt:
self._x_snelheid *= self._wrijving
self._x_snelheid = -self._x_snelheid
self._x = rechterrmuur
return rechtermuur_geraakt
def _stuiter_tegen_muur(self, muur_links, muur_rechts): linker_muur = self._stuiter_linkermuur(muur_links) rechter_muur = self._stuiter_rechtermuur(muur_rechts)
return linker_muur or rechter_muur
def blit(self, scherm): self._stuiter_op_vloer(scherm.get_height()) self._stuiter_tegen_muur(0, scherm.get_width())
pygame.draw.circle(scherm, self._kleur, [self._x, self._y], self._radius, 0)
def set_x_snelheid(self, snelheid_x): self._x_snelheid = snelheid_x
def set_y_snelheid(self, snelheid_y): self._y_snelheid = snelheid_y
def proces(self): self._y_snelheid += self._zwaartekracht
304
self._x += self._x_snelheid
self._y += self._y_snelheid
Onshoofdprogrammazieternualsvolgtuit.
Hoofdprogramma main.py
import pygame import stuiterbal pygame.init()
schermafmeting = breedte, hoogte = 640, 480 scherm = pygame.display.set_mode(schermafmeting)
klok = pygame.time.Clock()
bal = stuiterbal.StuiterBal(5, (255, 0, 255))
stop = False
CONCEPT
while not stop: for event in pygame.event.get(): if event.type == pygame.QUIT:
stop = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT:
bal.set_x_snelheid(-1) if event.key == pygame.K_RIGHT:
bal.set_x_snelheid(1) if event.key == pygame.K_SPACE:
bal.set_y_snelheid(-2)
scherm.fill((0, 0, 0))
bal.proces()
bal.blit(scherm)
305 Blok7 ObjectOriëntedProgramming
(ZONDERBEELD-EN TAALREDACTIE)
pygame.display.flip()
klok.tick(60)
Weziennuboveninstaan:importstuiterbal.Ditisdestuiterbalmodule.Omdestuiterbaltekunnengebruiken, moetenwedenaamvandemodulenogvooronzestuiterbalzetten.Datdoenweopdeplekwaarwedestuiterbal instantiëren.
bal = stuiterbal.StuiterBal(5, (255, 0, 255))
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Denaamisvandevariabeleisgewijzigdvanstuiterbalnaarbal.Hetisgeengoedideeomeenvariabeletehebben diedezelfdenaamheeftalseenmodule.Ditgeeftverwarringvoordeveloper.
Wehebbennueenmooiescheidingtussenonzeklasseenhethoofdprogramma.Daarnaastishetnumakkelijk omdestuiterbalineenanderprogrammategebruiken.Hetisnunamelijkeenlosbestanddiemakkelijknaar eenanderprojectkanwordenverplaatstofgekopieërd.
7.5 Begrippen
7.6 Testjekennis
Opdracht5
WatishethoofddoelvanOOP?
Hetorganiserenvancodeinherbruikbareenonderhoudbarecomponenten.
Hetmaximaliserenvandesnelheidvaneenprogramma.
Hetminimaliserenvandegeheugenvereistenvaneenprogramma.
Hetverminderenvandecomplexiteitvaneenprogramma.
Opdracht6
WatiseenklasseinOOP?
Eenspecifiekeimplementatievaneenobject.
Eenvariabeledieisgedeclareerdbinneneenmethode.
Eenspecialefunctiediewordtgebruiktomgegevenstemanipuleren.
Eenblauwdrukvoorhetcreërenvanobjectenmetbepaaldeeigenschappenenmethoden.
Opdracht7
WatispolymorfismeinOOP?
Hetvermogenommethodenmetdezelfdenaamtedefiniëreninverschillendeklassen.
Hetproceswaarbijeenklassewordtopgesplitstinmeerderekleinereklassen.
Hetvermogenomeenenkelemethodeopverschillendemanierenteimplementereninverschillendeklassen.
Hetvermogenomobjectenvanverschillendeklassentecombinerentotéénenkelobject.
306
Opdracht8
WatiseeninstantievaneenklasseinOOP?
Eenspecifiekeimplementatievaneenobject.
Eenblauwdrukvoorhetcreërenvanobjectenmetbepaaldeeigenschappenenmethoden.
Eenspecifiekerepresentatievaneenklasse,metzijneigensetattributenenmethoden.
Eenabstracterepresentatievaneenklasse,zonderspecifiekeattributenofmethoden.
Opdracht9
WatiseenklassevariabeleinOOP?
Eenvariabeledieisgedeclareerdbinneneenklasseendiedezelfdewaardeheeftvooralleinstantiesvandie klasse.
Eenvariabeledieisgedeclareerdbinneneenmethodeendiealleentoegankelijkisbinnendiemethode.
Eenvariabeledieuniekisvoorelkobjectvaneenklasse.
Eenvariabelediewordtgedeclareerdbuiteneenklasseendieoveralinhetprogrammatoegankelijkis.
Opdracht10
WatiseenmethodeinOOP?
Eenspecifiekeimplementatievaneenobject.
Eenspecialevariabelediewordtgebruiktomgegevensopteslaan.
Eenfunctiedieisgedefinieerdbinneneenklasseendiekanwordenopgeroepenopobjectenvandieklasse.
Eenvariabelediewordtgedeclareerdbinneneenmethodeendiealleentoegankelijkisbinnendiemethode.
Opdracht11
Watisdefunctievandeclock.tick()methodeinPygame?
Hetmaakteennieuweklokaanvoorhetspel.
Hetzorgtvoordepositioneringvanspritesophetscherm.
Hetregeltdeframesnelheidvanhetspel.
Hetcontroleertdetoetsaanslagenvandespeler.
Opdracht12
WelkevandevolgendenaamconventiesvoorobjectenwordthetmeestaanbevoleninPython?
camelCase snake_case
PascalCase kebab-case
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Opdracht13
WatiseenmethodeinPython?
Eenvariabeledieeenwaardeopslaat.
Eenobjectdatwordtgebruiktomgegevensopteslaan.
Eenfunctiediewordtgebruiktomgegevenstemanipuleren.
Eenspecialefunctiedieisgedefinieerdbinneneenklasse.
307 Blok7 ObjectOriëntedProgramming
Opdracht14
WelkevandevolgendeklassedefinitiesishetbesteuitgevoerdinPython?
class Auto:
def __init__(self, merk, model):
self.merk = merk
self.model = model
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
class Auto:
def __init__(self, merk, model):
self.merk = merk
self.model = model
def starten(self): print("De auto wordt gestart.")
class Auto:
def starten(self): print("De auto wordt gestart.")
class Auto:
def __init__(self):
self.merk = ""
self.model = ""
Opdracht15
WatiseenPygameeventinhetkadervaneengame?
Eengebeurtenisdiewordtgeactiveerddoordegebruiker,zoalshetindrukkenvaneentoetsofhetklikken vandemuis.
Eenspecifiekelocatieophetschermwaaropeenactiewordtuitgevoerd.
Eenobjectdatwordtweergegevenophetscherm.
Eendeelvandegame-enginedatdeanimatiecontroleert.
308
Opdracht16
HoewordteenkeydowneventinPygamegeactiveerd?
Wanneerdespelerdemuisbeweegt.
Wanneerdespelereentoetsophettoetsenbordindrukt.
Wanneereenspriteeenanderespriteraakt.
Wanneerdespeleropdespatiebalkdrukt.
Opdracht17
Watdoetdepygame.fill()methodeinPygame?
Hetvulteenlijstmetwaarden.
Hetvulteenoppervlakmetpixelsineenbepaaldpatroon.
Hetvulteenpygame.sprite.Spriteobjectmetattributen.
Hetvulteenrechthoekophetschermmeteenopgegevenkleur.
Opdracht18
HoewordteenkleurinPygamemeestalgerepresenteerd?
Alseenhexadecimalewaarde.
AlseenRGB-tuple.
Alseenstringmetkleurnamen.
Alseengetaltussen0en255.
Opdracht19
WelkevandevolgendecodefragmenteninPygamesteltdekleurgroeninalsdeopvulkleurvooreenrechthoek?
screen.set_fill_color((0,255,0))
pygame.draw.rect(screen,(0,255,0),(x,y,width,height))
screen.fill((0,255,0))
pygame.Color(0,255,0)
7.7 Praktijkopdrachten
Inleidingpraktijkopdracht
Voordepraktijkopdrachtengaanweeensituatieschetsenwaarbijallekennisvandevoorgaandetheoriemoet wordengebruikt.Breekeenprobleemaltijdopinkleinerestukken.Denkna,schetsdesituatiezodatjeeenvisueel beeldhebtvandesituatiewaarjemetemakenhebt.Ditkanheelverhelderendwerken,zekeralsjemetanderen wiloverleggen.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
309 Blok7 ObjectOriëntedProgramming
Opdracht20 Ballenbak
Neemhetprogrammavandestuiterendebaluitdetheoriealsbasisofalsidee.
Wegaaneenballenbakmakenwaarinwe30ballengaanlatenstuiteren.Deballenkrijgenallemaaleenrandom, kleurenvariëreninafmetingtusseneenradiusvan2totenmet10.
Aldezeballengenereerjeenstopjeineenvandecollectiedatatypen.Vandaaruitzorgjeervoordatzeindegame loopallemaalwordenaangestuurd.
Breidtdeklassebaluit,doorervoortezorgendatweaandebalkunnenvragenwatdeactuelesnelheidis,wat deactuelepositieis,deactuelewrijvingendezwaartekracht.Vraagdezegegevensopvoorelkegameloopcyclus enschrijfdezegegevenselke100gameloopsequencesopineencsv-bestand.Datbestandwordtdussteeds groter.
Zorgervoordatjeweetwelkeregelinhetcsv-bestandbijwelkebalhoort,doorbijvoorbeelddeballentenummeren.
Opdracht21 Ballenteleporteren
CONCEPT (ZONDERBEELD-EN
TAALREDACTIE)
Indezeopdrachtkanjedestuiterendebalalsuitgangspuntnemen.Wanneerdebalderechterzijkantvanhet schermraaktverdwijntdezevanjouwscherm.DebalwordtmethetMQTT-protocol,viadebroker,verstuurd naareenandereapplicatie.Opdeandereapplicatiekomtdebalaanopdezelfdehoogte,maaraandelinkerkant vanhetschermtevoorschijn.
Zorgervoordatjeallegegevensvandebaldoorgeeftaandeandereapplicatie,zodatdezebalcorrectkan reconstrueren.Deandereapplicatielaatdebalverderstuiterenophaarscherm.
Tip:Pasdebalklasseaan,zodatdezehaarcompletesettingsineendictionarykanteruggeven.Zorgerdanook voordatjeeennieuwebalkanconstruerenvanuiteendictionary.
Deeneapplicatieproduceertdeballen(publisher)enstuurtdezenaardeandereapplicatie(client)diedeballen danopvangtenverderbeweegtalsofzeindieapplicatiewarenbegonnen.
Opdracht22 UserInterface
IneenobjectgeoriënteerdestijlmaakjeeenuserinterfaceinPyGame.Devolgendeuserinterfaceelementen wordenverwacht:
• Button,zoalsdiebekendisinHTMLpagina'sofvanDialogboxen,etc.Opdebuttonkanjeklikkenwaardoor dezevanvormveranderd.KijkindePyGamedocumentatiehoejedemouseclickkuntherkennenendemouse positiekanuitlezen.
Debuttonheefteentext,ditkandetekstklassezijndieweindetheoriehebbengebruiktofeeneigenontwerp. Denknaofjeoverervengebruiktofdateenandereklasseeenattribuutisinjeobject.
• Eenmessageboxmeteentitelbalk,eentekstinhetmiddenen2buttonsOkenCancel.AlsjeopdeOkbutton kliktdanstoptdeapplicatiemeteen print("Tot ziens!") bericht.AlsjeopdeCancelbuttonkliktdan stopthetprogrammameteen print("Einde") bericht.
Deuserinterfaceelementenzijnobjectenenopgebouwdofsamengestelduitandereobjecten.Tekenditvoor jezelfopeenblaadjeuit.Zodatjeeenbeeldhebtvanhoejedeobjectengaatmakenenookwelke verantwoordelijkhedendeverschillendeobjectenhebben.
310
7.8 Terugblik
Opdracht23 Terugblik
Zeteenkruisjeindekolomdievoorjouvantoepassingis.
Beoordelingscriteria
Jekuntuitleggenwatobjectenzijn.
Jekuntdevoordelenvanobjectoriëntedprogramminguitleggen.
JekuntOOPtoepassenineenapplicatie.
Opdracht24 Terugblik
Denknaoverwatjehebtgedaaninditblok.
a. Noemtweedingenwaaroverjetevredenbent.
1. 2.
b. Noemtweedingendiejedevolgendekeeranderswiltdoen.
1. 2.
c. Vraagjedocenten/ofleermeesteromfeedback.
Tops:
Tips:
7.9 Toets
Opdracht25
WatisencapsulatieinOOP?
Hetprocesvanhettoewijzenvanattributenaaneenobject.
Nee Ja
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Hetverbergenvandeinterneimplementatiedetailsvaneenobjectenhetbeperkenvandetoegangtotzijn gegevens.
Hetvermogenommethodenvaneenklassetehergebruikeninandereklassen.
Hetvermogenomverschillendeklassentecombinerentotéénenkeleklasse.
Opdracht26
Watisinheritance(overerving)inOOP?
311 Blok7 ObjectOriëntedProgramming
Hetproceswaarbijeenklassewordtopgesplitstinmeerderekleinereklassen.
Hetvermogenommethodenmetdezelfdenaamtedefiniëreninverschillendeklassen.
Hetvermogenomobjectenvanverschillendeklassentecombinerentotéénenkelobject.
Hetproceswaarbijeenklasseattributenenmethodenerftvaneenandereklasse.
Opdracht27
WatishetverschiltusseneenklasseeneenobjectinOOP?
Eenklasseiseenabstracterepresentatie,terwijleenobjecteeninstantieisvandierepresentatie.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Eenklasseiseenspecifiekeimplementatievaneenobject.
Eenklasseheeftalleenmethoden,terwijleenobjectalleenattributenheeft.
Erisgeenverschil,determenwordendoorelkaargebruiktinOOP.
Opdracht28
Watdoet__init__()inPython?
Eenspecialemethodediewordtgebruiktomobjectentevernietigen.
Eenmethodediewordtgebruiktomdeframesnelheidvaneenprogrammateregelen.
Eenmethodediewordtgebruiktomnieuweobjectenteinitialiserenopbasisvaneenklasse.
Eenmethodediewordtgebruiktomdegegevensineenklassevariabeletewijzigen.
Opdracht29
WatishetdoelvanoverervinginOOP?
Hetminimaliserenvandegeheugenvereistenvaneenprogramma.
Hetverminderenvandecomplexiteitvaneenprogramma.
Hethergebruikenvancodeenhetbevorderenvanmodulariteit.
Hetmaximaliserenvandesnelheidvaneenprogramma.
Opdracht30
WatishetbelangrijkstevoordeelvanencapsulatieinOOP?
Hetminimaliserenvandegeheugenvereistenvaneenprogramma.
Hetmaximaliserenvandesnelheidvaneenprogramma.
Hetverminderenvandecomplexiteitvaneenprogramma.
Hetbeperkenvandetoegangtotdeinterneimplementatiedetailsvaneenobject.
Opdracht31
WatishetverschiltusseneenklassevariabeleeneeninstantievariabeleinOOP?
Eenklassevariabelewordtgedeclareerdbinneneenmethode,terwijleeninstantievariabelewordtgedeclareerd binneneenklasse.
Eenklassevariabeleheeftdezelfdewaardevooralleobjectenvaneenklasse,terwijleeninstantievariabele uniekisvoorelkobject.
Eenklassevariabelewordtgebruiktomgegevensopteslaandierelevantzijnvooreenspecifiekobject,terwijl eeninstantievariabelewordtgebruiktomgegevensopteslaandierelevantzijnvooralleobjectenvaneen klasse.
Eenklassevariabeleheefteenlagerescopedaneeninstantievariabele.
312
Opdracht32
WelkevandevolgendenaamgevingsconventieswordtvaakgebruiktvoorklasseninPython? PascalCase lowerCamelCase snake_case
UPPER_SNAKE_CASE
Opdracht33
HoeverschilteenmethodevaneenfunctieinPython?
Eenmethodeheefteenlokaalbereik,terwijleenfunctieeenglobaalbereikheeft.
Eenmethodeheeftaltijdeenreturnstatement,terwijleenfunctiedatniethoefttehebben.
Eenmethodekanalleenwordenopgeroepenbinneneenklasse,terwijleenfunctieoveralkanworden opgeroepen.
Eenmethodekanalleenwordengebruiktvoorhetafdrukkenvanberichten,terwijleenfunctiekanworden gebruiktvoorallerleitaken.
Opdracht34
WelkevandevolgendeklassedefinitiesiscorrectinPython?
class Persoon:
def __init__(zelf, naam): zelf.naam = naam
class Persoon:
def init(self, naam): self.naam = naam
class Persoon:
def __init__(self, naam): naam = naam
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
class Persoon:
def __init__(self, naam): self._naam = naam
Opdracht35
Watdoetdepygame.event.get()methode?
313 Blok7 ObjectOriëntedProgramming
HetstartdePygame-bibliotheek.
Hethaaltallegebeurtenissenopuitdeevenementenwachtrij.
Hetstoptdeuitvoeringvanhetspel.
Hetlaadtafbeeldingenengeluidenvoorhetspel.
Opdracht36
WatishetdoelvanhetverwerkenvaneventsinPygame?
Omgeluidseffectenaftespeleninhetspel.
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
Omafbeeldingenophetschermtetekenen.
Omdeinvoervandespelertedetecterenendienovereenkomstigactiesuittevoeren.
Omdeframesnelheidvanhetspelteregelen.
Opdracht37
HoewordttekstophetschermgeplaatstmetPygamefont?
Metderender()methodevaneenSurfaceobject.
Metdeprint()functie.
Metdeblit()methode.
Metdedraw()functievaneenFontobject.
Opdracht38
Hoewordtdeopvulkleur(fillcolor)gewijzigdbijhetgebruikvandepygame.fill()methode?
Doordeset_fill_color()methodeaanteroepenopeenSurfaceobject.
Doordeset_fill()methodeaanteroepenopeenSurfaceobject.
Doordefill_colorattribuutwaardevaneenSurfaceobjectrechtstreekstewijzigen.
Doordeopvulkleurdirectalsargumentmeetegevenaandemethode.
Opdracht39
WatisdestandaardachtergrondkleurvaneennieuwgecreëerdscherminPygamealsdeachtergrondnietexpliciet isingesteld?
Wit
Zwart
Grijs Transparant
314
CONCEPT (ZONDERBEELD-EN TAALREDACTIE)
A absolutepaden149 C carriagereturn156 Crypto's204 D delimiter163 E escapekarakter148 G genestefolders147 glob152 P parameters172 R rawstring148 Relatievepaden149 W werkboek169 wildcards152 workbook169 315
INDEX