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