[17:22] /quit [18:27] zo, nu even afwachten of er publiek is deze avond [18:31] Mooi dat jullie er weer allemaal zijn, en welkom bij de 12e pythonles! [18:32] goed, het huiswerk voor vandaag was niet veel [18:32] maar ik wil nog wel even vragen of iemand wat te vragen heeft over tuples, keyword arguments en/of PEP8 [18:33] nou, zo snel zijn we nog nooit klaar geweest met het huiswerk :P [18:33] dat moeten we vaker doen :P [18:34] ok, deze les is de laatste les waarin jullie echt nieuwe dingen zullen leren [18:35] maar er is volgende week nog wel les [18:35] dit staat er voor vandaag op het programma: [18:35] - decorators [18:36] - een aantal modules [18:36] te beginnen met decorators, ik wil die uitleggen aan de hand van een voorbeeld. [18:36] hannie> gaan we nog leren webpagina's te maken? [18:37] Nee, hannie, dat niet meer. Dat zou te diep gaan voor een beginnerscursus [18:37] maar misschien dat we volgende week wel alvast een tipje van de sluier oplichten. [18:38] http://typewith.me/ep/pad/view/ro.6e1a1ZfrVlf/latest [18:39] ok, jullie zien dat ik een simpele class heb gemaakt [18:39] die class moet een rechthoek voorstellen [18:40] de class heeft twee properties, lengte en breedte, en die kunnen we gebruiken [18:40] handig, maar wat als we oppervlakte willen weten? [18:41] die property zou iedere keer bijgewerkt moeten worden als we lengte of breedte aan zouden passen [18:41] dat is niet erg handig [18:41] een alternatief zou zijn om een method te maken [18:41] iets als: [18:41] verkrijg_oppervlakte() [18:41] het nadeel is dat dat minder 'mooi' staat dan een echte property [18:42] daarvoor is een oplossing, die ik jullie nu ga laten zien. [18:42] goed, ik heb nu een normale method gemaakt, eigenlijk wat ik net beschreef [18:42] nu wil ik er een property van maken [18:43] dat heb ik nu gedaan [18:44] wat er ongeveer gebeurt [18:44] het methodobject 'oppervlakte' wordt door property() omgezet in een object dat zich voordoet als een normale property [18:44] zoals lengte en breedte [18:44] en dat object vervangt dan het oorspronkelijke oppervlakte [18:45] dat maakt mogelijk wat ik nu ga typen. [18:45] hannie> de eigenschap is hier dus lengte * breedte? [18:45] Inderdaad, hannie [18:46] het resultaat van deze code is '20' en '600' [18:46] Wat doet die property nou? [18:47] Die property zorgt ervoor dat je de returnwaarde van de functie als variabele(property) kunt benaderen [18:47] ok, tot nu toe is er nog geen decorator bij betrokken geweest [18:48] we kunnen de regel 'oppervlakte = property(oppervlakte)' vervangen door iets anders [18:48] en dat wordt een decorator genoemd [18:48] en dat is nu gebeurt [18:49] @property betekent 'voer op deze method de property functie uit, en sla het resultaat op in de naam van die method' [18:49] we hadden i.p.v. property ook een andere functie kunnen gebruiken, zoals jullie straks zullen zien [18:50] dat zorgt dan natuurlijk wel voor een ander resultaat. [18:51] ik ga jullie nu een andere veelgebruikte decorator laten zien [18:51] @staticmethod [18:52] een static method is een method (van een class, zoals altijd) die geen 'self' meekrijgt [18:52] en dus niks kan veranderen aan een object [18:52] je kan het wel zien als een functie die aan een class wordt gehangen. [18:52] je hebt om een static method aan te roepen dan ook geen instantie nodig [18:53] goed, een voorbeeldje in het typewith.me bestand [18:53] http://typewith.me/3caWKjndO1 (voor de nieuwkomers) [18:56] wat jullie zien is dat ik twee rechthoeken aanmaak [18:56] en dat ik die vergelijk d.m.v. een static method van het object Rechthoek [18:57] groter() is eigenlijk gewoon een functie, die ik aan Rechthoek heb gehangen omdat hij daar zo goed bij past [18:57] maar hij had er net zo goed naast kunnen staan. [18:57] ok, nog een voorbeeld, een soort 'alternatieve constructor' [18:58] een vierkant heeft gelijke zijden, dus de 'constructor' voor een vierkant heeft maar één argument nodig [18:59] dat wordt vervolgens gewoon 2x doorgegeven aan de échte Rechthoek constructor. [19:00] ok, dat is alles wat ik over decorators en de twee voorbeelden daarvan te melden heb, vragen tot zover? [19:00] hannie> Het is duidelijk, maar ik moet er wel mee gaan stoeien [19:00] De praktijk is de beste leermeester ;) [19:01] idd :) [19:01] ok, dan gaan we verder naar onderwerp twee van vandaag: modules [19:01] jullie hebben al een aantal modules gezien, maar ik wil jullie er vandaag nog een aantal laten zien [19:02] maar eerst even een linkje: http://docs.python.org/library/index.html [19:02] de documentatie van python voor alle met python meegeleverde modules [19:03] daarin kan je alle functies en classes die ik gebruik uit de python modules vandaag nazoeken [19:03] zodat je precies weet wat ze doen [19:03] ik raad aan om dat een keertje te doen, zodat je straks ook modules kan gebruiken die ik niet heb uitgelegd door de documentatie ervan te lezen [19:04] er zijn namelijk veel meer nuttige modules dan ik in een cursus kan laten zien. [19:04] we zouden er 2 cursussen mee kunnen vullen :) [19:05] http://paste.ubuntu.com/601417/ [19:05] ik wil de modules van vandaag uitleggen aan de hand van twee voorbeelden [19:05] het eerste voorbeeld haalt de titels van blogartikels van de planet van ubuntu-nl op, en laat die op het scherm zien. [19:06] even wat termen verduidelijken: [19:06] planet van ubuntu-nl: http://planet.ubuntu-nl.org/ [19:07] RSS: een op de taal XML gebaseerde manier om bijv. nieuwsberichten te beschrijven [19:07] de link van de 'RSS feed' van de Ubuntu-NL planet staat hier: http://planet.ubuntu-nl.org/rss20.xml [19:08] als je die opent in je browser krijg je waarschijnlijk een soort grafisch overzicht [19:08] alleen dat krijgen we niet van python als invoer [19:09] wat we te zien krijgen is de broncode van die pagina, en die ziet er zo uit: [19:09] http://paste.ubuntu.com/601419/ [19:10] Wat betekent de u voor '\n'? [19:10] Die u zorgt ervoor dat in welk schrift de website ook zou staan, de '\n' altijd een nieuwe regel is; Chinees, Cyrillisch, etc. [19:11] goed, terug naar het pythonprogramma [19:11] eerst importeren we twee modules: [19:11] - urllib2 [19:11] - xml.dom.minidom [19:12] met de eerste kunnen we documenten van internet (http) ophalen [19:12] bijv. een webpagina, of hier dus, een rss feed [19:12] met de tweede kunnen we xml omzetten in objecten (parsen), en aangezien rss gebaseerd is op xml, kunnen we er ook rss mee lezen [19:13] op regel 4 haal ik m.b.v. urllib2 de pagina op. [19:13] wat die functie teruggeeft is een soort file-object [19:13] ik kan er bijv. .read() op aanroepen om de data in een string te krijgen [19:13] maar dat doe ik niet [19:13] want xml.dom.minidom kan als invoer precies zo'n file object verwerken [19:14] dat gebeurt op regel 7 [19:15] 'dom' is nu een object dat we kunnen gebruiken om de data uit het xml-bestand te lezen [19:15] (dom betekent Document Object Model) [19:15] we halen alle blokken tekst tussen op, en dat zijn er meerdere. [19:16] op regel 9 lopen we door al die 'titles' heen [19:16] er zitten een paar titles teveel tussen [19:16] daarom gebruik ik if: [19:16] if title.parentNode.tagName == "item": [19:17] parentNode geeft de 'tag' waar de huidige title in staat [19:17] als je dat niet begrijpt, geen probleem [19:17] ga ervan uit dat het gewoon nodig is hier om alle goede data te krijgen [19:17] als aan die voorwaarde is voldaan, gebeurt het volgende: [19:17] result.append(title.childNodes[0].nodeValue) [19:18] relevant is 'title.childNodes[0].nodeValue' [19:18] dat is een ingewikkelde xml.dom.minidom notatie voor 'geef me alle tekst binnen ' [19:18] en die tekst (string) wordt dus toegevoegd aan result [19:18] daarna wordt het resultaat alleen nog maar uitgeprint naar de terminal [19:19] vragen over dit programma? [19:20] ok, dan gaan we over naar het huiwerk, daar wil ik nog even wat uitlegtijd bij hebben [19:21] dat kan [19:22] leoquant: bedankt :P [19:22] http://paste.ubuntu.com/601425/ [19:22] * huiswerk [19:22] ik heb jullie hier een kant en klaar pythonprogramma gegeven, dat ik een behoorlijke tijd terug heb geschreven [19:23] het bevat geen commentaar, niet zo netjes. [19:23] nou wil ik jullie vragen om dat te doen, waardoor je begrijpt welke modulefunctie wat doet. [19:24] het voorbeeld maakt gebruik van de sqlite3 module [19:24] met die module kun je een database aanmaken [19:25] een database die je kan benaderen via SQL [19:25] dat is een taal speciaal geschreven voor databases [19:26] die taal is niet moeilijk, maar valt wel buiten deze cursus [19:26] dus daarom zal ik de stukken programma in sql even uitleggen [19:27] CREATE TABLE IF NOT EXISTS books (id INTEGER PRIMARY KEY, title TEXT, writer TEXT) [19:27] betekent 'maak een database, als die niet al bestaat, waarin ik een boekenverzameling in op kan slaan' [19:27] (zeg maar wat gegevens over de boeken) [19:27] INSERT INTO books VALUES (null, ?, ?) [19:28] betekent 'stop in de database 'boeken' de data (null, ?, ?)' [19:28] ik zou wel graag willen dat jullie uitzoeken wat die vraagtekens doen. [19:28] want dat is onderdeel van het pythondeel van de opdracht :) [19:28] SELECT * FROM books WHERE title = ? [19:28] geef alle boeken waar de titel ? is [19:29] SELECT * FROM books WHERE writer = ? [19:29] idem, maar dan met de schrijver [19:29] SELECT * FROM books [19:29] geeft alle boeken terug [19:30] ok, daarmee zijn we klaar met de complete basis van python! [19:30] congrats! [19:30] als je met een idee rondliep voor deze cursus van een programma dat je wil schrijven, dan zou ik dat proberen uit te voeren [19:30] en allebei zeeeer bedankt! [19:31] dan kan ik over *2 weken* nog even helpen met een aantal dingen [19:31] als er vragen ontstaan. [19:31] vind het geweldig opgezet [19:32] de volgende (laatste) les is over 2 weken (ondanks wat ik eerder zei) [19:32] ja dat wou ik net nog even vragen..:) [19:32] nog één ding [19:32] (20:28:42) hannie: Moet de uitleg in het Engels? [19:33] die vraag is waarschijnlijk gebaseerd op het feit dat de programma's van vandaag in het Engels zijn [19:33] en de rest in het Nederlands was. [19:33] dat heb ik gedaan om het makkelijker te maken, maar als je Engels kan schrijven (evt. met wat opzoeken), zou ik zeker Engelse programma's schrijven [19:34] het maakt het veel makkelijker om (internationaal) samen te werken aan programma's. [19:35] ok, dat was het voor vandaag, tot over twee weken, en bedankt voor jullie komst! === ChanServ changed the topic of #ubuntu-nl-klas to: Zaterdag 30-04-11 19.30-20.30 workshop PYTHON: #Ubuntu-nl-klas | Info: http://wiki.ubuntu-nl.org/community/mwanzo/Workshop/BasiscursusPython | Leiding: commandoline en stefandevries | 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.