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