/srv/irclogs.ubuntu.com/2011/04/23/#ubuntu-nl-klas.txt

FOADIk ben er klaar voor.18:26
DooitzedeJongIk ook :)18:26
FOADBooyaka booyaka!18:27
DooitzedeJongWolkom Hannie18:29
commandolineWelkom allemaal bij de 11e les uit de pythoncursus!18:31
commandolinedeze keer weer gewoon via chat18:31
commandolinelaten we beginnen met het huiswerk18:31
commandolinehttp://paste.ubuntu.com/597948/18:32
commandolineik heb samen met Dooitze vandaag een uitwerking gemaakt18:32
commandolinemet daarbij een interface die de meeste fouten e.d. afvangt.18:32
commandolinede interface kunnen jullie zelf bekijken18:33
commandolinewat ik wel even wil bespreken18:33
commandolineis de Woordenlijst class18:33
commandolinewant daar zit alle logica in die jullie zelf ook (of niet :P) tegengekomen zijn18:33
commandolineten eerste is er een __init__ die de property data definieert.18:34
commandolinede gebruiker communiceert daarmee via de verwijder(), zoek_op() en voeg_toe_of_verander_betekenis() methods18:35
commandolinedie doen overigens niet veel bijzonders, ze vangen bijv. ook geen exceptions af18:36
commandolinedat doet de interface bij deze implementatie18:36
commandolineinteressanter zijn de laad() en sla_op() methods18:38
commandolinede laad opent het bestand op regel 3018:38
commandolineen loopt door iedere regel op een manier die jullie nog niet kennen, maar wel handig is :)18:38
commandolinefor regel in bestand:18:39
commandolinenamelijk18:39
commandolinedaarna scheiden we het woord van de betekenis:18:39
commandolinewoord, betekenis = regel.split(" = ", 1)18:39
commandolineopnieuw een trucje18:39
commandolineerboven staat uitleg18:40
commandolinedaarna roepen we op het resultaat nog .strip() aan18:40
commandolineen wordt ieder woord toegevoegd aan de dictionary self.data.18:40
commandolineoja, over die split()18:40
commandolinedie krijgt hier dus een tweede argument18:41
commandolinedat argument geeft aan hoe vaak er gesplit moet worden18:41
commandolinesla op doet ongeveer het omgekeerde:18:41
commandoline- die loopt door iedere entry van self.data18:42
commandoline- bouwt daaruit een regel op18:42
commandoline- en voegt die toe aan 'tekst'18:42
commandolinedaarna wordt het bestand geopend, dit keer met schrijfrechten, en daarna wordt de data weggeschreven m.b.v write()18:43
commandolinede interface zou ik zeker nog een keertje doorkijken vanwege de foutafhandeling die erin zit18:43
commandolinenl. IOError en KeyError, maar ook allerlei if-statements etc.18:44
commandolinehannie's programma ziet er ook goed uit, het bekijken waard :)18:45
commandolineiemand nog vragen over jullie uitwerkingen of de uitwerking van Dooitze en mij?18:45
commandolineof andere vragen?18:45
DooitzedeJongHannie gaf aan dat het laden wel goed werkte maar "writelines"18:46
DooitzedeJongniet helemaal18:47
DooitzedeJongVan de code van Hannie: http://paste.ubuntu.com/597946/18:48
commandolineok, toch even kort dan:18:48
commandolinenee, laat maar, kom ik later op terug :P18:49
commandolinejullie kennen nu al veel python zoals ook wel te zien is aan de programma's.18:50
commandolinewat ik vandaag wil doen is nog een aantal overgebleven dingetjes uitleggen18:50
commandolineten eerste: tuples18:51
commandolinetuples zijn gelijk aan lists, het verschil is dat ze 'unmutable' zijn.18:51
commandolinedat houdt in dat je ze niet meer kan aanpassen nadat je ze hebt aangemaakt18:51
commandolinedat heeft een aantal voordelen:18:51
commandoline- je weet zeker dat je list niet wordt aangepast, als je dat niet wilt18:52
commandoline- het is een beetje sneller18:52
commandoline(19:52:07) hannie: moet ik bij tuples denken aan 'paren'?18:52
commandolinehannie: dat is de letterlijke vertaling ja, maar denk maar gewoon aan python lists.18:52
commandolinedie snelheid is trouwens pas meetbaar als je een heleboel tuples hebt, maar als je toch je list niet hoeft aan te passen, kan je net zo goed een tuple gebruiken18:53
commandoline- je kunt tuples gebruiken als keys in dictionary18:53
commandolinewe hebben tot nu toe daarvoor vooral strings gebruikt18:54
commandolinebijv. een list kan nl. niet18:54
commandolineeen tuple dus wel18:54
commandolineeen list kan nl. veranderen, en dat is niet handig voor een dictionary key18:54
commandolineeen tuple kan dat niet, en daarom kan het wel18:55
commandolineok, nog even over hoe je een tuple aanmaakt:18:55
commandoline(19:55:13) hannie: commandoline, een list kan nl. niet?????18:55
commandolineklopt, een list kan je niet als dictionary key gebruiken.18:55
commandolinetuple = ("item1", "item2", "item3")18:55
commandolineje kan nu allerlei dingen doen die je ook met lists kan:18:56
commandolinetuple[0] #item118:56
commandoline"item1" in tuple #True18:56
commandolinewat niet kan:18:56
commandolinetuplle.append("waarde")18:56
commandoline*tuple18:56
commandolineok, probeer het even uit zoals hannie al zegt.18:57
commandolinevragen over tuples? Want dit is eigenlijk alles wat je ervan moet weten :)18:57
commandoline(19:58:50) hannie: ik krijg een AttributeError18:58
commandoline(19:59:25) hannie: ik deed: tuple.append('item4')18:59
commandolinedat klopt18:59
commandolinewant dat kan dus niet, een tuple heeft i.t.t. een list geen attributes18:59
commandoline(properties)18:59
commandoline(en methods)19:00
commandolineen daarom krijg je die error.19:00
commandoline(20:00:06) hannie: Hoe kan je dan een item toevoegen?19:00
commandolineniet, een tuple is niet meer te veranderen na het aanmaken19:00
commandolineen dat is dus het verschil met een lijst19:00
commandolinezie voor de voordelen een stukje naar boven19:00
commandolineok, duidelijk?19:00
FOADJa19:01
commandoline(20:01:44) hannie: maar wat is dan het voordeel t.o.v. een lijst?19:01
commandoline(20:02:08) hannie: alleen sneller?19:02
commandolinenee, ze zijn dus ook te gebruiken als keys in dictionaries19:02
commandolineterwijl dat met lists niet kan19:02
commandoline(20:02:56) hannie: kan je daar een voorbeeldje van geven?19:03
commandolinedict = {}19:03
commandolinedict[(1, 2)] = "test"19:03
commandolinedict[[1, 2]] = "test"19:03
commandolinehet eerste werkt, het tweede niet19:03
commandoline(20:03:35) hannie: en hoe krijg ik dan die tuple in dic{}?19:03
commandolinede eerste van de voorbeelden hierboven gebruikt een tuple als key19:04
commandolinede tweede een list19:04
commandoline(20:04:55) hannie: zie je dat aan de ronde haakjes ()?19:05
commandolineklopt, er is één uitzondering:19:05
commandolinetuple = (1,)19:05
commandolineals je één item hebt, moet die komma erbij19:05
commandolineanders werkt het als voorrangshaakje (net zoals bij wiskunde)19:05
commandolineook, het volgende onderwerp wat ik behandelen is 'variable length argument lists'19:06
commandolinebeter bekend als '*args, **kwargs'19:06
commandolinehttp://paste.ubuntu.com/597960/19:08
commandolineoh, ik ben nog wat vergeten...19:08
commandolinehttp://paste.ubuntu.com/597962/19:09
commandolinehet * voor args geeft aan dat er op die plaats 0, 1 of meer argumenten kunnen worden gegeven19:09
commandolineen die argumenten komen dan in de tuple args terecht19:10
commandoline(20:10:02) FOAD: Moet het "*args" heten?19:10
commandolinenee, maar dat is wel aanbevolen, omdat iedere python programmeur direct zal weten wat je bedoelt als je *args gebruikt19:10
commandolineoverigens, het is ook nog mogelijk om sum() zo aan te roepen:19:10
commandolinesum(*[1, 2, 4, 934])19:11
commandolinedat doet dus precies het omgekeerde19:11
commandolinealle items in een list worden ingevoerd als argumenten19:11
commandolineok, door naar **kwargs19:11
commandoline(20:11:47) hannie: en mag dat ook tekst zijn?19:11
commandolineje kan op zich een string als argument meegeven, maar dat heeft als nadeel dat python tekst niet op kan tellen19:12
commandolineen dan krijg je één of andere exception19:12
commandolineoja, de functie sum() zit standaard in python, die hoef je zelf niet te schrijven19:13
commandoline(20:13:40) hannie: maar je telt gewoon een reeks cijfers bij elkaar op dus19:13
commandolineklopt19:13
commandolineok, voordat ik **kwargs uit kan leggen moeten jullie weten dat je in python argumenten bij hun naam kan noemen, bijv:19:14
commandolinedef doeIets(a, b=8, c=2):19:14
commandoline    #doe iets met a, b en c19:14
commandolinestel nu dat je argument a en c wil meegeven, maar dat je b wilt laten staan, je kan dan dit doen:19:15
commandolinedoeIets(5, c=4)19:15
commandolinewat ook kan:19:15
commandolinedoeIets(a=3, b=4, c=2)19:15
commandolinehet mag dus altijd, de argumenten bij naam noemen19:15
commandolinebegrijpen jullie wat ik daar doe?19:16
commandoline(20:16:04) hannie: neemt 5 dan de plaats in van variabele a?19:16
commandolinea wordt 519:16
commandoline(20:16:10) FOAD: En dan maakt de volgorde niet uit?19:16
commandolineik geloof het niet, hoewel ik dat eigenlijk niet zeker weet...19:16
commandolinedat zou je kunnen uitproberen :)19:16
commandoline(20:17:26) hannie: hoe kan c=2 dan c=4 worden? Dat deel begrijp ik niet19:17
commandolineargumenten kan je overschrijven19:17
commandolineiets concreter:19:17
commandolinedef maak_person(naam="jan"):19:18
commandoline    #maak een persoon aan19:18
commandolinedan kan je deze twee dingen doen:19:18
commandolineperson = maak_person()19:18
commandolineperson = maak_person("klaas")19:18
commandoline(20:18:07) hannie: maar dan kan je toch gewoon 'c' declareren i.p.v. c-2?19:18
commandolinedat kan, maar dan is de standaard keuze dus niet beschikbaar19:19
commandolinegoed, er bestaat in python een functie dict()19:20
commandolineje kan er een dictionary mee maken, hoewel we dat niet hebben gedaan omdat het makkelijker is om {} te gebruiken19:20
commandoline(20:20:16) hannie: even herleidend: ju kunt het argument dus meteen al een waarde meegeven19:20
commandoline(20:20:31) hannie: en die kan je later weer vervangen. Heb ik dat zo goed begrepen?19:20
commandolineja19:20
commandoline(20:20:52) FOAD: Je geeft een soort van default waardes mee.19:20
commandolinedat is hoe ze heten, default values :)19:21
commandolineok, de functie dict() kan je bijv. zo aanroepen:19:21
commandolinewoordenboek = dict(voorbeeld="example", test="try")19:22
commandolinedaarna is woordenboek gelijk aan:19:22
commandoline{"voorbeeld": "example", "test": "try"}19:22
commandolinehet punt is, we geven hier geen argumenten op die dict standaard al kent19:23
commandolineals je zelf een dergelijk effect wilt bereiken, kan je **kwargs gebruiken19:23
commandoline(20:23:41) hannie: Ik zie nog niet helemaal het voordeel van een defaultwaarde instellen, maar dat komt nog wel19:24
commandolinehet is vaak nuttig als je een argumenten hebt, waarvan de standaardinstelling in 90% van de gevallen voldoet. Dan hoeft de aanroeper niet 90% van de keren datzelfde argument mee te geven19:24
commandolineeen voorbeeldje:19:25
commandolinehttp://paste.ubuntu.com/597964/19:25
commandolineho, een sterretje te weinig...19:26
commandolinehttp://paste.ubuntu.com/597965/19:27
commandolineok, de standaard dict functie zit ingewikkelder in elkaar19:28
commandolinemaar ik hoop dat het idee duidelijk is, dat je alle 'keyword arguments' kunt opvragen in een dictionary19:28
commandoline(20:28:34) hannie: leg je die sterretjes nog even uit?19:28
commandolineéén sterretje (bij conventie gevolgd door 'args') geeft aan dat je alle normale argumenten wilt hebben in de tuple 'args'19:29
commandolinetwee sterretjes (bij conventie gevolgd door 'kwargs') geven aan dat je alle 'keyword' argumenten wilt hebben in een dictionary genaamd 'kwargs'19:29
commandolineen keywordargumenten zijn dus alle argumenten waarbij je een naam noemt bij het aanroepen19:30
commandolinein het bovenstaande voorbeeld dus a=419:30
commandolinemaar ook c=419:30
commandolinezodra we a niet noemden19:30
commandolinedoeIets(3, c=4) was het ofzo19:30
commandolinedan is 3 een 'normaal' argument (dat je zou krijgen met *args), en is c=4 een keyword argument, dat je zou krijgen via **kwargs.19:31
commandolineok, vragen?19:31
commandolinehet is vooral belangrijk om dit passief te snappen want het komt best veel voor in code. Actief snappen is handig, maar niet noodzakelijk en komt dan vanzelf wel19:32
commandolineGoed, dan nog even het huiswerk19:34
commandolinehet is als je python schrijft handig om één stijl qua code aan te houden19:34
commandolineeen voorbeeld is dat sommige mensen functie( argument1 , argument2 ) schrijven19:35
commandolineen anderen: functie(argument1, argument2)19:35
commandolinebeide werkt, maar er zijn richtlijnen die vaststellen wat je het beste kan doen.19:35
commandolinede belangrijkste voor python is PEP8, de python style guide19:36
commandolinehttp://www.python.org/dev/peps/pep-0008/19:36
commandolineik zou jullie aanraden om eens te kijken waar je wat ongeveer kan vinden daar.19:36
commandoline(even de kopjes scannen)19:36
commandoline(20:35:39) FOAD: Het eerste is mooier.19:36
commandoline(20:35:43) FOAD: Is dat het antwoord?19:36
commandoline(20:36:18) hannie: dat 2e druist in tegen onze schrijfwijze19:36
commandolinevolgens PEP8 is het tweede mooier19:37
commandolineen het is ook wat ik doe :)19:37
commandolineen dat is tegelijk ook het huiswerk voor deze keer, kijk even hoe PEP 8 in elkaar zit19:37
commandolinezodat je er iets in op zou kunnen zoeken19:37
commandolineok, tot volgende week, dat is waarschijnlijk de laatste, of anders op één na laatste, les!19:38

Generated by irclog2html.py 2.7 by Marius Gedminas - find it at mg.pov.lt!