BBO_CONCENPT_lpm_Python

Page 1

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

Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.