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