Korte python-intro

Python is een programmeertaal. Het is dus een taal waarin programmacode geschreven kan worden. Als het programma af (en foutloos) is, wordt het door de compiler geïnterpreteerd en omgezet naar een werkend programma.

Voor we ons wagen aan een volledig programma, kunnen we Python ook gebruiken als 'veredelde rekenmachine'. We geven commando's in Python, en krijgen onmiddellijk respons op onze vraag. Dat is bij de meeste programmeertalen niet mogelijk.

We gebruiken repl.it, een online platform om code in te schrijven. Het voordeel: je kan dit ook heel makkelijk thuis doen, je hoeft geen software te installeren. Het nadeel: voorlopig moeten we in repl.it een oudere versie van Python gebruiken als we tekeningen willen maken. Allicht wordt dit in de toekomst opgelost.

1 De Python interpreter als veredelde rekenmachine

Zoek online op de zoektermen 'replit python 3'. Dan kom je op de site https://repl.it/@enaard/Python-3. Hier kan je Pythoncode schrijven vanaf versie 3.0 of hoger. (Omdat we voorlopig niets willen tekenen, is dat in orde.) In het (zwarte) rechtervenster kan je na de prompt (>) opdrachten intikken, waarop je onmiddellijk antwoord krijgt.

1.1 Rekenen

Tik na de prompt de gegeven uitdrukking 2+2.5 en druk op enter. Het resultaat (4.5) hoef je niet in te tikken, dat komt vanzelf.
> 2+2.5
4.5

Je kunt ook met variabelen werken:

> x=1.5*2
Dit betekent dat je een variabele x invoert die de waarde 3 krijgt. Let op: de variabelenaam moet in het linkerlid staan. Je mag spaties tussenvoegen, bv. x = 1.5 * 2. Let op kleine letters en hoofdletters; x is niet hetzelfde als X. Je kunt nu x gebruiken in berekeningen:
> x/10
0.3
Merk op: eerst moet x een waarde krijgen, pas daarna kan je met x gaan rekenen. Dat is anders dan in de wiskundeles!

Vermenigvuldiging en deling hebben voorrang op optellen en aftrekken - gebruik haakjes om de volgorde te wijzigen. De machtsverheffing wordt genoteerd met **.

> 2+3*5
17
> (2+3)*5
25
> 2**3
8

Met '_' verwijs je naar het laatste resultaat:

> _ + 1
9

