[17:55] <FOAD> Zo.
[18:00] <StefandeVries> :)
[18:00]  * FOAD zit er al klaar voor.
[18:21] <leoquant> dit kanaal is nu "gesloten" vragen kunnen in ubuntu-nl-mwanzo gesteld worden
[18:22] <leoquant> 19.30 workshop python 4
[18:30] <leoquant> ready commandoline , niekie , StefandeVries ?
[18:30] <commandoline> leoquant: ja
[18:30] <commandoline> OK, tijd om te beginnen met alweer de vierde les :)
[18:31] <commandoline> vandaag wilde ik de stof van de vorige les uitbreiden met iets wat er op lijkt:
[18:31] <commandoline> dictionaries
[18:31] <commandoline> (lett. woordenboeken)
[18:31] <commandoline> dictionaries lijken erg op lists (lijsten) zoals we die vorige keer hebben behandeld
[18:32] <commandoline> het verschil wil ik jullie graag uitleggen aan de hand van een voorbeeld
[18:32] <commandoline> opnieuw in de interactieve Python Shell, dus start allemaal een terminal, en start daarin python.
[18:32] <commandoline> (Toepassingen>Hulpmiddelen>Terminalvenster ; daarna python intikken en op enter drukken)
[18:33] <commandoline> tik vervolgens het volgende in:
[18:33] <commandoline> winkel_inventaris = {"appels": 20, "bananen": 2}
[18:34] <commandoline> het voorbeeld lijkt op dat van vorige week
[18:34] <commandoline> opnieuw hebben we hier een lijst van winkel inventaris
[18:35] <commandoline> waar bij een normale lijst je echter alleen maar items hebt
[18:35] <commandoline> heb je hier zog. keys en values.
[18:35] <commandoline> bij een list benader je de items met behulp van een index zoals we vorige week hebben gezien (0, 1, 2 etc.)
[18:36] <commandoline> nu doen we dat d.m.v. een woord, de key.
[18:36] <commandoline> (lett. sleutel)
[18:36] <commandoline> dat woord hebben we opgegeven.
[18:36] <commandoline> vorige week hadden we om het eerste item te krijgen het volgende gedaan:
[18:36] <commandoline> print winkel_inventaris[0]
[18:36] <commandoline> dat werkt deze keer niet
[18:37] <commandoline> we moeten deze keer een key gebruiken
[18:37] <commandoline> bijv.:
[18:37] <commandoline> print winkel_inventaris["appel"]
[18:37] <commandoline> eh, print winkel_inventaris["appels"]
[18:37] <commandoline> probeer dat maar eens
[18:37] <commandoline> je ziet dat python het getal '20' terug geeft.
[18:38] <commandoline> even opsommend:
[18:38] <commandoline> - een dictionary bevat net zoals een list een opsomming van gegevens
[18:38] <commandoline> - een list is geordend op index (0, 1, 2)
[18:39] <commandoline> - een dictionary is geordend op key ("appels", "bananen" in dit geval)
[18:39] <commandoline> - een dictionary geeft dus de mogelijkheid om items op te slaan, maar om i.p.v. een nummer ernaar te verwijzen met bijv. een stukje tekst.
[18:40] <commandoline> kan iedereen dat tot nu toe volgen?
[18:40] <commandoline> mooi, tijd om dan wat meer te gaan doen met winkel_inventaris
[18:40] <commandoline> stel bijv. dat de winkel in één keer alle appels verkoopt. Dan kunnen we twee dingen doen:
[18:41] <commandoline> - winkel_inventaris["appels"] op 0 zetten
 ik krijg invalid syntax. maar zit op python 3, bij print winkel_inventaris["appels"]
 ik krijg invalid syntax. maar zit op python 3, bij print winkel_inventaris["appels"]
