[16:03] het kanaal is vanaf nu +m [16:17] commandoline, gelukt? [16:17] leoquant: ja [16:17] mooi [16:19] tot straks [18:30] Welkom allemaal bij alweer de derde les uit deze basiscursus Python! [18:30] Laten we beginnen met het huiswerk wat ik de vorige keer had opgegeven even bespreken [18:30] er zijn meerdere oplossingen mogelijk. [18:31] voor iedereen die het programma van de vorige keer niet direct bij de hand heeft/er vorige keer niet was: http://paste.ubuntu.com/563040/ [18:32] de eerste mogelijkheid is om de code die nodig is bij het invoeren weg te knippen, en op de plekken waar die nodig is te plakken [18:32] je krijgt dan dit: [18:32] http://paste.ubuntu.com/563139/ [18:32] FOAD> Is dat niet strijdig met de Python filosofie? [18:33] het klopt dat er iets bestaat als 'there is only one way to do it' [18:33] maar dat geld alleen voor dingen in de taal zelf, en ook daarvan wordt wel eens afgeweken [18:34] goed, deze oplossing doet wat we willen, maar heeft als nadeel dat er stukjes code meerdere keren in het programma staan, identieke stukjes [18:34] als je nu bijv. een fout ontdekt in zo'n stukje code, dan zul je die overal moeten verbeteren. [18:34] daarom heb ik nog een tweede mogelijkheid bedacht. [18:34] http://paste.ubuntu.com/563140/ [18:35] dit programma lijkt eigenlijk een stuk meer op het origineel [18:35] er is maar één regel verandert, er wordt nu alleen om invoer gevraagd als 'keuze' kleiner is dan 4 door middel van een if-statement. [18:35] begrijpt iedereen wat ik gedaan heb bij de tweede oplossing? [18:36] mooi, dan gaan we verder [18:36] Ja, maar als je foutieve input geeft bvb -2 vraagt je programma toch nog steeds naar 2 getallen. of heb ik het mis? [18:36] dat klopt [18:37] ik heb het hier gedaan omdat het sowieso fout gaat bij foutieve invoer. [18:37] kun je ook een range op geven waar de input in moet zitten ? [18:37] en omdat ik even wilde laten zien dat er meerdere oplossingen zijn, waarvan de makkelijkste niet altijd de beste is. [18:38] MedUsaXIII: je kan zoiets doen: [18:38] if keuze > 0 and keuze < 5: [18:38] en dan heeft bovenstaande methode geen nadeel meer, zolang deze volgorde van menuitems gebruikt wordt. [18:39] 'and' kijkt of twee condities waar zijn. [18:39] en alleen dan is de gehele conditie waar [18:39] dat betekend hier: [18:39] keuze > 0 is waar & keuze < 5 is waar [18:40] en dan is dus automatisch het geheel ook waar. [18:40] ok, dan kunnen we verder met de stof voor deze les lijkt me. [18:40] we gaan eerst weer even werken in de terminal, zoals in de eerste les. [18:40] Toepassingen > Hulpmiddelen > Terminalvenster [18:41] (of pak het handige terminalvenster van lernid erbij :) ) [18:41] we geven net als twee weken geleden het commando 'python' in [18:42] ok, waar ik het deze week over wil hebben zijn 'lists', of in het Nederlands lijsten. [18:42] tot nu toe hebben we altijd gehad dat een variabele maar één waarde had [18:42] a = 1 [18:42] bijv. [18:42] maar stel je voor dat je bijv. een programma schrijft voor een winkel [18:43] en dat je alle dingen wil bijhouden die de winkel in huis heeft. [18:43] dat gaat niet met wat we tot nu toe behandelt hebben. [18:43] en daarvoor zijn lists dus ontworpen. [18:43] een voorbeeldje: [18:44] winkel_inventaris = ["appels", "peren", "bananen"] [18:45] we hebben nu een variabele 'winkel_inventaris', met daarin meerdere stukjes tekst (die stukjes tekst heten overigens strings, daar komen we later nog uitgebreider op terug) [18:45] we kunnen er verschillende dingen mee doen, bijv. ze stuk voor stuk weergeven. [18:46] bijv: [18:46] http://paste.ubuntu.com/563156/ [18:47] je ziet hier op de eerste regel iets wat we nog nooit eerder hebben gebruikt: [18:47] een for-statement [18:47] het for-statement is net zoals het while-statement dat we in het rekenmachineprogramma gebruikten een 'loop' [18:48] alles wat eronder staat (en ingesprongen is) wordt 0, 1 of meerdere keren uitgevoerd. [18:48] bij de while-loop hangt het aantal keer van uitvoeren af van of de voorwaarde (conditie) die er achter staat 'waar' oplevert [18:49] bij de for loop gaat dat anders [18:49] voor ieder item in de de eerder aangemaakte lijst ('winkel_inventaris') [18:49] wordt de variabele stuk_fruit gemaakt [18:49] en wordt de code die onder de for-loop staat uitgevoerd [18:50] tot zover even, probeer het scriptje even uit te voeren [18:50] vragen? [18:50] IndentationError: [18:51] hannie: er moet nog een tab tussen '...' en 'print' [18:51] de uitvoer is als het goed is: [18:51] appels [18:51] peren [18:51] bananen [18:51] onder elkaar [18:52] de for loop heeft voor ieder item in de winkel_inventaris het print-commando aangeroepen [18:52] Emiel1976> ik krijg daarna weer puntjes. is het dan goed? [18:52] druk nog een keer op enter, en de loop gaat van start [18:53] goed, zo'n lijst zoals we die nu hebben gemaakt is wel leuk, maar we hebben er nog weinig aan. [18:53] dat verandert zodra je er bijv. dingen aan kan toevoegen. [18:53] dat gaat zo: [18:53] winkel_inventaris.append("kiwi") [18:54] vervolgens kun je d.m.v. [18:54] print winkel_inventaris [18:54] zien dat de kiwi aan onze lijst is toegevoegd [18:54] lukt dat? [18:55] 'append' voegt iets toe aan het einde van de lijst [18:55] AttributeError: 'str' object has no attribute 'append' [18:55] oh, ik zie dat het al opgelost is. [18:56] wat er gebeurde was waarschijnlijk dat je niet toevoegde aan de list, maar aan iets anders [18:56] ok, stel nu dat de appels uitverkocht zijn [18:56] dan moeten ze natuurlijk van de lijst worden gehaald [18:56] dat betekend wel dat we moeten weten hoeveelste 'appels' in de lijst is. [18:57] je moet daarvoor weten dat python aan ieder item een nummer geeft [18:57] in ons voorbeeld heeft 'appels' het nummer (de zogenaamde index) 0, en heeft 'kiwi' het nummer 3 [18:57] er wordt dus begonnen met 0, en daarna naar boven doorgeteld. [18:58] om de appels uit de lijst te gooien, doen we het volgende: [18:58] del winkel_inventaris["appels"] [18:58] ho, fout :P [18:58] del winkel_inventaris[0] [18:59] Cugel> Waarom niet winkel_inventaris.remove() etc. ? [18:59] het verschil is dat 'del' niet alleen bedoelt is voor lijsten, en append wel. (later wil ik het verschil wat preciezer uitleggen) [19:00] je kan bijv. ook dit doen [19:00] a = 1 [19:00] del a [19:00] als je daarna [19:00] print a [19:00] doet, dan merk je dat 'a' niet meer bestaat. [19:00] Je maakt de variabele dus weer leeg [19:00] precies [19:01] nu vierkante haakjes en bij append ronde haakjes? [19:01] de vierkante haakjes worden gebruikt om aan te geven dat we een bepaald item in de lijst willen krijgen [19:01] je kan bijv. ook het volgende doen: [19:01] print winkel_inventaris[0] [19:02] daarom zijn ze dus anders dan de ronde haakjes die we tot nu toe hebben gebruikt: [19:02] ze zijn ergens anders voor bedoeld. [19:02] duidelijk tot zover? [19:03] ah, toch nog een vraag, mooi :) [19:03] ik krijg bij print winkel_inventaris[0] nu peren. dit is omdat de appels er uit zijn? [19:03] dat klopt helemaal, de 'indexes' schuiven door zodra een item uit de lijst wordt verwijdert. [19:04] ok, tot zover het winkelvoorbeeld [19:04] ik wilde graag nog een ander programma maken namelijk, een programma dat opnieuw op lists is gebaseerd. [19:05] ik heb daarvoor dit online document gemaakt, zodat jullie allemaal mee kunnen kijken: [19:05] http://typewith.me/ep/pad/view/ro.Op$gICXuBpU/latest [19:06] ja [19:06] ik zie getyp [19:06] mooi [19:06] ok, ik wilde een programma maken dat je verschillende cijfers laat invoeren [19:07] en dat dan vervolgens het gemiddelde berekent [19:07] om te beginnen moeten we dus cijfers verzamelen. [19:07] een list is daar ideaal voor. [19:08] wat je nu ziet is een lege lijst, zonder items van tevoren erin. [19:08] die gaan we nu dus toevoegen [19:08] om dat te doen gaan we gebruik maken van de while loop [19:09] we willen namelijk net zo lang cijfers toevoegen totdat de gebruiker vindt dat het genoeg is. [19:09] ik gebruik hier raw_input, en niet input() [19:10] omdat het ook mogelijk moet zijn om de letter 'q' in te voeren. [19:10] het probleem is dat de raw_input-functie een 'string' teruggeeft, een stukje tekst [19:10] en daar kunnen we straks niet mee rekenen [19:10] we moeten het daarom omzetten naar een getal. We kunnen er een geheel getal van maken met 'int()' [19:10] dus bijv. [19:10] int(invoer) [19:11] maar dat gaan we niet doen [19:11] een geheel getal levert namelijk afgekapte waarden op bij berekeningen. [19:11] herinneren jullie je 601/60 = 10 nog? [19:12] ja [19:12] om er een kommagetal van te maken, gebruiken we i.p.v. int() 'float()' [19:13] er klopt nog één ding niet aan de code nu [19:13] we controleren niet op 'q' [19:13] iemand enig idee hoe we kunnen controleren of invoer 'q' is? [19:14] ok, een hint, 'if' [19:14] en omdat het stil blijft, ook maar even het antwoord: [19:14] if invoer == "q": [19:15] break hebben we de afgelopen les nog niet gezien. [19:15] wat het doet is dat het de loop waarin het staat direct beëindigt. [19:16] in dit geval is dat dus de while-loop, die anders 'voor eeuwig' zou blijven draaien. [19:16] is de break het zelfde als bij html dat je aan een volgende regel begint? [19:16] nee,
in html breekt de regel af [19:17] deze 'break' stopt het uitvoeren van de loop (lus, in dit geval het while True-statement bovenaan het document) [19:17] Is == nu wel of niet goed? [19:17] == is goed. [19:17] = is voor toewijzen van waardes aan variabelen [19:17] == is voor vergelijken van waarden. [19:17] exalt> kan dit : var = [({a,b},{c,d}), "blaat"] als soort van 2d associatieve array ? [19:18] hmm, wat ingewikkeld voor nu, kom ik na de les wel even op terug. [19:18] ok [19:18] ok, we hebben nu dus een lijst met cijfers. [19:18] nu moeten we alleen nog het gemiddelde berekenen. [19:19] ik ga hier uit van: [19:19] som van alle getallen/aantal getallen [19:19] we zullen dus eerst alle getallen die we verzameld hebben bij elkaar moeten optellen. [19:19] dat kan met de loop die we eerder vandaag al hebben behandeld. [19:20] de for-loop [19:20] begrijpt iedereen wat hier gebeurd? [19:21] ok, mooi [19:21] we hebben nu dus alle cijfers bij elkaar opgeteld. [19:21] we moeten ze alleen nog delen door het aantal cijfers. [19:21] om daarachter te komen, zullen we een nieuwe python-functie moeten gebruiken: [19:21] len() [19:22] len() komt van length (lengte) en geeft de lengte van o.a. een list terug [19:22] goed, we hebben nu alle gegevens die we nodig hebben [19:23] dan hoeven we dus alleen nog het gemiddelde te bereken [19:23] door middel van delen '/' [19:23] zo, ons programma is klaar. [19:24] hoog tijd om eens te kijken of ik geen fouten heb gemaakt. [19:24] Hoe voer je een .py programma uit? [19:25] na de les kan ik nog even uitgebreidere uitleg doen, maar hier komt het op neer: [19:25] cd'en naar de map met het bestand [19:25] en python bestandsnaam.py [19:25] in een terminal [19:26] Hij raakt van slag als ik 2 keer enter doe. [19:26] dat klopt, we hebben nog altijd geen foutenafhandeling ingebouwd [19:26] wat er gebeurd is dat float("") niets is. [19:26] en dus een foutmelding geeft. [19:27] ok, heeft iedereen het kunnen uitvoeren? [19:27] en heeft iemand nog vragen? [19:28] het is alweer bijna tijd, dus hier laten we het voor vandaag bij [19:28] nog even samenvatting van vandaag: [19:28] - lijsten [19:29] - toevoegen & verwijderen van items van lijsten [19:29] - for loop [19:29] - break [19:29] - strings, floats, ints [19:29] en dan heb ik het belangrijkste wel geloof ik :) [19:30] Emiel1976> ja die totaal = 0 is bedoelt dat als je niets in vult je het getal 0 hebt zeker\ [19:30] het totaal was nog niks, ik moest het nog berekenen. [19:30] duidelijk? [19:30] Wat is het verschil tussen raw_input en input? [19:30] met raw_input maak je een string [19:30] <Tjibba> input werkt alleen met getallen [19:31] goed, bedankt voor jullie komst dan allemaal en tot volgende week! [19:31] * commandoline is er nog wel even voor vragen [19:31] dit kanaal is weer open [19:32] :) [19:32] Lekker vrij! [19:32] lol === ChanServ changed the topic of #Ubuntu-nl-mwanzo-klas to: Zaterdag 12-02-11 :19.30-20.30 workshop Python voor "beginners" (3) #Ubuntu-nl-mwanzo-klas. Info: http://wiki.ubuntu-nl.org/community/mwanzo/Workshop/BasiscursusPython Leiding: commandoline. logs op http://irclogs.ubuntu.com. Alle cursisten join ook: #ubuntu-nl-mwanzo, daar kun je vragen stellen. === ChanServ changed the topic of #Ubuntu-nl-mwanzo-klas to: Zaterdag 12-02-11 :19.30-20.30 workshop Python voor "beginners" (4) #Ubuntu-nl-mwanzo-klas. Info: http://wiki.ubuntu-nl.org/community/mwanzo/Workshop/BasiscursusPython Leiding: commandoline. logs op http://irclogs.ubuntu.com. Alle cursisten join ook: #ubuntu-nl-mwanzo, daar kun je vragen stellen. [19:41] dag allemaal