/srv/irclogs.ubuntu.com/2011/03/12/#ubuntu-nl-mwanzo-klas.txt

leoquanthet staat hier nu op +m commandoline  en StefandeVries17:47
leoquantik ga zo eten, maar op de tijd terug te zijn hier17:47
StefandeVriesdank je, leoquant17:47
StefandeVriestot later17:47
leoquantalvast weer bedankt, en succes17:48
commandolineWelkom bij de zesde les Python allemaal18:30
commandolinewe gaan vandaag verder met functies18:30
commandolinemaar voordat we dat doen wil ik even het huiswerk bespreken18:31
commandolineten eerste de opdracht om een eigen alternatief voor de len()-functie te schrijven.18:31
commandolinegenaamd num()18:31
commandolinehttp://paste.ubuntu.com/579208/18:32
commandolinegoed, even lijn voor lijn wat er gebeurd.18:32
commandolinewe beginnen met het definiëren van de functie num(), zodat we die later kunnen gebruiken. De functie heeft één argument, items, wat de list/dictionary is waarvan we de lengte willen weten.18:33
commandolinedaarna volgt de code om de eigenlijke lengte te berekenen:18:33
commandolinede code loopt met behulp van de for-loop door alle items, en hoogt voor ieder item de teller 'aantal' op met 1.18:34
leoquanthannie> Het werkt bij mij ook zonder argument18:34
commandolineten slotte wordt aantal teruggegeven aan de aanroeper18:34
commandolineterwijl StefandeVries hannie's vraag beantwoord, leg ik nog even de laatste paar regels uit18:35
commandolinedaar wordt de functie nl. gebruikt.18:35
commandoline<StefandeVries> hannie: het kan zijn dat dat toevallig goed ging, maar voor een goede programmeerstijl vooral erin houden18:36
commandolinewas het antwoord.18:36
commandolineom de functie te testen maken we twee dingen (objecten) aan: een list en een dictionary18:37
commandolineover beide wordt zowel de functie num() als len() aangeroepen, en beide geven hetzelfde resultaat terug.18:37
commandolineoverigens: de functie len() is intern anders geimplementeerd, en kan meer. Gebruik dus nooit een eigen implementatie in de praktijk, nergens voor nodig ;)18:38
commandolinegoed, begrijpt iedereen wat er hier gebeurd?18:38
commandolinegeen vragen? Dan gaan we verder naar de tweede opdracht18:39
commandolinehttp://paste.ubuntu.com/579219/18:39
commandolinewat we hier zien is het bekende rekenmachineprogramma, maar weer in een andere vorm.18:40
commandolineals je wat anders hebt hier is het niet vreemd, want het kan op verschillende manieren18:40
commandolinemaar wat wij kortweg gedaan hebben:18:41
commandolinemaar wat wij kortweg gedaan hebben:18:41
commandoline:(18:41
commandoline- een functie maken voor het menu, zoals we die dacht ik vorige les al hadden gezien.18:41
commandoline- ieder menuitem in een functie gezet, om de code wat duidelijker te houden.18:42
commandolinewat nog had gekunt was het vragen van getallen in een functie zetten, of het verplaatsen naar voor het if-statement18:42
commandoline(if keuze == 1; if keuze == 2 etc.)18:42
commandolinemaar zoals ik al zei, er zijn hier meerdere mogelijkheden18:43
commandolineok, nog vragen?18:43
commandolinegoed, dan gaan we verder18:43
commandolinejullie weten nu hoe je zelf functies kan schrijven, en hoe je ze aanroept.18:44
commandoline<CasW> Waarom geen switch-case?18:44
StefandeVriesDie bestaat niet in Python18:45
commandolineer is overigens wel een mogelijkheid:18:45
commandolineeen dictionary maken met functies daarin18:45
commandolinemaar dat is hier denk ik alleen maar onduidelijker18:45
leoquantCasW> Waarom geen switch-case?18:46
commandolinehet mooie aan python is, dat de makers ervan al een heleboel functies hebben geschreven die wij kunnen gebruiken in onze programma's met maar weinig moeite18:46
commandolineleoquant, die vraag is net beantwoord ;)18:46
leoquant!18:46
commandolineen vandaag wilde ik jullie dus een aantal van die functies laten zien18:47
commandolineallemaal gaat niet lukken, want het zijn er honderden18:47
commandolinemaar ik zal er een aantal laten zien die ik en StefandeVries vaak gebruiken18:47
commandolineopen allemaal een terminal met daarin python18:47
commandolinedit is makkelijker om uit te proberen in de interactieve sessie dan in een opgeslagen programma.18:48
commandolinedus:18:48
commandolineToepassingen > Hulpmiddelen > Terminalvenster18:48
commandoline'python' intikken en op enter drukken18:48
commandolinegoed, omdat python zoveel functies ingebouwd heeft, zijn ze geordend in zogenaamde 'modules'.18:49
commandolinestandaard zijn modules niet geladen, dat moeten we doen op het moment dat we ze willen gebruiken.18:49
commandolineDe eerste module die ik jullie wil laten zien, is de os module18:49
commandolinedie kun je laden door 'import os' in te tikken.18:50
commandolineoverigens staat de uitgebreide (Engelstalige) documentatie van alle modules hier: http://docs.python.org/library/18:50
commandolineen van de os-module specifiek: http://docs.python.org/library/os.html18:50
commandolinegoed, de eerste functie die ik wil bespreken is os.listdir()18:51
commandolinedie heeft één argument, zoals ook hier te lezen valt: http://docs.python.org/library/os.html#os.listdir18:52
commandolinenl. een locatie18:52
commandolinede functie geeft na aanroepen een lijst terug met alle bestanden en mappen in 'locatie'18:52
commandolinetype in:18:52
commandolineos.listdir(".")18:52
commandoline. is de huidige map, dat is in de meeste gevallen jullie home-map.18:53
commandolineje ziet trouwens ook alle verborgen bestanden, dus het kan nogal een lange lijst teruggeven.18:53
commandolineje kan ook een andere locatie ("path") proberen18:54
commandolinebijv.:18:54
commandolineos.listdir("/home")18:54
commandolineok, volgende functie:18:54
commandolineos.remove()18:54
commandolinedaarmee moet je oppassen18:55
commandolinehet verwijdert nl. een bestand, en dat zonder te vragen of je het zeker weet o.i.d.18:55
commandolineje kan 'm uitproberen door een lege map aan te maken met daarin een leeg bestand18:56
commandoline<hannie> moet je bij elke terminalsessie opnieuw importeren?18:56
commandoline<CasW> Ja18:56
commandolineen dan dat bestand verwijderen18:56
commandolinehet argument werkt net zoals bij os.listdir18:56
commandolinemaar doe dat alleen als je bovenstaande instructies begrijpt.18:56
commandolineoverigens kan je os.remove niet gebruiken om mappen weg te gooien18:57
commandolinealleen bestanden, en dan één voor één.18:57
commandolinevoor mappen kun je os.rmdir gebruiken18:57
commandolinemaar die werkt alleen als de map die je probeert te verwijderen compleet leeg is18:58
commandolinedan is er nog één functie uit os die ik jullie wil laten zien: os.walk()18:58
commandoline<MedUsaXIII> Vraag: Dus je gebruikt os.remove in combinatie met os.rmdir om een map met bestanden weg te gooien >?18:59
commandolinedat kan, zeker als je 'm combineert met os.walk die we nu bespreken zoals je straks misschien zult zien.19:00
commandolinemaar makkelijker is om de shutil module te gebruiken.19:00
commandolinedie heeft functies als rmtree()19:00
commandolinedat alles in een map verwijdert, dat zijn dus de echt gevaarlijke functies als je niet precies weet waar je mee bezig bent19:00
* commandoline heeft er een keer m'n halve home map mee leeggegooid.19:01
commandoline*z'n, als ik /me gebruik :P19:01
commandolineok, os.walk:19:01
commandolinehttp://docs.python.org/library/os.html#os.walk19:01
commandolinedie functie wordt meestal gebruikt i.c.m. de for-loop19:02
commandolineik zal een voorbeeldje ervan geven, maar het verder niet uitleggen.19:02
commandolineals het nu niet duidelijk is, komt dat vanzelf.19:02
commandolinehttp://paste.ubuntu.com/579427/19:03
commandolineje kan het overtypen in de terminal, maar als jullie syntax errors krijgen zet het dan gewoon even in een bestand19:04
commandoline<FOAD> En niet met "marten" zeker.19:04
commandolineeven aanpassen idd19:04
StefandeVriesTenzij je Marten heet19:04
commandolineidd :P19:05
commandolinegoed, tenzij iemand nog vragen heeft over os wil ik door met os.path19:05
StefandeVriesIk zie geen vragen =)19:06
commandolineos.path is een zogenaamde submodule van os19:06
commandolineen dat heeft als voordeel dat je 'm niet hoeft te importeren als je os al hebt geimporteerd19:07
leoquant<hannie> ik krijg geen output19:07
StefandeVrieshannie: staat er iets op je bureaublad, en heb je je gebruikersnaam aangepast?19:07
commandolineals de map niet bestaat zou hij een foutmelding geven, en hij geeft altijd wat output.19:08
commandolinehet werkt hier gewoon, dus hier komen we later even op terug hannie19:08
commandolineimporteren19:08
commandoline<hannie> na enter zie ik >>>19:09
commandolinebedoel ik19:09
commandolinelijkt me toch dat het bureaublad leeg is, maar goed, zo verder.19:09
commandolineje kan os.path wel importeren via 'import os.path' overigens19:10
commandolineals je dat doet is os.listdir niet beschikbaar19:10
commandolinemaar goed, jullie hebben os geimporteerd, dus automatisch ook os.path19:10
commandolinedus, door naar de eerste functie19:10
commandoline(nadat jullie de documentatie hebben gekregen van os.path: http://docs.python.org/library/os.path.html)19:11
commandolinede eerste functie uit os.path die ik wil behandelen is os.path19:11
commandolinestel je voor dat je weet dat je op linux werkt, en dat er een /home map bestaat.19:12
commandolineen de gebruikersnaam niet weet19:12
commandolinedan kun je die vragen aan de gebruiker19:12
commandolineje zou dan iets kunnen doen als:19:12
commandolinelocatie = "/home/" + raw_input("Geef de gebruikersnaam: ")19:12
commandolinehet probleem aan deze code is dat zodra de / achter home weg gaat, de code crasht19:13
commandolinevoor dat soort problemen hebben de python ontwikkelaars de functie os.path.join() geschreven19:13
commandolinedie werkt op ieder platform waarop python draait19:14
commandolinedus op linux, mac os x, windows, bsd, etc. etc.19:14
commandolinede code uit mijn voorbeeld wordt er als volgt mee herschreven:19:14
commandolinelocatie = os.path.join("/home", raw_input("Geef de gebruikersnaam: "))19:14
commandoline<hannie> als je de gebruikersnaam niet weet kan je hem ook niet intypen19:15
commandoline<CasW> Je == de programmeur, voor als je een programma voor iemand anders schrijft19:15
commandolineok, iedereen begrijpt de werking van os.path.join() ?19:15
commandolinede volgende is os.path.splitext()19:15
commandolinedie kan je bijv. gebruiken als je een programma hebt dat bestanden maakt met de extensie .jdkf19:16
commandolineom een voorbeeld te noemen :P19:16
commandolineje wil dan contoleren of het bestand wat de gebruiker selecteert, eindigt op 'jdkf'19:16
commandolinedat kan op verschillende manieren, maar één daarvan is om de extensie op te vragen met os.path.splitext()19:17
commandolinehet voorbeeld zou je bijv. kunnen vertalen naar de volgende code:19:17
commandolineif os.path.splitext("/locatie/die/eindigt/op.jdkf")[1] == "jdkf":19:17
commandoline#alles goed19:18
commandoline<hannie> hiermee worden dus de naam en de extensie gescheiden19:18
commandolineinderdaad, er wordt een 'tuple' (een soort list) teruggegeven.19:18
commandolinemet twee items:19:18
commandolinealles wat voor de extensie staat19:18
commandolineen de extensie19:18
commandolinemet [1] krijg ik dus de extensie19:18
commandolinemet [0] krijg ik alles wat daarvoor staat.19:18
commandolineok, dat was alles wat ik wilde laten zien van os.path19:19
commandolineiemand nog vragen tot zover?19:19
commandolinenee, dan pakken we de volgende module erbij:19:19
commandolinemath19:19
commandolinedus, doe allemaal:19:19
commandolineimport math19:19
commandolinemath bevat wiskundige functies, zoals sqrt (square root = vierkantswortel)19:20
commandolineje kan er dus de wortel mee uit een getal trekken.19:20
commandolinemath.sqrt(2) geeft bijv.19:20
commandoline1.414213562373095119:21
commandolineen zo zitten er nog veel meer functies in.19:21
commandolinekijk gewoon de documentatie eens door als je ze nodig hebt:19:21
commandolinehttp://docs.python.org/library/math.html19:21
commandolineok, ik heb nog twee modules, en omdat het idee zolangzamerhand wel duidelijk is, wil ik daar wat sneller doorheen19:22
commandolinewe willen niet over de tijd heengaan...19:22
commandolinede eerste is subprocess19:22
commandolineimport subprocess19:22
commandolinedus19:22
commandolinesubprocess maakt het mogelijk om andere applicaties te starten19:23
commandolineprobeer bijv. eens:19:23
commandolinesubprocess.call(["firefox"])19:23
commandolineof: subprocess.call(["python", "bestand_om_uit_te_voeren.py"])19:23
commandoline<FOAD> Waarom die haakjes?19:24
StefandeVriesFOAD: de ronde haakjes omdat het een functieaanroep is19:24
StefandeVriesFOAD: de vierkante omdat elk argument een element van een lijst is19:24
commandolineen die functie vraagt nou eenmaal een lijst als invoer19:25
StefandeVriesHelder?19:25
StefandeVriesMooi19:25
commandolineok, het is mogelijk om i.p.v. subprocess.call os.system te gebruiken. De python handleiding zegt niet dat die laatste veroudert is, maar dat wordt door sommige mensen wel zo gezien.19:26
commandolinedus mijn persoonlijke advies is om gewoon de subprocess module te gebruiken om commando's uit te voeren als dat al moet19:26
commandolinewant, door dit soort commando's uit te voeren, maak je je programma systeemafhankelijk19:26
commandolinesommige van deze commando's zouden mogelijk bijv. niet werken op windows.19:27
commandolineok, dan de laatste module nog even snel: sys19:27
commandolinedoe:19:27
commandolineimport sys19:27
commandolineen vervolgens:19:27
commandolinesys.exit()19:27
commandolineen python is afgesloten19:28
commandolineje hebt ook de exit() functie hiervoor, maar die werkt in sommige gevallen niet19:28
commandoline(bijv. bij jython, even googlen als je nieuwsgierig bent daarnaar.)19:28
commandolineook is het mogelijk om via sys argumenten mee te krijgen:19:28
commandolinebijv. als je programma zo wordt aangeroepen:19:29
leoquant<hannie> waarom niet quit()19:29
commandolinepython programma.py argument1 argument219:29
commandolinedan kan je argument1 en argument2 zien via de list 'sys.argv'19:29
commandolineprobeer het maar eens uit19:29
StefandeVrieshannie: bij sommige Pythons werkt dit niet. sys.exit() werkt altijd en is veiliger19:29
commandolineen het is ook een keuze van de python ontwikkelaars geweest om het exit() te noemen :)19:29
commandolineok, nog even huiswerk:19:30
commandolineschrijf een programma, dat de gebruiker om een map vraagt19:30
commandolineen vervolgens alle python programma's in die map uitvoert.19:30
leoquantleuk19:31
commandolineen dan hoop ik jullie volgende week allemaal weer te zien19:31
commandolineStefandeVries en ik zijn hier nog even voor vragen :)19:31
StefandeVriesEn dat hoop ik uiteraard ook ;)19:31
commandolineen ook door de week mag je altijd vragen stellen in #ubuntu-nl-mwanzo of via PM's aan ons.19:31
* leoquant biedt virtuele bloemen aan de leiders19:32
leoquantdit kanaal is weer open nu19:33

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