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