Zijn er speciale functies nodig, dan kan het zijn dat Python die (standaard) niet kent. Dan moet er eerst een `bibliotheek' geïmporteerd worden, zodat Python weet waar die functies te vinden zijn. Zo zijn wiskundige constanten en functies te vinden in de bibliotheek (of module) math. Merk op: je moet nog altijd de naam van de module schrijven voor de naam van de functie.

> import math
> math.sin(math.pi/2)
1.0
Let op: het argument (hier math.pi/2) moet tussen haakjes staan, dus math.sin math.pi/2 werkt niet.

Opgelet met deling: vanaf Python 3.0 wordt de delingsoperator / gebruikt voor de reële deling. Dus de input 7/2 levert output 3.5.

> 7/2
3.5
In de meeste programmeertalen zou 7/2 het getal 3 opleveren: omdat 7 en 2 beide geheel zijn, wordt de gehele deling uitgevoerd (dit heeft al tot heel wat beginnersstress geleid...).

Als je in Python (vanaf versie 3.0) het afgekapte resultaat wil, moet je de operator gebruiken die in Python 3.0 een gehele deling aanduidt: //.

> 7//2
3
Werk je in Python versie 2.x, dan bestaat enkel de operator /, en dan zal het resultaat van de deling afhangen van de getallen die opgegeven werden. Zijn zowel teller als noemer gehele getallen, dan is het resultaat ook een geheel getal (dus afgekapt).

Tot slot nog een kleine voorbereiding op het schrijven van programma's. Tot nu toe kregen we altijd een automatisch antwoord bij het invoeren van een commando na de prompt: het resultaat van de uitdrukking (als dat er is) wordt uitgeprint op de volgende regel. Van zodra we in een programma werken, zullen we heel expliciet moeten vragen om iets uit te printen. Dat kan met de print-opdracht, als volgt:

> x = 18
> print(x)
18
> print(7+3)
10

1.2 Tekst overlopen en manipuleren

Naast rekenen en werken met wiskundige formules, kan Python ook tekst manipuleren. Voer na de prompt volgende commando's in. Kan je uit de gegeven respons afleiden wat de werking is van de gevraagde commando's? (De respons werd in deze opsomming weggelaten; ze zal wel op het scherm verschijnen vanaf het derde commando.)
> woord = "aard"
> zin = "appelpuree is lekker"
> woord + zin
> woord * 3
> len(woord)
> woord[0]
> woord[3]
> woord[-1]
> woord[-2]
> woord[4]
Merk op dat het laatste commando een foutmelding oplevert. Kan je zien waarom?

Tot slot geef je nog een commando in, dat bestaat uit twee regels. Let op: de puntjes zullen vanzelf verschijnen, maar ná de eerste reeks puntjes moet je zelf nog een viertal spaties of een tab intikken. Na de tweede reeks puntjes druk je gewoon op enter.

> for letter in zin:
...     print(letter)
...

2 Programma's

Een programma (of script) bevat python-commando's die na elkaar uitgevoerd worden. Gebruik het (witte) linkervenster van repl.it om programma's in te schrijven, en de groene pijl (run) om het programma te laten lopen. De output van het programma zal je dan in het (zwarte) rechtervenster zien verschijnen. Neem deze code over in het linkervenster:

x = 4
y = 5
print(10 * x + y)
Laat je dit programma lopen, dan komt er als output
45
Als het programma input van de gebruiker wil opvragen en verwerken, gebruik je de functie input(...). Overschrijf het vorige programma met deze code:
naam = input("Tik je naam in: ")
print("Dag " + naam)
Laat dit programma lopen: de computer zal vragen om je naam in te tikken. Doe dat; sluit af met enter. Wat komt er als antwoord?

2.1 Keuzestructuren

Het if/else-statement wordt gebruikt om een keuze te maken:

naam = input("Tik je naam in: ")
if len(naam) < 7:
    print("Dag " + naam)
else:
    print("Hallo " + naam)
Let erop dat de if- en else-regel op een dubbele punt eindigen! Bovendien moet je inspringen (liefst met een tab) om aan te geven wat er "in de if" en "in de else" staat.
naam = input("Tik je naam in: ")
if len(naam) < 7:
    naam = naam + "tje"
    print("Dag " + naam)
else:
    print("Hallo " + naam)
Merk op: hier wordt de nieuwe inhoud van de variabele naam berekend door de oude inhoud te verlengen met het stukje tekst "tje".

Omdat er in de if-structuur getest wordt op een of andere voorwaarde, zijn er vergelijkingsoperatoren nodig. Hieronder een lijst, aangevuld met de logische operatoren and, or en not die verschillende voorwaarden kunnen samenvoegen.
<kleiner dan
<=kleiner dan of gelijk aan
>groter dan
>=groter dan of gelijk aan
==gelijk aan
!= of <>verschillend van
anden
orof
notniet

Voorbeeld:

naam = input("Tik je naam in: ")
if len(naam) < 7:
    if naam[-1] == "b" or naam[-1] == "s" or naam[-1] == "t":
        naam = naam + "je"
    else:
        naam = naam + "tje"
    print("Dag " + naam)    
else:
    print("Hallo " + naam)
Let op het verschil tussen = en ==.

2.2 Herhalingsstructuren

Herneem even de code die je schreef vlak voor we aan programma's begonnen. Tik in (gebruik het witte venster, de vorige code mag allemaal weg):

zin = "Hello world."
for letter in zin:
    print(letter)
Hier wordt herhaaldelijk een letter uit de gegeven tekst uitgeprint. Met dergelijke herhalings- of lus-structuur geef je aan dat een stuk code meermaals moet uitgevoerd worden.

Een stuk tekst (zoals de inhoud "Hello world." van de variabele zin) kan je bekijken als een opeenvolging van letters. Met de for-lus overloop je dan alle elementen van die opeenvolging.

Een opeenvolging van getallen is ook eenvoudig aan te maken en te overlopen. De uitdrukking range(5) bevat de vijf getallen 0 1 2 3 4. Merk op: het tellen begint vanaf 0 en eindigt net voor de opgegeven parameter van de functie range(...). Vervang het huidige programma door deze code:

for i in range(12):
    print (i,end=' ')
Dit geeft als output:
0 1 2 3 4 5 6 7 8 9 10 11
De "teller" i neemt de waarden 0 t.e.m. 11 aan, en voor elke waarde wordt het print-statement uitgevoerd. Zoals bij de if moet je indenteren (inspringen).
Merk op dat de eindgrens (12) zelf niet behandeld wordt. Als je dit wil moet je range(13) schrijven.
De uitdrukking end=' ' geeft aan hoe de printopdracht moet afgesloten worden. Standaard wordt een printopdracht met een enter afgesloten, dus als je print(i) schrijft, komen alle getallen onder elkaar.

Je kunt meerdere regels opnemen in de for-lus door in te springen. De lus stopt op het moment dat je niet meer inspringt:

x = 0
for tel in range(10):
    print ("hallo")
    x = x + 10
print (x)
Het laatste commando staat niet ingesprongen ("zit niet in de lus"), en wordt dus eenmaal uitgevoerd, na de for-lus. In dit geval krijg je tien keer hallo op het scherm (onder elkaar), gevolgd door de eindwaarde van x, namelijk 100. Merk op dat de teller tel hier niet echt gebruikt wordt, behalve om aan te geven dat je iets 10 keer wil doen.

Alternatief: de while-lus

Naast de for-lus bestaan er nog andere herhalingsstructuren. De belangrijkste is de while-lus. We geven hier wel een voorbeeld, maar hebben dit niet nodig voor het vervolg van de workshop. Lees dit alleen, neem de code niet over in repl.it. Belangrijk om te onthouden: als het op voorhand duidelijk is hoe dikwijls een bepaalde herhaling uitgevoerd moet worden, wordt de for-lus gebruikt. Als het niet op voorhand geweten is, dan is de while-lus nodig.
naam = input("Geef een naam: ")
while naam != "stop" and naam != "STOP":
    print("Dag " + naam + "!")
    naam = input("Geef nog een naam: ")
print("U gaf aan te willen stoppen. Met dank voor het meespelen.")    

2.3 Zelf functies of methodes schrijven

Allicht heb je al dikwijls de sinus of cosinus van een hoek berekend. Voor speciale hoeken kan je dat met wat algebra (en de stelling van Pythagoras) zelf berekenen. Voor 'gewone' hoeken (bijvoorbeeld 34,23° of 1,547812 rad) weet je rekenmachine het antwoord. Maar hóe berekent die rekenmachine dat? Tekent ze een eenheidscirkel, past ze de hoek af, en meet ze de afstand op de Y- respectievelijk X-as? We belichten de twee domeinen die de rekenmachine helpen om jou deze service te leveren.

Om te beginnen is er de wiskunde. Je rekenmachine zal formules uit de 'hogere wiskunde' (in dit geval: reeksontwikkeling) gebruiken om een (benaderde) uitkomst te berekenen. (Voor wie wil weten welke formule: wikipedia brengt raad.)

Daarnaast is er de informatica. Van zodra de wiskundige formule is omgezet in een juist stukje code, verpakt jouw rekenmachine dit in een zelfstandig stukje programma. Dat wordt dan een functie genoemd. Om je een voorbeeld te geven: hieronder staat de Python-functie die een gegeven getal (eender welk getal...) verdubbelt.

def verdubbel(x):
    uitkomst = x * 2
    return uitkomst
Dit kan ook korter geschreven worden, zonder de hulpvariabele uitkomst.
def verdubbel(x):    
    return x * 2
Dit inkorten kan uiteraard alleen als de berekening eenvoudig is. Voor de sinus-functie zijn er wél wat tussenstappen en hulpvariabelen nodig! Het gebruik van dergelijke functie gaat zoals het gebruik van de sinus- of cosinusfunctie in de wiskunde.
a = 12
b = verdubbel(a)
print(b)
Bovenstaande functie heeft één parameter. Je kan ook meerdere parameters gebruiken, bijvoorbeeld in volgende functie-definitie:
def som_van(a,b):
    return a + b
Een voorbeeld van gebruik zie je in deze functie-oproep:
b = 7
print(som_van(b,10))
print(som_van(b,b))
Als resultaat zou je 17 en 14 moeten krijgen. Merk op dat de namen die in de definitie van de functie gebruikt worden, helemaal niets te maken hebben met de namen die bij het oproepen van de functie gebruikt worden.

Oefening 1

Schrijf een functie is_klinker(letter) die True teruggeeft als de gegeven letter gelijk is aan a, e, i, o, u of y. In het andere geval komt er False terug. Test de functie uit door ze op te roepen met een parameter naar keuze en het resultaat uit te schrijven. Bijvoorbeeld:
antwoord = is_klinker("x")
print(antwoord)

Oefening 2

Schrijf een functie verberg_klinkers(tekst) die alle klinkers van een tekst vervangt door een sterretje (*). Werkwijze: Test dit uit met deze gecombineerde opdracht (printen en oproepen van de functie in één):
print(verberg_klinkers("atlantische papegaaieduiker"))

3 Tip voor de die-hards

Na de prompt (in het zwarte scherm) kan je help() intikken - vergeet de lege haakjes niet. Lees de respons aandachtig: via deze weg krijg je hulp over eender welk onderwerp. Wil je terug uit de help-modus? De toetsencombinatie Ctrl + C stuurt je terug naar de gewone modus.

4 Tekenen met Turtle

Tot nu toe werden getallen en tekst verwerkt. Tijd om nu ook visueel te werken. We maakten al kennis met de module math die allerlei wiskunde-tools verzamelt. De module turtle verzamelt teken-tools. Helaas, om deze te kunnen gebruik in de online toepassing repl.it moeten we teruggrijpen naar Python versie 2.x. Gelukkig zijn de verschillen met Python 3.x niet storend voor de toepassing die wij nodig hebben.

Open een nieuw tabblad in je browser en zoek online met de termen 'replit python turtle'. Volg de link naar https://repl.it/languages/python_turtle. Het programma wordt nog altijd in het (witte) linkervenster geschreven, maar het zwarte (rechter-)venster is nu verstopt achter een ander wit venster. Het zwarte venster ('console') zal enkel voor foutmeldingen gebruikt worden.

Kopieer de code die hieronder staat naar het linkervenster en druk op de groene run-knop. Kan je aan de hand van de bewegingen van de schildpad elk stukje code thuisbrengen?


import turtle 

turtle.shape("turtle")
turtle.pensize("5")
turtle.color("black")
turtle.write(" Hi, all programmers")
turtle.left(90)
turtle.forward(120)
turtle.left(90)
turtle.circle(100)
turtle.forward(100)
turtle.circle(50)
turtle.forward(50)
turtle.penup()
turtle.goto(-160,150)
turtle.write(" Hello, boss, I am little turtle :), Miss me? :p")

turtle.exitonclick()

Verander hier en daar iets aan de code: een ander getal, een andere opdracht, een andere kleur... Kan je voorspellen wat er verandert aan de output?

Oefening 3

Schrijf een functie vervang(tekst,patroon) die elke letter 'F' in de gegeven tekst vervangt door het gegeven patroon (dat is een opeenvolging van letters). Ga spieken in de code die je schreef voor oefening 2. (Als het goed zit, vind je dat in een ander tabblad van je browser terug!) Hoe test je jouw functie?

Oefening 4

Werk verder in hetzelfde venster als oefening 3; wis de code niet.
Schrijf een functie teken(tekst,lengte,kleur) die de turtle van Python een traject laat afleggen. De lengte van elke stap wordt gegeven door de tweede parameter. De penkleur wordt gegeven door de derde parameter. De tekst zelf bevat de letters 'F', 'L' en 'R'. Laat de schildpad beginnen op positie (-100,0). Test uit met de functie-oproep teken("FLFLFRFRF",30,"red"). Dat zou een rode letter S moeten opleveren.

Oefening 5

Werk verder in hetzelfde venster als oefening 3 en 4; wis de code niet.
Hieronder staat een programma. De functie teken die hierboven beschreven werd, wordt zeven keer opgeroepen. De eerste oproep gebruikt de tekst met naam olifant; deze variabele bevat de tekst "F". De tweede oproep gebruikt de tekst met naam kangoeroe; deze variabele bevat de tekst die ontstaat door de vorige tekst (die van de olifant) aan de hand van de functie vervang(tekst,patroon) om te vormen. Het patroon is gegeven: "LFRFFRFL".
Kopieer deze code onder de oplossing van oefening 3 en 4, en vul aan waar gevraagd.
turtle.speed(11)

olifant = "F"
patroon = "LFRFFRFL"
kangoeroe = ...   # vul hier aan (ook de volgende 5 regels) 
konijn = ...
muis = ...
rups = ...
mier = ...
microbe = ...

teken(olifant, 256, "grey")
teken(kangoeroe, 128, "red")
teken(konijn, 64, "orange")
teken(muis, 32, "yellow")
teken(rups, 16, "green")
teken(mier, 8, "lightblue")
teken(microbe, 4, "blue")

turtle.exitonclick()

Oefening 6

Uitdaging: zou je bovenstaand programma kunnen inkorten, door de oproep van de functie teken in een for-lus te verpakken? Je gaat dan volgende extra's nodig hebben:

Na de uitleg over fractalen...

Hoe fractalen maken zonder computer?

Voor meer informatie...

leen.brouns@ugent.be
Opleiding Industrieel Ingenieur Informatica
Faculteit Ingenieurswetenschappen en Architectuur
Universiteit Gent