Lussen¶
Looping for a while
for lussen¶
for number in [0, 1, 2]:
print("number is", number)
number is 0
number is 1
number is 2
for number in range(0, 3):
print("number is", number)
number is 0
number is 1
number is 2
for number in [10, 15, 2020]:
print("number is", number)
number is 10
number is 15
number is 2020
for number in ...:
print("Gefeliciteerd")
Hoe kan dit 10 keer worden uitgevoerd? Hier is een reeks aan oplossingen mogelijk…
for number in range(10):
print("Gefeliciteerd!")
Gefeliciteerd!
Gefeliciteerd!
Gefeliciteerd!
Gefeliciteerd!
Gefeliciteerd!
Gefeliciteerd!
Gefeliciteerd!
Gefeliciteerd!
Gefeliciteerd!
Gefeliciteerd!
Iteratief ontwerp¶
Lussen! Variabelen!
for
for number in [40, 41, 42]:
print(number)
while
number = 42
while number > 0:
print(number)
number -= 1
Variabelen
x = 41
x += 1
Variabelen¶
Variëren!
age = 41
age = age + 1
Wat hetzelfde is als …
age += 1
In het kort¶
hwToGo = 7
hwToGo = hwToGo - 1
hwToGo -= 1
total = 21000000
total = total * 2
total *= 2
u235 = 84000000000000000
u235 = u235 / 2
u235 /= 2
for!¶
for number in [2, 4, 6, 8]:
print("number is", number)
print("Done!")
Stap voor stap¶
ken elk element toe aan
number
for number in [2, 4, 6, 8]:
de BODY of BLOCK gebruikt de waarde van
numberen vervolg de lus met de het volgende element
print("number is", number)
code na de lus wordt wordt pas uitgevoerd als de lus klaar is!
print("Done!")
Faculteit met for¶
def fac(n):
result = 1 # not the result yet!
for number in range(1, n + 1): # range start at 0, add one!
result *= number # result = result * i
return result # return the result
fac(5)
120
Quiz¶
x = 0
for number in range(4):
x += 10
print(x)
Wat wordt geprint voor x?
Oplossing
40
string = "time to think this over! "
result = ""
for ix in range(len(string)): # ix is a common shorthand for 'index'
if string[ix - 1] == " ":
result += string[ix]
print(result)
Wat wordt geprint voor result?
Oplossing
'tttto'
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Twee typen for¶
Elementen versus index
Op basis van element¶
my_list = [3, 15, 17, 7]
for item in my_list:
print(item)
string = "een fijne lus"
for char in string:
print(char)
Op basis van index¶
my_list = [3, 15, 17, 7]
for ix in range(len(my_list)):
print(my_list[ix])
string = "een fijne lus"
for ix in range(len(string)):
print(string[ix])
Let op, het is niet heel gewoon om in lussen te printen, maar is wel heel nuttig voor debuggen!
Welke van de twee?¶
Elementen: eenvoudiger
Indices: flexibeler
Denk aan het “time to think this over! “ voorbeeld, in de lus kon op basis van de index steeds “terug” worden gekeken in de string met string[ix - 1]!
Extreme lussen¶
guess = 42
print("It keeps on")
while guess == 42:
print("going and")
print("Phew! I'm done!")
Wat doet deze lus?
while lussen¶
Een lus tot een bepaalde conditie is bereikt.
Tests?
42 == 42guess > 42…
Ontsnappen¶
import random
guess = 0 # starting value, not the final or desired value!
while guess != 42: # test to see if we keep looping
print('Help! Let me out!')
guess = random.choice([41, 42, 43]) # watch out for infinite loops!
print('At last!') # after the loop ends
Help! Let me out!
Help! Let me out!
Help! Let me out!
Help! Let me out!
Help! Let me out!
Help! Let me out!
At last!
Denken in lussen¶
for
for number in range(42):
print(number)
while
x = 1
while x < 42:
print(x)
x *= 2
Verschillen¶
Wat zijn de verschillen in ontwerp tussen deze twee Python lussen?
for - begrensde lus
Het aantal herhalingen ligt vast voordat de lus begint: de lengte van de lijst, of het bereik van range.
while - onbegrensde lus
Het aantal herhalingen ligt niet vast. Jij schrijft de conditie waaronder de lus doorgaat, en jij zorgt dat die ooit niet meer waar is.
Het lusrecept¶
Bijna elke lus in deze week doet hetzelfde: iets verzamelen terwijl je ergens langsloopt.
Vijf vragen brengen je van het probleem naar de code. Beantwoord ze eerst, schrijf dan pas.
Wat verzamel je, en wat is de startwaarde? Die variabele heet de verzamelvariabele.
Wat loop je langs? Daaruit volgt
forofwhile. Bij eenforkies je hier ook tussen de twee typen hierboven: op element of op index.Wat gebeurt er per stap met wat je verzamelt?
Wanneer is het klaar? Bij een begrensde lus ligt dat vast. Bij een onbegrensde lus schrijf je het zelf.
Wat geef je terug, en waar staat die regel?
Vraag 4 is de vraag die er tot nu toe niet stond. Bij een for beantwoordt Python hem voor je: de lijst raakt op. Bij een while niet. Onbegrensd wil zeggen dat de grens van de schrijver moet komen, en dat is precies wat vraag 4 vraagt.
Voorbeeld: total(L)¶
De som van de getallen in een lijst.
Verzamelen:
result, startwaarde0Langs: de elementen van
L, dus eenforop elementPer stap:
resulterbij optellenKlaar: als
Lop isTerug:
return result, na de lus
def total(L):
"""Geeft de som van de getallen in de lijst L."""
result = 0 # 1. verzamelen, startwaarde
for number in L: # 2. langs de elementen 4. klaar als L op is
result = result + number # 3. per stap erbij
return result # 5. na de lus
assert total([1, 2, 3]) == 6
assert total([-4, 4]) == 0
assert total([]) == 0
result is de naam die het practicum ook gebruikt en die in opdracht 2 hieronder terugkomt. Eén naam voor één idee: dit is de verzamelvariabele.
Voorbeeld: power_of_two(limit)¶
De kleinste macht van 2 die minstens limit is.
Verzamelen:
result, startwaarde1Langs: geen bestaande reeks, dus een
whilePer stap:
resultverdubbelenKlaar: zodra
resultminstenslimitis. Elke stap verdubbeltresult, dus dat gebeurt ook echtTerug:
return result, na de lus
def power_of_two(limit):
"""Geeft de kleinste macht van 2 die minstens limit is."""
result = 1 # 1. verzamelen, startwaarde
while result < limit: # 2. een while 4. klaar zodra result groot genoeg is
result = result * 2 # 3. per stap verdubbelen
return result # 5. na de lus
assert power_of_two(1) == 1
assert power_of_two(42) == 64
assert power_of_two(64) == 64
Hier doet vraag 4 het werk. Deze lus stopt omdat result elke stap groter wordt en limit dus een keer passeert. Haal die vermenigvuldiging weg en de lus stopt nooit. Dat is geen eigenschap van while, dat is een fout in stap 3.
continue en break¶
De instructie break zal een lus meteen laten stoppen en het programma gaat verder onder de lus.
De instructie continue gaat naar het einde van de lus en indien nodig wordt de lus herhaald.
Opdracht 1¶
a. Wat is de output?
def fun1B():
for number in range(1, 6):
if number % 2 == 0:
print("number is", number)
return
fun1B()
# controleer jouw antwoord
b. Wat is de output?
def fun2B():
for number in range(1, 6):
if number % 2 == 0:
print("number is", number)
return
fun2B()
# controleer jouw antwoord
c. Wat is de output?
def fun3B():
for number in range(1, 6):
if number % 2 == 0:
print("number is", number)
return
fun3B()
# controleer jouw antwoord
d. Wat is de output?
def fun4B():
for number in range(1, 6):
if number % 2 == 0:
print("number is", number)
return
fun4B()
# controleer jouw antwoord
Opdracht 2¶
Wat is de output van het volgende programma?
def function(my_list):
result = []
for item in my_list:
if item < 5:
result += [item]
return result
print(function([1, 2, 3, 4, 5, 6]))
# controleer jouw antwoord
Opdracht 3¶
Schrijf een functie factors(n) die:
Een integer
naccepteertEen lijst teruggeeft met alle factoren van
nGebruik hiervoor een lus
Beantwoord eerst de vijf vragen van het lusrecept en schrijf daarna pas de code. Je verzamelvariabele is hier een lijst.
Tip
De modulo-operator (%) kan hier heel handig zijn!
Vergeet niet de functie voldoende te testen, bijvoorbeeld:
assert factors(12) == [1, 2, 3, 4, 6, 12]
assert factors(15) == [1, 3, 5, 15]
# jouw oplossing
Opdracht 4¶
Wat is de output van het volgende programma?
def function(string):
result = ""
for char in string:
result = char + result
return result
print(function("Hanze"))
# controleer jouw antwoord
Opdracht 5¶
Schrijf een functie count_vowels(string) die:
Een string
stringaccepteertAlle klinkers in de string telt en dat aantal teruggeeft als integer
Gebruik een lus voor het tellen
Beantwoord ook hier eerst de vijf vragen van het lusrecept. Je verzamelvariabele is dit keer een getal.
Maak zelf een aantal assertions om je functie te testen.
# jouw oplossing