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