Open les Python

verzorgd door docenten van de opleiding Industrieel Ingenieur aan UGent
voor SG Denderland
21 februari 2022

Ga met deze oefeningen aan de slag. Zoek informatie op in de slides, op het internet (start met het zoekwoord python en ga daarna meer in detail; w3schools.com is een goede site), bij je buurman/-vrouw in gather.town en uiteraard bij de begeleiders van deze open les!

Als je over de groene vraagtekens hovert, krijg je een tip. Een gele sleutel leidt naar de oplossing. Gebruik deze niet te snel!

1. Code herhaaldelijk uitvoeren met for-lus

Oefening 1

Tik deze code in, en laat lopen. Wat is de output?
for teller in range(5):
    print(f"{teller}")
print("gedaan...")

Van waar tot waar loopt de range? Blijkbaar loopt de range vanaf 0 tot net voor 5, dus tot en met 4.

Merk op dat de tweede regel inspringt: deze staat niet aan de linkerkantlijn, maar start met een aantal spaties. Dat is zeer belangrijk. De code wordt immers voorwaardelijk uitgevoerd: alleen als de teller in range(5) zit, zal de code uitgevoerd worden. Zodra de teller niet meer in die range zit, wordt de opdracht print(f"{teller}") niet meer uitgevoerd. Dan wordt er overgegaan naar de code die weer helemaal links aan de kantlijn staat, hier dus de opdracht print("gedaan...").

Te onthouden: na een regel die start met for komt er een dubbele punt; alles wat herhaald moet worden springt twee of vier spaties meer naar rechts (maar wees consequent met dat aantal).

Oefening 2

Wat is het verschil tussen deze twee programma's?
print("Dag")
print("allemaal...")
print("Dag", end = "-")
print("allemaal...")
Hoe kan je dit veranderen, zodat er exact onderstaande output komt? Dag allemaal...

Oefening 3

Schrijf een programma dat eerst aan de gebruiker vraagt hoe oud hij/zij is. Daarna wordt er hip hip hip hip hip hip hip hip hoera op het scherm geschreven. Het aantal keer dat hip er staat, komt overeen met de leeftijd van de gebruiker. De woorden moeten naast elkaar staan.
Om input te lezen, gebruik je leeftijd_tekst = input("geef je leeftijd: "). Let op! Het resultaat is een stukje tekst, en nog geen getal. Daarom kozen we ook voor de naam leeftijd_tekst!
Zet het stukje tekst in de variabele leeftijd_tekst om met de code leeftijd = int(leeftijd_tekst). Dan ben je nu zeker dat de variabele leeftijd een getal bevat.
leeftijd = int(input("Hoe oud ben je?"))
for i in range(leeftijd):
    print("hip", end = " ")
print("hoera")

Oefening 4

Schrijf een programma dat 5 sterretjes naast elkaar uitprint. Of 108 sterretjes. Gebruik verplicht een lus. De output is dus *****
for i in range(5):
    print("*", end = "")

Oefening 5

Schrijf een programma dat 3 lijnen van 5 sterretjes uitprint. Zorg er ook hier voor dat de aantallen makkelijk aan te passen zijn. *****
*****
*****

In de vorige oefening schreef je code voor één lijn sterretjes. Ga aan deze code niets veranderen, maar zet dat hele blok code in een herhalingsblok, dus in een lus.

2. Vragen staat vrij?

Het spreekwoord zegt vragen staat vrij. Daar zijn de lesgevers uit de opleiding Industrieel Ingenieur het niet helemaal mee eens.
Vragen staat niet vrij.
Vragen is een must.
Ben je bezig met leerstofverwerkende bezigheden? Dan maximaliseer je de opbrengst van die bezigheden als je constant vragen stelt. Vragen kan je stellen aan We begeleiden studenten graag op weg naar zelfredzaamheid. Zelfredzaamheid betekent niet dat je alles zelf moet weten of doen. Zelfredzaamheid betekent wel dat je zelf het initiatief kan nemen om op de juiste plaatsen naar het antwoord te zoeken: je eigen redeneervermogen, de cursus, pen en papier, het internet, een studiegenoot, een begeleider,... of een wandelingetje met iemand die jouw gedachtengang wil aanhoren.

Als toegift, eentje om even bij stil te staan...
Why do kids ask so many questions - but more importantly why do they stop?

3. Code herhaaldelijk uitvoeren met while-lus