[18:41] <leoquant> oops
[18:41] <StefandeVries> print(winkel_inventaris["appels"])
[18:41] <commandoline> - winkel_inventaris["appels"] wissen, dan houden we de volgende dictionary over:
[18:42] <commandoline> {"bananen": 2}
[18:42] <commandoline> beide gaan we even doen, nadat ik de vraag heb beantwoord
[18:42] <commandoline> oh, heeft StefandeVries al gedaan, zoals afgesproken :)
[18:42] <StefandeVries> ;)
[18:42] <commandoline> goed, laten we eerst maar eens de waarde van appels veranderen in 0
[18:43] <commandoline> dat gaat met de volgende code:
[18:43] <commandoline> winkel_inventaris["appels"] = 0
[18:43] <commandoline> je ziet dat het opnieuw erg lijkt op hoe lijsten werken, alleen gebruiken we nu opnieuw in plaats van een index een stukje tekst (string)
[18:44] <commandoline> we kunnen de wijziging zien door de list weer te printen:
[18:44] <commandoline> print winkel_inventaris
[18:44] <commandoline> *dictionary weer te printen
 >>> winkel_inventaris["appels] = 0
[18:45] <commandoline> je bent een " vergeten
[18:45] <commandoline> na appels
[18:45] <StefandeVries> erkan^ = afsluitende dubbele aanhalingstekens in de index
[18:47] <commandoline> goed, dan gaan we nu de wat rigoureuzere manier gebruiken:
[18:47] <commandoline> appels verwijderen uit de dictionary
[18:48] <commandoline> dat gaat op de volgende manier, opnieuw lijkt het erg op de manier waarop we dat bij lists doen:
[18:48] <commandoline> del winkel_inventaris["appels"]
[18:48] <commandoline> vervolgens kunnen we het resultaat weer controleren met print winkel_inventaris
[18:48] <StefandeVries> Iedereen met vraag over volgorde: dit gebeurt door de snellere verwerking door/in het geheugen, aldus Learning Python, 4th edition
[18:50] <commandoline> goed, we kunnen nu waardes aanpassen in een dictionary en verwijderen
[18:50] <commandoline> we moeten nog maar één andere bewerking doen: waardes toevoegen.
[18:50] <commandoline> en dat gaat op precies dezelfde manier als een waarde aanpassen:
[18:50] <commandoline> winkel_inventaris["peer"] = 50
[18:51] <commandoline> vervolgens kunnen we het resultaat nog eens bekijken door de dictionary weer te printen.
[18:51] <commandoline> {'peer': 50, 'bananen': 2}
[18:51] <commandoline> is het resultaat
[18:51] <commandoline> en opnieuw zien we dat een dictionary geen volgorde heeft.
[18:52] <commandoline> nog vragen tot nu toe?
[18:52] <StefandeVries> erkan^: [] voor lists-definitie, {} voor dictionary-definitie. [] voor de index van beide :)
[18:52] <commandoline> vraag was: erkan^> wat is verschilelnd tussen [] en {} ? of maakt dat niet uit ?
[18:53] <commandoline> http://typewith.me/ep/pad/view/ro.v4Dr17BY6IF/latest
[18:53] <commandoline> dan gaan we nu weer verder.
[18:53] <commandoline> goed, we hebben voor vandaag een nieuw programma op de planning staan.
[18:54] <commandoline> het adresboekprogramma
[18:54] <commandoline> het idee is dat we iemands naam invoeren, en vervolgens iemands mailadres
[18:54] <commandoline> we kunnen dan aan het programma door een naam in te voeren, het emailadres vinden.
[18:54] <commandoline> goed, eerst maar weer eens een menu.
[18:55] <commandoline> de opties zijn:
[18:55] <commandoline> Laat alle mailadressen zien
[18:55] <commandoline> Voeg mailadres toe
[18:55] <commandoline> Verwijder mailadres
[18:55] <commandoline> & Afsluiten
[18:55] <commandoline> vrij logisch.
[18:56] <commandoline> de afgelopen keren gaven we alle menuopties weer d.m.v. print-statements
[18:56] <commandoline> maar dat is eigenlijk vooral veel typwerk
[18:56] <commandoline> en ook tijdens het onderhouden van code is het niet zo handig
[18:57] <commandoline> daarom ga ik jullie vandaag een nieuwe methode laten zien om de menu items weer te geven
[18:57] <commandoline> we gebruiken een list daarvoor.
[18:57] <commandoline> door die list gaan we heen lopen met de for-loop van afgelopen keer, en dan laten we de for-loop alle menuitems printen.
[18:59] <commandoline> als we de code zo zouden uitvoeren, zouden we alleen de optie zien.
[18:59] <commandoline> we willen er alleen ook nog een nummer voor zetten.
[18:59] <commandoline> daarvoor kunnen we de index van de list mooi gebruiken.
[19:00] <commandoline> we kunnen achter de index van een item komen door menu_opties.index(optie) te gebruiken
[19:01] <commandoline> de code die we nu hebben ziet er goed uit, maar zal nog crashen als we die uitvoeren.
[19:01] <commandoline> dat gebeurt omdat we nu proberen om een geheel nummer (integer) op te tellen bij een stukje tekst (optie, en ") ")
[19:01] <commandoline> dat kan niet.
[19:01] <commandoline> daarom moeten we eerst het nummer omzetten naar een stukje tekst (string)
[19:02] <commandoline> dat kan d.m.v. str()
[19:02] <commandoline> als dat gebeurd is, hoeven we de gebruiker alleen nog te vragen om een keuze te maken.
[19:03] <commandoline> we doen dat buiten de for-loop, want anders wordt die vraag wat te vaak gesteld.
[19:04] <commandoline> we hoeven nu alleen nog alle menuopties af te handelen
[19:04] <commandoline> dat doen we net zo als de vorige keren m.b.v. het if-statement.
[19:05] <commandoline> ik zie nu trouwens dat ik nog een foutje heb gemaakt, een paar minuten geleden.
[19:05] <commandoline> het zit in de menu code, ziet iemand het?
[19:05] <commandoline> als dat niet zo is, is het niet vreemd.
[19:06] <commandoline> een hint: indexes beginnen te tellen vanaf 0.
[19:07] <commandoline> goed, ik zal jullie niet langer in spanning houden :P
[19:07] <commandoline> we doen nu:
[19:07] <commandoline> nummer = menu_opties.index(optie)
[19:07] <commandoline> nummer is dus in het geval van "Laat alle emailadressen zien"
[19:07] <commandoline> 0
[19:07] <commandoline> verderop doen we:
[19:07] <commandoline> if keuze == 1:  #laat alle emailadressen zien
[19:08] <commandoline> we moeten dus nummer verhogen met één.
[19:08] <commandoline> dat kan simpel:
[19:08] <commandoline> nummer = nummer +1
[19:08] <commandoline> of verkort:
[19:08] <commandoline> nummer += 1
[19:08] <commandoline> het kan hier trouwens nog korter:
[19:08] <commandoline> nummer = menu_opties.index(optie) +1
[19:08] <commandoline> maar ik laat het zo staan als het is voor de duidelijkheid
 ik kreeg een foutmelding:  File "adresboekje.py", line 16    elif keuze == 2:
