#ubuntu-nl-mwanzo-klas 2011-03-05
<leoquant> commandoline, hier staat alles goed
<commandoline> ok, prima. StefandeVries klaar?
<leoquant> nog even wachten...
<StefandeVries> klaar
<commandoline> leoquant?
<leoquant> ok
<leoquant> ã
<commandoline> Goed, welkom allemaal bij de 5e les Python.
<commandoline> Ten eerste wil ik nu iedereen die de cursus volgt aanwezig is, even zeggen dat vanaf deze les StefandeVries officieel mede-workshop leider is.
<commandoline> tijdens de lessen doet hij de vragen, buiten de lessen zijn we beide bereikbaar daarvoor.
<leoquant> welkom StefandeVries !
<StefandeVries> dank jullie ;)
<commandoline> Goed, ik had 2 huiswerkopdrachten gegeven i.v.m. de 2x uitval, dus laten we die eerst maar eens bekijken.
<commandoline> de eerste opdracht is:
<commandoline> http://paste.ubuntu.com/563139/
<StefandeVries> bekijk dat voorbeeld, en kijk of het in grote lijnen hetzelfde werkt als jouw uitwerking. als je vragen hebt, kan je ze stellen
<commandoline> ohnee, deze klopt niet zie ik nu
<commandoline> ik heb het huiswerk van les 3 voor me :P
<commandoline> http://paste.ubuntu.com/566649/
<StefandeVries> Is op deze laatste opdracht nog een toelichting nodig, of lijkt hij duidelijk?
<commandoline> de bijbehorende opdracht was:
<commandoline> [19:28] <commandoline> wel heb ik nog een opdracht voor jullie bedacht
<commandoline> [19:28] <commandoline> probeer dit programma zo om te schrijven, dat het een woordenboek wordt.
<commandoline> [19:28] <commandoline> met als opties:
<commandoline> [19:28] <commandoline> - een woord met betekenis toevoegen
<commandoline> [19:29] <commandoline> - alle woorden & betekenissen tonen
<commandoline> [19:29] <commandoline> - een woord verwijderen
<commandoline> [19:29] <commandoline> - evt. een woord aanpassen
<commandoline> bekijk het programma rustig, en voer het eens uit
<commandoline> <hannie> Hoe kan je gegevens sorteren in een dictionary?
<StefandeVries> hannie: dit kan niet direct; daar zijn dictionaries niet voor bedoeld. er is een methode om de keys via een list te sorteren, en door die list te lopen. daar komen we na de les even op terug, als je dat zou willen
<leoquant> ok gesnapt
<StefandeVries> klopt, hannie
<commandoline> <hannie> Het woordenboek is eigenlijk exact hetzelfde als naam/e-mail (key/value)
<commandoline> goed, als er geen vragen meer zijn gaan we door naar opdr. 2
<commandoline> die staat hier: http://paste.ubuntu.com/575952/
<commandoline> de bijbehorende opdracht was:
<commandoline> [19:29] <commandoline> en voor degene die nog meer wil oefenen:
<commandoline> [19:30] <commandoline> - probeer een winkelinventarisprogramma te schrijven, dat bijhoud wat een winkel allemaal in voorraad heeft.
<commandoline> eigenlijk lijkt dit programma erg op het volgende
<commandoline> het enige wat je even door moet hebben, is wat de bedoelde key/value combinatie is
<commandoline> nl.:
<commandoline> key = naam v/h product
<commandoline> value = de hoeveelheid producten die de winkel op voorraad heeft.
<commandoline> nogmaals, draai dit programma eens, en kijk of je het begrijpt
<commandoline> hannie> We hebben toch al appels=10, peren=20 enz. gehad. Is dat wat je bedoelt?
<commandoline> eigenlijk is dat inderdaad precies hetzelfde voorbeeld
<commandoline> hier wordt het alleen toegepast in een programma, en die stap wilde ik jullie even laten maken.
<commandoline> ok, als er toch nog vragen zijn mag dat ook na de les, ik kan me voorstellen dat het wat tijd kost om dit goed door te nemen
<commandoline> vandaag gaan we namelijk met iets anders verder: functies.
<commandoline> Ten eerste: wat is een functie?
<commandoline> een functie kun je zien als een klein programma
<commandoline> dat programma krijgt invoer, doet daar iets mee, en geeft het resultaat terug
<commandoline> we hebben al een aantal functies gezien de afgelopen lessen, functies die standaard in python zitten.
<commandoline> nl:
<commandoline> len()
<commandoline> raw_input()
<commandoline> input()
<commandoline> str()
<commandoline> float() ook nog dacht ik?
<commandoline> ok, float ook :)
<commandoline> <Tjibba> hmm wat deed float ook alweer?
<StefandeVries> het maakte van een geheel getal een komma getal, Tjibba
<commandoline> <hannie> maar je kunt i.p.v. float ook een getal met ,00 opgeven bij input
<commandoline> i.p.v. een komma moet het een punt zijn
<StefandeVries> dat kan inderdaad ook, met een punt
<commandoline> maar het achterliggende idee klopt :)
<StefandeVries> commandoline was me voor
<commandoline> ok, len() vind ik wel een mooi voorbeeld
<commandoline> het krijgt invoer (bijv. een lijst), en geeft als resultaat de lengte van die lijst terug.
<commandoline> dat is iets wat we ook zelf zouden kunnen doen, bijv. zo:
<commandoline> lengte = 0
<commandoline> for item in lijst:
<commandoline>     lengte = lengte +1
<commandoline> (in het echt is de implementatie anders, maar even ter illustratie)
<commandoline> voordelen van de functie boven deze code is:
<commandoline> *zijn
<commandoline> - het is abstracter, je hoeft niet meer te bedenken dat bovenstaande code de lengte berekend.
<commandoline> - hergebruik: het is mogelijk om de functie meerdere keren aan te roepen, terwijl we dan de code elke keer zouden moeten kopiÃ«ren, en dat is lastig in het onderhoud.
<leoquant> <hannie> Bedoel je met de lengte van de lijst het AANTAL items?
<StefandeVries> Ja, hannie :)
<commandoline> <MedUsaXIII74> Kun je zelf ook functies maken ? En gaat dat dan richting object georienteerd programmeren ?
<StefandeVries> MedUsaXIII74: Ja, dat gaan we deze les uitleggen en inderdaad, we gaan later in de cursus door op OOP. maar maak je voor nu geen zorgen. ;)
<leoquant> ok
<commandoline> goed, ik zal jullie nog een paar termen vertellen, voordat we verdergaan met een voorbeeld:
<commandoline> het aanroepen (Eng: callen) van een functie = een functie gebruiken, bijv. len(list)
<commandoline> argumenten (Eng: parameters of arguments) = invoer van een functie, in het voorbeeld is dat 'list'.
<commandoline> maar bij bijv. de functie pow(x, y) (power, x tot de macht y), zijn dat x en y
<commandoline> ten slotte is het handig om de engelse term te kennen voor 'waarde teruggeven aan het de aanroeper (caller)': return
<commandoline> <DooitzedeJong> QUESTION: Over die tweede opdracht van vorige week, kan je python ook de values op laten slaan in een document?
<StefandeVries> DooitzedeJong: ja, dat kan. in een later stadium van de cursus gaan we dit ook doen.
<StefandeVries> maar voorlopig niet
<commandoline> goed, alles duidelijk tot zover?
<commandoline> /vragen?
<commandoline> goed, dan gaan we het adresboekprogramma (huiswerkopdracht 1) omschrijven om functies te gebruiken.
<commandoline> http://typewith.me/ep/pad/view/ro.LGhT4417wF8/latest
<commandoline> hoewel, dat is hier al gebeurd :P Nou ja, ook goed, dan gaan we dat uitleggen :)
<commandoline> goed, we gaan even kijken wat er allemaal gebeurd, en beginnen net als python zelf, bovenaan.
<commandoline> daar zien we dat de lijst (list) menu_opties wordt aangemaakt
<commandoline> dat hebben we eerder gedaan, niks bijzonders.
<commandoline> daaronder wordt het interessant:
<commandoline> we zien een nieuw statement, nl. 'def' .
<commandoline> def definieert een nieuwe functie
<commandoline> een eigen functie dus, waarvan we zelf duidelijk maken wat die doet.
<commandoline> deze functie heeft menu, en onder die naam kunnen we hem straks dus bereiken
<commandoline> tot slot geeft de eerste regel aan dat de functie menu een argument heeft, nl. 'opties'
<commandoline> <hannie> Wordt de functie door de programmeur gedefinieerd?
<StefandeVries> Ja, je kunt een functie zelf definiÃ«ren, echter functies zoals len() niet; dit belcihten we later bij object geÃ¶rienteerd programmeren
<commandoline> en dat is ook precies wat gebeurd op regel 11 van het document
<commandoline> de functie wordt hier dus gedefineerd, voor later gebruik.
<commandoline> de functie menu doet het volgende:
<commandoline> - het laat iedere optie zien in opties d.m.v. de for-loop
<commandoline> - het vraagt de gebruiker om een keuze te maken m.b.v. input()
<commandoline> - het geeft die keuze terug aan het hoofdprogramma (r. 18, return keuze)
<commandoline> met deze functie kunnen we later zo aanroepen:
<commandoline> keuze = menu(menu_opties)
<commandoline> je ziet hier de twee voordelen terug:
<commandoline> - we kunnen menu later nog een keer gebruiken, zelfs om een compleet ander menu te laten zien door i.p.v. menu_opties een andere lijst mee te geven.
<commandoline> - de programmeur hoeft niet alle bovenstaande stappen te bedenken
<commandoline> (abstractie), het enige waar de programmeur aan moet denken is om een lijst met menu opties door te geven aan menu(), en het resultaat op te slaan.
<commandoline> <hannie> Kan je de gedefinieerde functies opslaan en in andere programma's gebruiken?
<StefandeVries> Ja, hannie, je kunt functies maken opslaan. deze bestanden kun je dan in programma's importeren en de functies dan aanroepen. volgende les wordt dit behandeld(modules)
<commandoline> <bakeds> programma doet het nog niet klopt dit?
<commandoline> hannie: je kunt momenteel ook nog gewoon regel 11 tot en met 20 kopieren naar een ander programma.
<commandoline> bakeds: het werkt gewoon, zowel bij StefandeVries als bij mij.
<commandoline> wel is het zo dat het nog niks doet als je het tot waar we nu zijn overneemt, bedoel je dat?
<commandoline> vervolgens worden er nog een groot aantal functies gedefinieerd, ik loop ze wat sneller bij langs
<commandoline> def toon_mailadressen(adresboek):
<commandoline> deze functie toont alle mailadressen in 'adresboek' aan de gebruiker, we kunnen na deze declaratie dus zoiets doen:
<commandoline> toon_mailadressen(adresboek_van_commandoline)
<commandoline> deze functie geeft niks terug, het 'return'-statement staat nergens.
<commandoline> de volgende functie heeft dezelfde argumenten en geeft opnieuw niets terug.
<commandoline> def voeg_mailadres_toe(adresboek):
<commandoline> het verschil is wat de functie zelf doet, namelijk een entry toevoegen aan het adresboek
<commandoline> datzelfde geld voor verwijder_adresboek (r. 29)
<commandoline> eh, regel 37
<commandoline> goed, als je alles tot regel 41 in een bestand zet en dat uitvoerd, gebeurd er niks
<commandoline> dat is zo, omdat we alleen een aantal functies hebben gedefinieerd, we doen er verder niks mee.
<commandoline> ze worden niet aangeroepen, en daarom doen ze niks.
<commandoline> dat komt nu, we beginnen met de welkomsboodschap:
<commandoline> print "Welkom bij het adresboekprogramma"
<commandoline> gevolgd door het aanmaken van het adresboek, en het starten van de while loop om het programma meerdere keren te laten draaien, zoals we vaker hebben gedaan.
<commandoline> daarna roepen we onze eigen gedefinieerde functie aan:
<commandoline> keuze = menu(menu_opties)
<commandoline> keuze is nu gelijk aan wat de functie menu teruggeeft.
<commandoline> dan kijken we wat de gebruiker heeft gekozen met if/elif/else
<commandoline> iedere menuoptie heeft eerder een eigen functie gekregen, en die roepen we nu aan.
<commandoline> (bijv. toon_mailadressen(adresboek))
<commandoline> goed, dat is eigenlijk het hele programma.
<commandoline> heeft iemand nog vragen tot zover?
<commandoline> en is alles duidelijk?
<commandoline> <hannie> Maar ik zou het nog niet zelfstandig kunnen maken ):
<commandoline> dat is oefenen
<commandoline> en dat is dan ook het huiswerk voor de volgende keer:
<commandoline> mijn eerste opdracht is, schrijf je eigen len()-functie
<commandoline> ik stel voor dat we 'm num() noemen zoals hannie voorstelde :)
<commandoline> <MedUsaXIII74> Als je def voor een stukje code zet wordt het ook uitgevoerd, is dit te voorkomen ?
<StefandeVries> MedUsaXIII74: hoe bedoel je dat precies? de code die je als functie definieert wordt als het goed is niet uitgevoerd als het niet aangeroepen wordt
<commandoline> terwijl StefandeVries de vraag beantwoord, voor mensen die nog meer willen oefenen: herschrijf het rekenmachineprogramma om functies te gebruiken
<commandoline> vaak is de menuopties in een functie zetten overzichtelijk
<commandoline> goed, het is 20:30, tot volgende week allemaal! Wij gaan nog even door met vragen beantwoorden, en dat doen StefandeVries en ik doen dat ook graag door de week
<commandoline> (en anderen ook, dus gewoon vragen in #ubuntu-nl-mwanzo)
<StefandeVries> schaam je niet, ook wij zijn ergens en ooit begonnen :)
<StefandeVries> Graag gedaan, hannie
<commandoline> <MedUsaXIII74> Stel dat je bijvoorbeeld van het menu een def wilt maken MAAR nog niet wilt uitvoeren op dat punt. Dat bedoel ik.
<commandoline> MedUsaXIII74, code binnen functies wordt nooit uitgevoerd als ze gedefinieerd worden, dat gebeurd pas als ze aangeroepen worden
<StefandeVries> precies
<commandoline> en def maakt duidelijk dat we een functie definiÃ«ren. duidelijk?
<StefandeVries> ik begreep je niet helemaal, MedUsaXIII74, mijn excuses
<commandoline> <MedUsaXIII74> Zodat je die def later als menu kan gebruiken, maar je wilt hem al van te voren defineren ipv pas als je hem nodig hebt.
<commandoline> dat gebeurt dus altijd, het is zeg maar het idee achter een functie, je definieert 'm voordat je 'm nodig hebt.
<commandoline> <hannie> Ik wil nog iets vragen over regel 18:
<commandoline> <hannie> Waar gaat return keuze naartoe?
<commandoline> 'return' stuurt een waarde terug naar dat stuk code dat de functie aanroept
<commandoline> dat is in ons programma:
<commandoline> keuze = menu(menu_opties)
<commandoline> keuze is dus gelijk aan wat de menu-functie terugstuurt.
<commandoline> <MedUsaXIII74> en je defineert hem door bijv aan te geven: menu = menu(menu1) of menu = menu(menu2)
<commandoline> nee
<commandoline> de definitie is alles wat achter 'def' staat.
<commandoline> in het voorbeeldprogramma:
<commandoline> def menu(opties):
<commandoline> is de definitie
<commandoline>         keuze = menu(menu_opties)
<commandoline> is de aanroep
