[17:47] het staat hier nu op +m commandoline en StefandeVries [17:47] ik ga zo eten, maar op de tijd terug te zijn hier [17:47] dank je, leoquant [17:47] tot later [17:48] alvast weer bedankt, en succes [18:30] Welkom bij de zesde les Python allemaal [18:30] we gaan vandaag verder met functies [18:31] maar voordat we dat doen wil ik even het huiswerk bespreken [18:31] ten eerste de opdracht om een eigen alternatief voor de len()-functie te schrijven. [18:31] genaamd num() [18:32] http://paste.ubuntu.com/579208/ [18:32] goed, even lijn voor lijn wat er gebeurd. [18:33] we 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] daarna volgt de code om de eigenlijke lengte te berekenen: [18:34] de code loopt met behulp van de for-loop door alle items, en hoogt voor ieder item de teller 'aantal' op met 1. [18:34] hannie> Het werkt bij mij ook zonder argument [18:34] ten slotte wordt aantal teruggegeven aan de aanroeper [18:35] terwijl StefandeVries hannie's vraag beantwoord, leg ik nog even de laatste paar regels uit [18:35] daar wordt de functie nl. gebruikt. [18:36] hannie: het kan zijn dat dat toevallig goed ging, maar voor een goede programmeerstijl vooral erin houden [18:36] was het antwoord. [18:37] om de functie te testen maken we twee dingen (objecten) aan: een list en een dictionary [18:37] over beide wordt zowel de functie num() als len() aangeroepen, en beide geven hetzelfde resultaat terug. [18:38] overigens: de functie len() is intern anders geimplementeerd, en kan meer. Gebruik dus nooit een eigen implementatie in de praktijk, nergens voor nodig ;) [18:38] goed, begrijpt iedereen wat er hier gebeurd? [18:39] geen vragen? Dan gaan we verder naar de tweede opdracht [18:39] http://paste.ubuntu.com/579219/ [18:40] wat we hier zien is het bekende rekenmachineprogramma, maar weer in een andere vorm. [18:40] als je wat anders hebt hier is het niet vreemd, want het kan op verschillende manieren [18:41] maar wat wij kortweg gedaan hebben: [18:41] maar wat wij kortweg gedaan hebben: [18:41] :( [18:41] - een functie maken voor het menu, zoals we die dacht ik vorige les al hadden gezien. [18:42] - ieder menuitem in een functie gezet, om de code wat duidelijker te houden. [18:42] wat nog had gekunt was het vragen van getallen in een functie zetten, of het verplaatsen naar voor het if-statement [18:42] (if keuze == 1; if keuze == 2 etc.) [18:43] maar zoals ik al zei, er zijn hier meerdere mogelijkheden [18:43] ok, nog vragen? [18:43] goed, dan gaan we verder [18:44] jullie weten nu hoe je zelf functies kan schrijven, en hoe je ze aanroept. [18:44] Waarom geen switch-case? [18:45] Die bestaat niet in Python [18:45] er is overigens wel een mogelijkheid: [18:45] een dictionary maken met functies daarin [18:45] maar dat is hier denk ik alleen maar onduidelijker [18:46] CasW> Waarom geen switch-case? [18:46] het 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 moeite [18:46] leoquant, die vraag is net beantwoord ;) [18:46] ! [18:47] en vandaag wilde ik jullie dus een aantal van die functies laten zien [18:47] allemaal gaat niet lukken, want het zijn er honderden [18:47] maar ik zal er een aantal laten zien die ik en StefandeVries vaak gebruiken [18:47] open allemaal een terminal met daarin python [18:48] dit is makkelijker om uit te proberen in de interactieve sessie dan in een opgeslagen programma. [18:48] dus: [18:48] Toepassingen > Hulpmiddelen > Terminalvenster [18:48] 'python' intikken en op enter drukken [18:49] goed, omdat python zoveel functies ingebouwd heeft, zijn ze geordend in zogenaamde 'modules'. [18:49] standaard zijn modules niet geladen, dat moeten we doen op het moment dat we ze willen gebruiken. [18:49] De eerste module die ik jullie wil laten zien, is de os module [18:50] die kun je laden door 'import os' in te tikken. [18:50] overigens staat de uitgebreide (Engelstalige) documentatie van alle modules hier: http://docs.python.org/library/ [18:50] en van de os-module specifiek: http://docs.python.org/library/os.html [18:51] goed, de eerste functie die ik wil bespreken is os.listdir() [18:52] die heeft één argument, zoals ook hier te lezen valt: http://docs.python.org/library/os.html#os.listdir [18:52] nl. een locatie [18:52] de functie geeft na aanroepen een lijst terug met alle bestanden en mappen in 'locatie' [18:52] type in: [18:52] os.listdir(".") [18:53] . is de huidige map, dat is in de meeste gevallen jullie home-map. [18:53] je ziet trouwens ook alle verborgen bestanden, dus het kan nogal een lange lijst teruggeven. [18:54] je kan ook een andere locatie ("path") proberen [18:54] bijv.: [18:54] os.listdir("/home") [18:54] ok, volgende functie: [18:54] os.remove() [18:55] daarmee moet je oppassen [18:55] het verwijdert nl. een bestand, en dat zonder te vragen of je het zeker weet o.i.d. [18:56] je kan 'm uitproberen door een lege map aan te maken met daarin een leeg bestand [18:56] moet je bij elke terminalsessie opnieuw importeren? [18:56] Ja [18:56] en dan dat bestand verwijderen [18:56] het argument werkt net zoals bij os.listdir [18:56] maar doe dat alleen als je bovenstaande instructies begrijpt. [18:57] overigens kan je os.remove niet gebruiken om mappen weg te gooien [18:57] alleen bestanden, en dan één voor één. [18:57] voor mappen kun je os.rmdir gebruiken [18:58] maar die werkt alleen als de map die je probeert te verwijderen compleet leeg is [18:58] dan is er nog één functie uit os die ik jullie wil laten zien: os.walk() [18:59] Vraag: Dus je gebruikt os.remove in combinatie met os.rmdir om een map met bestanden weg te gooien >? [19:00] dat kan, zeker als je 'm combineert met os.walk die we nu bespreken zoals je straks misschien zult zien. [19:00] maar makkelijker is om de shutil module te gebruiken. [19:00] die heeft functies als rmtree() [19:00] dat alles in een map verwijdert, dat zijn dus de echt gevaarlijke functies als je niet precies weet waar je mee bezig bent [19:01] * commandoline heeft er een keer m'n halve home map mee leeggegooid. [19:01] *z'n, als ik /me gebruik :P [19:01] ok, os.walk: [19:01] http://docs.python.org/library/os.html#os.walk [19:02] die functie wordt meestal gebruikt i.c.m. de for-loop [19:02] ik zal een voorbeeldje ervan geven, maar het verder niet uitleggen. [19:02] als het nu niet duidelijk is, komt dat vanzelf. [19:03] http://paste.ubuntu.com/579427/ [19:04] je kan het overtypen in de terminal, maar als jullie syntax errors krijgen zet het dan gewoon even in een bestand [19:04] En niet met "marten" zeker. [19:04] even aanpassen idd [19:04] Tenzij je Marten heet [19:05] idd :P [19:05] goed, tenzij iemand nog vragen heeft over os wil ik door met os.path [19:06] Ik zie geen vragen =) [19:06] os.path is een zogenaamde submodule van os [19:07] en dat heeft als voordeel dat je 'm niet hoeft te importeren als je os al hebt geimporteerd [19:07] ik krijg geen output [19:07] hannie: staat er iets op je bureaublad, en heb je je gebruikersnaam aangepast? [19:08] als de map niet bestaat zou hij een foutmelding geven, en hij geeft altijd wat output. [19:08] het werkt hier gewoon, dus hier komen we later even op terug hannie [19:08] importeren [19:09] na enter zie ik >>> [19:09] bedoel ik [19:09] lijkt me toch dat het bureaublad leeg is, maar goed, zo verder. [19:10] je kan os.path wel importeren via 'import os.path' overigens [19:10] als je dat doet is os.listdir niet beschikbaar [19:10] maar goed, jullie hebben os geimporteerd, dus automatisch ook os.path [19:10] dus, door naar de eerste functie [19:11] (nadat jullie de documentatie hebben gekregen van os.path: http://docs.python.org/library/os.path.html) [19:11] de eerste functie uit os.path die ik wil behandelen is os.path [19:12] stel je voor dat je weet dat je op linux werkt, en dat er een /home map bestaat. [19:12] en de gebruikersnaam niet weet [19:12] dan kun je die vragen aan de gebruiker [19:12] je zou dan iets kunnen doen als: [19:12] locatie = "/home/" + raw_input("Geef de gebruikersnaam: ") [19:13] het probleem aan deze code is dat zodra de / achter home weg gaat, de code crasht [19:13] voor dat soort problemen hebben de python ontwikkelaars de functie os.path.join() geschreven [19:14] die werkt op ieder platform waarop python draait [19:14] dus op linux, mac os x, windows, bsd, etc. etc. [19:14] de code uit mijn voorbeeld wordt er als volgt mee herschreven: [19:14] locatie = os.path.join("/home", raw_input("Geef de gebruikersnaam: ")) [19:15] als je de gebruikersnaam niet weet kan je hem ook niet intypen [19:15] Je == de programmeur, voor als je een programma voor iemand anders schrijft [19:15] ok, iedereen begrijpt de werking van os.path.join() ? [19:15] de volgende is os.path.splitext() [19:16] die kan je bijv. gebruiken als je een programma hebt dat bestanden maakt met de extensie .jdkf [19:16] om een voorbeeld te noemen :P [19:16] je wil dan contoleren of het bestand wat de gebruiker selecteert, eindigt op 'jdkf' [19:17] dat kan op verschillende manieren, maar één daarvan is om de extensie op te vragen met os.path.splitext() [19:17] het voorbeeld zou je bijv. kunnen vertalen naar de volgende code: [19:17] if os.path.splitext("/locatie/die/eindigt/op.jdkf")[1] == "jdkf": [19:18] #alles goed [19:18] hiermee worden dus de naam en de extensie gescheiden [19:18] inderdaad, er wordt een 'tuple' (een soort list) teruggegeven. [19:18] met twee items: [19:18] alles wat voor de extensie staat [19:18] en de extensie [19:18] met [1] krijg ik dus de extensie [19:18] met [0] krijg ik alles wat daarvoor staat. [19:19] ok, dat was alles wat ik wilde laten zien van os.path [19:19] iemand nog vragen tot zover? [19:19] nee, dan pakken we de volgende module erbij: [19:19] math [19:19] dus, doe allemaal: [19:19] import math [19:20] math bevat wiskundige functies, zoals sqrt (square root = vierkantswortel) [19:20] je kan er dus de wortel mee uit een getal trekken. [19:20] math.sqrt(2) geeft bijv. [19:21] 1.4142135623730951 [19:21] en zo zitten er nog veel meer functies in. [19:21] kijk gewoon de documentatie eens door als je ze nodig hebt: [19:21] http://docs.python.org/library/math.html [19:22] ok, ik heb nog twee modules, en omdat het idee zolangzamerhand wel duidelijk is, wil ik daar wat sneller doorheen [19:22] we willen niet over de tijd heengaan... [19:22] de eerste is subprocess [19:22] import subprocess [19:22] dus [19:23] subprocess maakt het mogelijk om andere applicaties te starten [19:23] probeer bijv. eens: [19:23] subprocess.call(["firefox"]) [19:23] of: subprocess.call(["python", "bestand_om_uit_te_voeren.py"]) [19:24] Waarom die haakjes? [19:24] FOAD: de ronde haakjes omdat het een functieaanroep is [19:24] FOAD: de vierkante omdat elk argument een element van een lijst is [19:25] en die functie vraagt nou eenmaal een lijst als invoer [19:25] Helder? [19:25] Mooi [19:26] ok, 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] dus mijn persoonlijke advies is om gewoon de subprocess module te gebruiken om commando's uit te voeren als dat al moet [19:26] want, door dit soort commando's uit te voeren, maak je je programma systeemafhankelijk [19:27] sommige van deze commando's zouden mogelijk bijv. niet werken op windows. [19:27] ok, dan de laatste module nog even snel: sys [19:27] doe: [19:27] import sys [19:27] en vervolgens: [19:27] sys.exit() [19:28] en python is afgesloten [19:28] je hebt ook de exit() functie hiervoor, maar die werkt in sommige gevallen niet [19:28] (bijv. bij jython, even googlen als je nieuwsgierig bent daarnaar.) [19:28] ook is het mogelijk om via sys argumenten mee te krijgen: [19:29] bijv. als je programma zo wordt aangeroepen: [19:29] waarom niet quit() [19:29] python programma.py argument1 argument2 [19:29] dan kan je argument1 en argument2 zien via de list 'sys.argv' [19:29] probeer het maar eens uit [19:29] hannie: bij sommige Pythons werkt dit niet. sys.exit() werkt altijd en is veiliger [19:29] en het is ook een keuze van de python ontwikkelaars geweest om het exit() te noemen :) [19:30] ok, nog even huiswerk: [19:30] schrijf een programma, dat de gebruiker om een map vraagt [19:30] en vervolgens alle python programma's in die map uitvoert. [19:31] leuk [19:31] en dan hoop ik jullie volgende week allemaal weer te zien [19:31] StefandeVries en ik zijn hier nog even voor vragen :) [19:31] En dat hoop ik uiteraard ook ;) [19:31] en ook door de week mag je altijd vragen stellen in #ubuntu-nl-mwanzo of via PM's aan ons. [19:32] * leoquant biedt virtuele bloemen aan de leiders [19:33] dit kanaal is weer open nu