[19:09] <commandoline> dat klopt, de code is nog niet volledig
[19:09] <commandoline> goed, we gaan nu de opties uiterken.
[19:10] <commandoline> *uitwerken
[19:10] <commandoline> ik wil beginnen met de simpelste optie: een mailadres toevoegen.
[19:10] <commandoline> we moeten twee dingen weten van de gebruiker:
[19:10] <commandoline> naam
[19:10] <commandoline> (die later key wordt)
[19:11] <commandoline> en mailadres
[19:11] <commandoline> (die later value wordt)
[19:11] <commandoline> dat doen we m.b.v. raw_input()
[19:12] <commandoline> goed, nu hebben we nog een dictionary nodig om alle mailadressen in op te slaan.
[19:12] <commandoline> ik maak die helemaal aan het begin van het programma aan.
[19:12] <commandoline> toevoegen werkt nu al, maar we vertellen de gebruiker nog even dat het gelukt is
[19:13] <commandoline> iemand vragen over de code tot nu toe?
[19:14] <commandoline> prima, de volgende optie die we gaan implementeren is alle mailadressen laten zien
[19:14] <commandoline> ten eerste moeten we kijken of er wel een mailadres is.
[19:14] <commandoline> anders is er weinig te laten zien.
[19:14] <commandoline> dat kunnen we doen met len()
[19:14] <commandoline> die hadden we vorige week geloof ik ook al gebruikt
[19:15] <commandoline> goed, weergeven van een dictionary kan via print.
[19:15] <commandoline> maar ook via de for-loop
[19:16] <commandoline> print naam, ":", adresboek[naam]
[19:16] <commandoline> wat hier gebeurd:
[19:16] <commandoline> naam wordt weergeven
[19:16] <commandoline> ":" wordt weergeven
[19:16] <commandoline> adresboek[naam] (het mailadres) wordt weergeven
[19:17] <commandoline> de for loop loopt standaard door alle keys heen
 commandoline: je kan niet printen met een for-loop, wel bínnen een for-loop