De herhalingen in de vorige oefeningen werden met een for-lus geschreven. Dat konden we doen, omdat we op voorhand wisten hoe dikwijls de lus uitgevoerd moet worden. Als we dat niet weten, dan moeten we een ander soort lus gebruiken.

Oefening 6

Kopieer deze code, en laat lopen.
woord = input("tik 'hoi', ik stop van zodra je iets anders tikt: ")
while woord == "hoi":
    woord = input("tik nog 's 'hoi': ")
print("ai, jammer, dat was niet 'hoi'")	 
Op de tweede regel staat een dubbel gelijkheidsteken. Waar staat dat teken voor? Wat is het verschil met het enkele gelijkheidsteken?
Het gelijkheidsteken uit de wiskundeles wordt in Python geschreven als ==. Het gaat hier dus om een vergelijking, waarop 'true' (waar) of 'false' (niet waar) geantwoord kan worden. Het enkele gelijkheidsteken = is een (asymmetrisch) toekenningsteken. Dit teken is asymmetrisch, omdat a = b niet hetzelfde betekent als b = a. Lees het teken = als "krijgt de waarde van"!

Oefening 7

Kopieer deze code, en laat lopen.
woord = input("tik een woord, ik stop met vragen als je 'stop' tikt: ")
while woord != "stop":
    woord = input("geef nog een woord (stop met 'stop'): ")
Op de tweede regel staat het teken !=. Waarvoor zou dat staan?
Het teken != gaat na of linker- en rechterlid verschillend zijn.

Oefening 8

Stel dat je in de wiskundeles zit. Kunnen onderstaande uitspraken dan? x = x * 5
a = a + 7

Uit de eerste uitspraak zal afgeleid worden dat x de waarde 0 heeft. De tweede uitspraak is niet mogelijk, geen enkel getal is gelijk aan zichzelf + 7.

Stel dat je in de informaticales zit. Wat betekent volgende regel code dan?

x = x * 5

Omdat het teken = de toekenningsoperator is, krijgt de variabele hier een nieuwe waarde, namelijk het vijfvoud van zijn vorige waarde.

Oefening 9

Schrijf een programma dat begint zoals hieronder. Zorg dat het getal x wordt uitgeprint zolang dat niet groter is dan 100. Na elke printopdracht wordt het getal met 10 verhoogd.
x = int(input("Geef een getal op, best niet groter dan 50: "))

4. Operatoren en logische variabelen

Het begrip rekenkundige operatoren doet misschien geen belletje rinkelen, maar je gebruikt ze in elke wiskundeles. Dit zijn enkele binaire rekenkundige operatoren: +, -, *, /, % (modulo-operator, zoek op!). Deze operatoren worden binair genoemd omdat ze op twee (bi) operandi inwerken: in de bewerking a + b is a de linkeroperand, b de rechteroperand en + de operator.

Werkt een operator op slechts één operand in, dan wordt er gesproken van een unaire operator. Een voorbeeld hiervan is de absolute waarde. In de wiskunde wordt deze operator genoteerd met twee vertikale strepen rond de operand, dus |a|. In de informatica noteren we dit zoals we de sinus van een getal noteren: abs(a) is de absolute waarde van het getal a. We werken hier dus eerder met de functie-notaties uit de wiskunde.

Naast rekenkundige operatoren zijn er ook andere categorieën.

Gebruik Ecosia (desnoods Google) om op het internet te zoeken; gebruik de zoekwoorden python w3schools logical operators. Bekijk de voorbeelden. Welke logische operatoren bestaan er in Python, en zijn die unair of binair?


De operatoren and en or zijn binair; de operator not is unair. Het zijn operatoren die inwerken op logische variabelen.

Tot nu toe gebruikten we variabelen enkel om er een stukje tekst of een getal in te bewaren. We kunnen in een variabele ook een logische waarde bewaren: de waarde True (waar) of False (vals). Een voorbeeld: de logische variabele het_is_weekend zal vandaag False bevatten (tenminste, als ons programma goed op de kalender gekeken heeft 😏 ).

