[18:28] alles gereed hier [18:28] ok, bedankt [18:29] dank je, leoquant [18:30] Het is 19:30, dus laten we beginnen met de 8e pythonles! [18:31] welkom allemaal, we gaan vandaag verder met waar we vorige week ook al mee bezig waren: OOP [18:31] (Object Oriented Programming) [18:31] laten we beginnen met het huiswerk van de vorige keer bespreken [18:31] http://typewith.me/ep/pad/view/ro.KilZOISYC3j/latest [18:32] het leek me goed om de uitwerking daarvan tijdens deze les te maken, omdat het toch een vrij ingewikkeld onderwerp is zoals jullie vorige les hebben gemerkt [18:33] de opdracht was om de door ons geschreven class te gaan gebruiken. [18:34] om dat te doen, hebben we eerst objecten nodig [18:34] want met een class alleen kunnen we niks [18:34] We gaan dus de class 'instantieren'; we krijgen dan een 'instantie' zoals jullie vorige week hebben gezien. [18:35] vaak wordt in plaats van de term 'instantie' ook de term 'object' gebruikt. [18:35] ok, zoals jullie zien heb ik nu een nieuw adresboek aangemaakt [18:35] nu gaan we daar een mailadres aan toevoegen [18:36] en nog een adres [18:37] goed, we moesten het adresboek zoveel mogelijk gebruiken, en een adresboek heeft nog 3 methods (handelingen): [18:37] - verwijder [18:37] - sla_op [18:37] - laad [18:37] dus laten we die ook maar gebruiken, ten eerste verwijder [18:38] zo, ik ben geschrapt uit mijn eigen adresboek. [18:38] tijd om het adresboek op te slaan [18:39] goed, om de laatste method te gebruiken, namelijk laad(), gaan we een tweede adresboek aanmaken. [18:39] hannie: dat zit er prima uit :) [18:39] (19:39:20) hannie: elif keuze == 3: [18:39] (19:39:20) hannie: naamweg = raw_input("Welke naam moet weg?") [18:39] (19:39:20) hannie: mijnAB.verwijder(naamweg) [18:39] (19:39:26) hannie: Ik had dit [18:39] (19:39:46) hannie: mijnAB zelfde als Adresboek1 [18:40] klopt, de naam adresboek1 is gewoon gekozen, net zoals je hierbij een naam kan kiezen: [18:40] getal = input("Geef een getal") [18:40] getal had net zo goed nummer kunnen zijn [18:40] hier is dat ook zo [18:40] ok, we gingen dus een tweede adresboek aanmaken [18:41] wat ik daarna heb gedaan, is het laden van het adresboek dat net was opgeslagen in het nieuwe adresboek [18:41] op dit moment is adresboek1 dus gelijk aan adresboek2 [18:42] oh, ik had een foutje gemaakt [18:42] ik wilde hetzelfde bestand laden [18:42] (bedankt, StefandeVries!) [18:42] en dat gebeurt nu ook [18:42] hannie> Ik zie alleen adresboek1=adresboek(). Heb ik adresboek2 gemist? [18:42] ik heb hier toch wat meer staan, momentje... [18:43] hannie: foutje van commandoline; we gebruiken voor adresboek2 het opgeslagen adresboek van adresboek1 [18:43] http://typewith.me/ep/pad/view/ro.KilZOISYC3j/latest [18:43] klopt bij mij gewoon [18:44] ik ga wel verder, want ik hoor verder geen mensen die het bestand niet kunnen volgen. [18:45] goed, ik wil aan het tweede adresboek een nieuw mailadres toevoegen. [18:45] en dat heb ik gedaan. [18:46] laten we om er een werkend programma van te maken ook nog even laten zien welke adressen nu precies in het adresboek zitten. [18:47] goed, we hebben nu een werkend programma, dat een adresboek aanmaakt en daar verschillende handelingen op uitvoert [18:47] het voordeel is dat we niet meer zelf hoeven na te denken over hoe we een bestand laden en opslaan, of over hoe je een naam verwijdert uit een dictionary [18:48] begrijpt iedereen nu wat dit programma doet? [18:48] (19:48:39) MedUsaXIII56: Ik snap het wel, maar hoe gebruik je dit programma nu precies ? [18:49] dit programma geeft altijd hetzelfde resultaat. [18:49] het laat puur zien hoe de class Adresboek functioneert. [18:50] (19:49:56) MedUsaXIII56: Ok, je moet dus zelf de raw inputs er in doen ? 2e vraag, we hebben geen functie aan gemaakt die alle adrssen laad zien of wel ? [18:50] Klopt allebei [18:50] maar, dat laatste is op zich niet nodig [18:50] want we hebben de property 'adressen' [18:50] en de vragen van MedUsaXIII56 sluiten prachtig aan op de link die ik jullie wilde geven: [18:51] http://paste.ubuntu.com/588654/ [18:51] hier wordt precies dezelfde class gebruikt [18:51] maar er is een programma omheen geschreven. [18:52] Ik ga dat programma nu niet uitgebreid uitleggen, maar ik raad jullie aan om het door te lezen en te draaien, en de volgende keer vragen te stellen als jullie (een deel ervan) niet begrijpen. [18:53] ik wil nu namelijk samen met jullie een programma schrijven, zodat je doorkrijgt hoe dat nou eigenlijk werkt, zo'n class schrijven. [18:53] hoewel, eigenlijk schrijven we samen de class die het gebruikt, jullie mogen het daaromheenliggende programma gebruiken. [18:54] het programma dat we gaan maken heet 'galgje.py' [18:54] en kan worden gebruikt om een spel te spelen wat jullie allemaal wel kennen :) [18:54] http://typewith.me/ep/pad/view/ro.KSz8svqakm4/latest [18:56] goed, we willen vandaag de logica achter het spel galgje gaan programmeren. [18:56] de interface die die logica gebruikt, gaan jullie later maken. [18:56] om dat wat toe te lichten [18:57] de class Adresboek bevatte de logica van het adresboekprogramma [18:57] de rest was de gebruikersinterface [18:57] centraal in galgje is het woord dat geraden moet worden. [18:58] dus we gaan een class maken die 'Woord' heet. [18:58] duidelijk tot zover? [18:58] OK, blijkbaar is het duidelijk. [18:59] dan wordt het nu eerst tijd om de eigenschappen (properties) en handelingen (methods) te bedenken. [19:00] in dit geval hebben we een aantal properties: [19:00] hannie: dat is aan te raden, zeker bij grote projecten [19:00] - aantal_fouten; op basis hiervan kunnen jullie in je interface de galg tekenen. [19:00] (20:00:19) hannie: Je zou dus eigenlijk eerst een ontwerp op papier moeten zetten? [19:00] (08:00:34 PM) StefandeVries: hannie: dat is aan te raden, zeker bij grote projecten [19:01] en ook bij kleine projecten kan het zeker in het begin, handig zijn :) [19:02] daarnaast is het voor de interface handig om te weten uit hoeveel letters het woord bestaat [19:02] dan kan die het juiste aantal 'streepjes' neerzetten. [19:02] dus een property 'lengte' [19:02] goed, dan de handelingen: [19:02] 'gok_letter' [19:03] misschien is raad_letter trouwens mooier. [19:03] en daarnaast: [19:03] raad_woord [19:04] goed, daarnaast moet het nog mogelijk zijn om een woord te geven aan de Woord-class [19:04] het woord dat geraden moet wordne [19:04] *worden [19:04] ik geef dat door via de handeling __init__, die automatisch wordt aangeroepen door python bij het maken van een instantie/object [19:04] zoals jullie later zullen zien. [19:05] (20:05:18) hannie: Moet je categorie?n maken, b.v. 5-letter woorden enz.? [19:06] nee, hannie, Python kan automatisch berekenen uit hoeveel letters het woord dat je gebruikt bestaat [19:06] en [19:06] en daar de interface op aanpassen [19:06] goed, ik heb alle handelingen/methods toegevoegd [19:07] nou nog de properties, ik doe dat meestal in __init__ want dan zijn ze direct vanaf het aanmaken van het object beschikbaar [19:08] ok, en daarmee is de eerste handeling/method gelijk klaar :) [19:08] laten we eerst eens de raad_woord handeling/method invullen [19:08] de gebruiker geeft daarbij een woord [19:09] de handeling/method kijkt of dat woord klopt [19:09] en als dat zo is, wordt 'True' teruggegeven. [19:09] als dat niet zo is, wordt het aantal fouten met 2 verhoogt [19:09] en wordt False teruggegeven. [19:11] en dat is alweer omgezet in code :) [19:11] goed, dan blijft er nog één handeling/method over [19:11] en die is het ingewikkeldst [19:11] de aanroeper ervan geeft een letter waarvan hij/zij denkt dat die in het woord zit. [19:12] als dat zo is, dan moeten *alle* posities waarop dat zo is doorgegeven worden. [19:12] hannie: waarom komen er tegelijk 2 fouten bij en niet 1? [19:12] en voor het gemak, geef ik dan ook meteen de bijbehorende letter mee terug [19:12] Raad je een letter fout dan heb je één fout. Raad je het woord fout, heb je twee fout [19:13] en anders wordt er één fout toegevoegd. [19:16] ok, en daarmee is de class af. [19:17] begrijp iedereen wat ik gedaan heb, en ook hoe deze class te gebruiken is? [19:17] * commandoline verwacht vragen :) [19:17] hannie: een beetje, heeft nog bestudering nodig [19:17] We zijn er bijna altijd ;) [19:18] goed, ik zal jullie dan een beetje op weg helpen met de interface [19:19] zodat jullie daar als jullie die deze week proberen te maken niet op vastlopen. [19:19] zoals jullie zien heb ik een stukje code toegevoegd [19:20] dat wil ik nog even regel voor regel behandelen. [19:20] wat het doet is de class gebruiken. [19:20] zo, even gok weer in raad verandert :) [19:21] ok, zo werkt het programma weer... [19:21] (even getest) [19:21] regel 35 [19:21] hannie> wat houdt main in? [19:21] ben ik net mee bezig :) [19:22] die regel betekend zoiets als: [19:22] 'Als dit bestand uitgevoerd wordt (niet bijv. geimporteerd via import), dan...' [19:22] __name__ wordt door python op '__main__' gezet als dat het geval is [19:22] ok, volgende regel, 36: [19:23] hierin wordt een nieuw woord aangemaakt [19:23] het woord 'test' moet geraden worden [19:23] vervolgens raden we een letter, de 't'. Die zit er twee keer in. We krijgen dan ook terug: [19:23] [[0, 't'], [3, 't']] [19:24] m.a.w., de letter t komt voor op positie 0 en positie 3 [19:24] dit is handig als jullie jullie interface gaan maken (hint) [19:24] oja, ik had nog een regel overgeslagen [19:24] regel 38, waarop de lengte van het woord wordt opgevraagd [19:25] dat geeft 4 terug [19:25] (die property hadden we eerder aangemaakt) [19:25] goed, daarna raden we nog een letter: [19:25] de 's' [19:25] die zit er ook in, we krijgen dus: [19:25] [[2, 's']] terug [19:26] pas hier verandert wat: [19:26] print woord.raad_letter("x") [19:26] we vragen de x, en die zit er niet in. we krijgen dus een lege list [] terug [19:26] en als we nu het aantal fouten opvragen: [19:26] print woord.aantal_fouten [19:26] is dat 1 [19:26] daarna raden we het woord 'tesst' (dom, teveel letters :() [19:27] dat levert achter de schermen twee punten aftrek op, trouwens [19:27] en we krijgen daarom False terug [19:27] daarna raden we 'test' [19:27] en dat klopt :) [19:27] daarna willen we nog even het aantal fouten weten [19:27] print woord.aantal_fouten. [19:28] dat is 3 [19:28] jullie kunnen precies diezelfde methods en properties gebruiken om het spel te laten spelen door de gebruiker [19:28] (20:28:28) hannie: en dan moet Barbertje nog getekend worden [19:29] als dat te ingewikkeld is, kan je gewoon de score laten zien in de interface [19:29] maar leuker is om met ascii-art e.d. te gaan werken [19:29] (zie wikipedia) [19:29] oja, nog een hint: [19:30] maak eerst een list aan met allemaal '_' erin [19:30] met de lengte van het woord [19:30] en vervang zodra je een letter terugkrijgt die klopt, het streepje op die index door de mee teruggegeven letter. [19:31] ok, ik ben benieuwd wat jullie maken van de twee opdrachten: [19:31] - probeer het adresboekprogramma zoals halverwege gegeven te begrijpen, en stel vragen als dat niet zo is: [19:31] http://paste.ubuntu.com/588654/ [19:32] - maak een mooie interface voor galgje, als je ergens op vastloopt, vraag dan in #ubuntu-nl-mwanzo, dan helpen we je een stukje op weg :) [19:32] goed, dat was het voor vandaag [19:32] bedankt voor jullie komst allemaal :) [19:32] en tot volgende week! [19:38] dank je, leoquant :) [19:38] mooi les [19:38] e [19:38] dank je