[19:17] <commandoline> in het vorige voorbeeld dus  de soorten fruit
[19:17] <commandoline> CasW heeft helemaal gelijk ;)
[19:18] <commandoline> de for loop zorgt alleen maar dat een stukje code meerdere keren wordt uitgevoerd
[19:18] <commandoline> en printen kán dat stukje code zijn
[19:18] <commandoline> (en dat is hier zo)
[19:18] <commandoline> goed, tijd voor de op één na laatste optie:
[19:18] <commandoline> verwijderen
[19:19] <commandoline> we vragen de gebruiker om een naam
[19:19] <commandoline> en verwijderen die dataset (zowel de key als de value dus) uit de dictionary
[19:20] <commandoline> is de code tot nu toe duidelijk?
[19:20] <leoquant> veel ja's
[19:20] <commandoline> ja, ik zag het
[19:21] <commandoline> ik heb nog even de foutmelding toegevoegd aan het eind
[19:21] <commandoline> (bij geen geldige keuze)
[19:21] <commandoline> een gewoon print statement.
[19:21] <commandoline> het programma draait momenteel maar één keer.
[19:22] <commandoline> terwijl we willen dat het steeds door draait
[19:22] <commandoline> daarom gaan we weer de bekende while loop gebruiken.
[19:23] <commandoline> zo, nu draait ons programma 'voor eeuwig'
[19:23] <commandoline> ook niet helemaal de bedoeling.
[19:23] <commandoline> dus laten we nog even de laatste menuoptie toevoegen:
[19:23] <commandoline> afsluiten
[19:23] <commandoline> een kwestie van de loop breken, met break
[19:24] <commandoline> goed, het programma is nu in principe af, maar voor de afwerking wil ik nog even een welkoms- en afsluitboodschap tonen.
[19:24] <commandoline> goed, probeer het maar te draaien.
[19:25]  * commandoline is benieuwd of er typfouten in zitten ;)
 Maar ik wil de adressen op volgorde zien, kan dat?
[19:27] <commandoline> FOAD: dat kan, maar dat bewaar ik voor later.
 else: IndentationError: expected an indented block
[19:27] <commandoline> mooi, opgelost
[19:27] <commandoline> goed, de komende twee weken gaat de les niet door i.v.m. de schoolvakantie
[19:28] <commandoline> wel heb ik nog een opdracht voor jullie bedacht
[19:28] <commandoline> probeer dit programma zo om te schrijven, dat het een woordenboek wordt.
[19:28] <commandoline> met als opties:
[19:28] <commandoline> - een woord met betekenis toevoegen
[19:29] <commandoline> - alle woorden & betekenissen tonen
[19:29] <commandoline> - een woord verwijderen
[19:29] <commandoline> - evt. een woord aanpassen
[19:29] <commandoline> en voor degene die nog meer wil oefenen:
[19:30] <commandoline> - probeer een winkelinventarisprogramma te schrijven, dat bijhoud wat een winkel allemaal in voorraad heeft.
[19:30] <commandoline> die laatste is ingewikkeld, geen probleem als dat niet lukt.
[19:30] <StefandeVries> Wij zorgen voor uitwerkingen ;)
[19:30] <commandoline> Prettige vakantie allemaal en bedankt voor jullie komst! Tot over twee weken.
[19:31] <FOAD> Dank je wel commandoline en ondersteuning.
[19:31] <erkan^> bedankt commandoline (-:
[19:31] <commandoline> oja, nog vragen?
[19:31]  * commandoline is daarvoor nog even aanwezig
[19:31] <emiel1976_> bedankt. tot over 2 weken
[19:32] <FOAD> Geen vragen, ik ga lekker oefenen.
[19:32] <erkan^> ik heb geen vraag, in de toekomst heb ik een hulp nodig,d an kom ik wel bij python-nl
[19:32] <erkan^> (-:
[19:32] <commandoline> d
[19:33] <StefandeVries> we zijn bijna dagelijks online, dus mocht je in je vakantie nog vragen hebben, dan val je maar binnen ;)