Variabelen die getallen bevatten kunnen gebruikt worden in berekeningen met rekenkundige operatoren: optelling, verschil, deling, vermenigvuldiging, machtsverheffing, modulo-berekening,... Met logische variabelen kan ook `gerekend' worden, maar hier zijn de operatoren dan logische operatoren zoals and, or en not.

Oefening 10

Voorspel wat deze code zou uitschrijven. Kopieer dan in replit en laat lopen. Klopte jouw voorspelling?
x = 2
while x < 10000:
	print(x)
	x = x * x
Vervang nadien x = 2 door x = 1 en laat opnieuw lopen. Wat gebeurt er nu? (Gebruik de sneltoets-combinatie Ctrl C om weer voort te kunnen...)
Bij de startwaarde x = 1 blijft de lus eeuwig doorlopen (tenzij we ze hardhandig afbreken), omdat de voorwaarde altijd voldaan blijft.

5. Structuur van een while-lus

Elke while-lus bestaat uit vier delen. De while-lus uit vorige oefening is heel kort: elk deel bestaat uit één regel.

Bij het schrijven van een while-lus volg je best deze volgorde:
  1. Eerst schrijf je de voorwaarde (rode kader, deel 2), omdat dat stukje het makkelijkst af te leiden is uit de opgave. De voorwaarde is een logische uitspraak over een bepaalde variabele (hier x).
  2. Vlak voor die uitspraak, moet die variabele natuurlijk een startwaarde hebben. Die startwaarde zet je klaar in deel 1, de eerste blauwe kader.
  3. Op het einde van de lus (dus net voor de code weer naar links inspringt) geef je de variabele uit de voorwaarde een nieuwe waarde. Dat is de tweede blauwe kader. Als dat niet gebeurt, zal de lus oneindig doorlopen. (Leg uit waarom.)
  4. Moet er dan nog code herhaald worden in de lus, dan komt die in deel 3: de gele kader. Merk op: in sommige situaties is deel 3 leeg.

Deel 2 bestaat altijd uit één regel (eventueel met een ingewikkelde uitspraak, die bestaat uit verschillende stukjes). Deel 1 en 4 gelijken meestal heel erg op elkaar, maar kunnen meerdere regels bevatten. Deze delen ontbreken echter nooit! Deel 3 kan heel lang of heel kort zijn - en zelfs helemaal leeg; dan is er dus geen deel 3.

Oefening 11

Duid de vier delen van de while-lus aan.

woord = input("geef een woord met meer dan 3 letters: ")
lengte = len(woord)
while lengte < 3:
    woord = input("geef een woord met meer dan 3 letters: ")
    lengte = len(woord)


Deel 1 bestaat uit de eerste 2 regels; deel 4 is daar een kopie van - dus bestaat ook uit twee regels. Inderdaad, het opnieuw inlezen van het woord hoort onverbrekelijk bij het opnieuw bepalen van de variabele lengte. Deel 3 ontbreekt dus in deze lus! Deze structuur is typisch voor een lus die test op input: er wordt een input gevraagd die aan bepaalde voorwaarde voldoet, en zolang die voorwaarde niet voldaan is, wordt er opnieuw input gevraagd.

Oefening 12

Pas oefening 10 zo aan, dat de lus maximaal 10 keer doorlopen wordt. Dat kan, door een teller bij te houden. Dit is een extra variabele die in de voorwaarde van de while-lus gecontroleerd wordt - dus moet ze ook klaargezet worden in deel 1, en vervangen worden in deel 4. Gebruik logische operatoren om beide voorwaarden (het getal mag niet te groot worden, de teller mag niet te groot worden) te combineren tot één uitspraak. Schrijf nadien ook uit hoeveel getallen er geprint werden.

Als x de startwaarde 2 heeft, dan komt er deze output: 2
4
16
256
er werden 4 getallen geprint
Als x de startwaarde 1 heeft, dan komt er deze output: 1
1
1
1
1
1
1
1
1
1
er werden 10 getallen geprint


x = 2
teller = 0
while x < 10000 and teller < 10:
  print(x)
  x = x * x
  teller += 1
print(f"er werden {teller} getallen geprint")

6. Tekenen

Genoeg geprutst met wiskunde en rekenwerk! Tijd voor wat fun. Waarschuwing: in de wiskundeles teken je de X- en Y-as zoals je links ziet staan (met de oorsprong dikwijls in het centrum van het vlak), in informaticatoepassingen volgen de assen de schrijfrichting van het Engels (de oorsprong ligt linksboven, de Y-as wijst naar beneden).

Oefening 13

Lees onderstaand programma, en probeer te voorspellen wat er getekend wordt.

import tkinter as tk

#-- constanten:
width = 200     # breedte
heigth = 200    # hoogte

#-- start hoofdprogramma:   
venster = tk.Tk()
venster.title("Hello world")
doek = tk.Canvas(venster, width=width, height=heigth)
doek.pack()

#-- verander dit stuk, als je iets anders wil tekenen;
#-- nu komt er een lijn ('line') en een rechthoek ('rectangle')
doek.create_line(0,0,width/2,heigth/2)
doek.create_rectangle(20, 40, 40, 60, fill="black", outline="")

#-- laat dit stuk staan, zet er niets bij of onder
tk.mainloop()
Kopieer dit programma dan in replit, en laat het lopen.

Kleuren

Een computer tekent kleuren aan de hand van rgb-waarden: rood, groen en blauw. Of eigenlijk red, green en blue. Op w3schools kan je er meer over lezen, en op verschillende online sites kan je gekende rgb-waarden omzetten in de bijhorende kleur, of van een gekende kleur op een foto de rgb-waarden opvragen - zo kan je die kleur ook in een eigen programma of website gebruiken.

Een paar voorbeelden:

rgb-waarde
roodrgb(255,0,0)
groenrgb(0,255,0)
blauwrgb(0,0,255)
witrgb(255,255,255)
zwartrgb(0,0,0)

Oefening 14

Lees onderstaand programma, en probeer te voorspellen wat er getekend wordt.
import tkinter as tk

#-- constanten:
width = 200
heigth = 200

#-- dit is een hulpmethode om kleuren te helpen tekenen
#-- deze code moet je niet 'ver-'staan, enkel 'laten' staan
#-- als je een bepaalde kleur wil gebruiken om te tekenen, 
#-- dan schrijf je rgb(a,b,c) met
#-- de juiste waarden voor a, b en c.
def rgb(red,green,blue):
    return "#%02x%02x%02x" % (red,green,blue)  

#-- hoofdprogramma:  
venster = tk.Tk()
doek = tk.Canvas(venster, width=width, height=heigth)
doek.pack()

#-- verander dit stuk, als je iets ander wil tekenen;
#-- nu staan er drie rechthoekjes (eigenlijk vierkantjes)
doek.create_rectangle(20, 40, 40, 60, fill=rgb(255,0,0), outline="")
doek.create_rectangle(40, 60, 60, 80, fill=rgb(0,255,0), outline="")
doek.create_rectangle(60, 80, 80, 100, fill=rgb(0,0,255), outline="")


#-- haal de code hieronder uit commentaar om uit te proberen
#for i in range(0,200,20):
#  for j in range(0,200,20):
#    doek.create_rectangle(i,j,i+20,j+20,fill=rgb(i,j,(i*j)%256),outline="")
#    doek.create_rectangle(i,j,i+20,j+20,fill=rgb(i,j,0),outline="")

#-- laat dit stuk staan, zet er niets bij of onder
tk.mainloop()

Oefening 15

Teken het huisje dat hier links te zien is (of maak een eigen versie). Maar kies wel mooiere kleuren: gebruik een online site zoals imageresizer.com om kleuren te plukken uit een foto van een echt huis. We geven je een foto mee (rechtermuisklik en bewaar afbeelding). Tot slot: tekenen op een computer vraagt veel coördinaten. Start daar dan mee: neem een ruitjesblad, zet daar een assenstelsel op en maak je tekening zo dat de belangrijkste punten gehele coördinaten hebben. Een voorbeeld zie je rechts.


Hoe start ik? Een goed programmeur is ook een goed verknipper van problemen. Probeer niet alles tegelijk uit, stel jezelf tevreden met de muur en de deur - en kijk of dat al lukt.


Welke afmetingen gebruik ik? Op de schets staan coördinaten die afmetingen aangeven in de grootte-orde van centimeters. In het programma worden afmetingen in pixels opgegeven. Dus vermenigvuldig deze getallen met een (makkelijke) factor, zodat de tekening niet te petieterig wordt.
Hoe teken ik een driehoek of vijfhoek? De code om een rechthoek te tekenen, ken je al. Zoek op hoe je een veelhoek (driehoek, vijfhoek,...) tekent: gebruik de zoekwoorden tkinter polygon.
Een goed programmeur is een beetje lui... Is het nodig om de schouw als vijfhoek te tekenen? Misschien helpt het om de tekenvolgorde aan te passen: verberg een stukje van de (rechthoekige) schouw achter het dak.
Upside down. Staat het huisje op z'n kop? Ai... rekenwerk vereist! (Waar ligt het aan?)
import tkinter as tk

#-- constanten:
width = 180
heigth = 220

#-- dit is een hulpmethode om kleuren te helpen tekenen
#-- deze code moet je niet 'ver-'staan, enkel 'laten' staan
#-- als je een bepaalde kleur wil gebruiken om te tekenen, 
#-- dan schrijf je rgb(a,b,c) met
#-- de juiste waarden voor a, b en c.
def rgb(red,green,blue):
    return "#%02x%02x%02x" % (red,green,blue)  

#-- hoofdprogramma:  
venster = tk.Tk()
doek = tk.Canvas(venster, width=width, height=heigth)
doek.pack()

doek.create_rectangle(80,150,140,200, fill=rgb(255,0,0), outline="")
doek.create_rectangle(90,170,110,180, fill=rgb(0,255,0), outline="")
doek.create_rectangle(120,170,130,200, fill=rgb(0,0,255), outline="")
doek.create_rectangle(120,120,130,140, fill=rgb(100,100,100), outline="")
doek.create_polygon(110,120,140,150,80,150, fill=rgb(0,255,255), outline="")

doek.create_rectangle(50,140,60,200,fill=rgb(200,255,0),outline="")
doek.create_oval(25,60,85,140,fill=rgb(255,0,255),outline="")

#-- laat dit stuk staan, zet er niets bij of onder
tk.mainloop()

Uitsmijter

Cadeautje...
import tkinter as tk


breedte = 200
hoogte = 200
max_stappen = 30
bovengrens = 1000


linksboven = complex(-2, 2)
rechtsonder = complex(2, -2)

# meer ingezoomd: (haal de 2 regels hieronder uit commentaar)
# linksboven = complex(0, 0)   
# rechtsonder = complex(1, -1)

# nog meer ingezoomd: (haal de 2 regels hieronder uit commentaar)
# linksboven = complex(1/2, 0)
# rechtsonder = complex(1, -1/2)

# deze code moet je niet 'ver-'staan, enkel 'laten' staan
def rgb(red,green,blue):
    return "#%02x%02x%02x" % (red,green,blue)  

   
root = tk.Tk()

canvas = tk.Canvas(root, width=breedte, height=hoogte)
canvas.pack()

xfactor = (rechtsonder.real - linksboven.real) / breedte
yfactor = (rechtsonder.imag - linksboven.imag) / hoogte

#-- kies voor c één bepaalde waarde, 
#-- door hieronder één regel uit commentaar te halen
# c = complex(-0.1, 0.1)
# c = complex(-0.12375, 0.56508)
# c = complex(-0.12, 0.74) # konijn van douady
c = complex(-0.11, 0.6557)
# c = complex(0, 1)
# c=complex(0,0) # cirkel 

for x in range(0, breedte):
    for y in range(0, hoogte):
        z = complex(x * xfactor + linksboven.real, y * yfactor + linksboven.imag)        
        aantal = 0

        while aantal < max_stappen and abs(z) < bovengrens:
            z = z ** 2 + c   # FORMULE
            aantal = aantal+1

        # als het getal niet boven de bovengrens uitkomt, 
        # en de lus zou blijven doordraaien zonder 'rem' op het aantal
        # stappen:
        if aantal == max_stappen:
            line = canvas.create_rectangle(x, y, x + 1, y + 1, fill="black", outline="")
        # anders, als het getal wel boven de bovengrens uitkomt,
        # dan weten we aan 'aantal' hoe SNEL dat getal boven
        # de bovengrens uitkwam - en hoe sneller, hoe feller rood   
        else:
            color = rgb((int)(aantal * 256.0 / max_stappen), 0, 125)
            line = canvas.create_rectangle(x, y, x + 1, y + 1, fill=color, outline="")


usingIDLE = 0
if not usingIDLE:
    root.mainloop()
	

Tot slot

In deze workshop werden verschillende lessen uit eerste bachelor Industrieel Ingenieur gecombineerd. Met de volledige uitleg van de for- en de while-lus is een student uit eerste bachelor al snel anderhalve week bezig. En elke week telt 2u30 theorie en 3 uur labo. Laat je dus niet ontmoedigen als je vond dat dit `nogal snel' ging, want je hebt gelijk! We hopen wel dat je een inkijk kreeg in wat er van een student verwacht wordt tijdens een labo: lezen, nieuwsgierig zijn, buren helpen en vragen stellen. En bij elke geslaagde oefening een speekmedaille.

Heb je nog vragen over informatica, over de opleiding Industrieel Ingenieur, over studeren tout court? Je kan ons bereiken via leen.brouns@ugent.be en ben.vanherbruggen@ugent.be.

Of gebruik de zoektermen student ugent industrieel ingenieur, en je komt op de site https://www.ugent.be/ea/nl/voor-toekomstige-studenten/industrieel-ingenieur-gent waar er heel wat (audio-visuele) informatie te vinden is.