Uitwerkingen collegeopdrachten lussen¶
Bij elke opdracht staat eerst waarom eruit komt wat eruit komt, en daarna het programma zelf. Die cellen draaien mee wanneer deze pagina wordt gebouwd, dus de uitvoer die je eronder ziet is de echte uitvoer.
Opdracht 1¶
a.¶
Antwoord: number is 2
De return staat binnen de if. Zodra number 2 is, drukt de functie af en
stapt ze in dezelfde stap uit de lus en uit de functie. De rondes voor 3, 4 en
5 komen er dus niet meer.
def fun1B():
for number in range(1, 6):
if number % 2 == 0:
print("number is", number)
return
fun1B()
number is 2
b.¶
Antwoord: er komt niets uit.
De return staat nu in de body van de for en niet in de if. In de eerste
ronde is number 1, de if klopt niet, en dan komt Python meteen bij return
uit. De functie is klaar voordat er ooit iets is afgedrukt.
Onder de cel hieronder staat daarom geen uitvoerblok. Dat lege resultaat is het antwoord, en niet een cel die niet gedraaid heeft: de andere cellen op deze pagina tonen wél hun uitvoer.
def fun2B():
for number in range(1, 6):
if number % 2 == 0:
print("number is", number)
return
fun2B()
c.¶
Antwoord: number is 2 en number is 4, op twee regels.
De return staat na de lus, op dezelfde hoogte als de for. De lus loopt nu
helemaal af en drukt af bij 2 en bij 4. Die laatste return geeft None terug;
dat zie je niet, want er wordt niets met de teruggegeven waarde gedaan.
def fun3B():
for number in range(1, 6):
if number % 2 == 0:
print("number is", number)
return
fun3B()
number is 2
number is 4
d.¶
Antwoord: het programma werkt niet.
De return staat hier helemaal links, buiten de functie. Python voert het
programma niet eens uit: het leest eerst het hele bestand, en een return buiten
een functie kan daarbij niet. Je krijgt een SyntaxError, en die foutmelding
hieronder is het antwoord.
Let op het verschil met b: daar stond return te vroeg, hier staat hij op een
plek waar hij helemaal niet mag staan.
def fun4B():
for number in range(1, 6):
if number % 2 == 0:
print("number is", number)
return
fun4B()
Cell In[4], line 7
return
^
SyntaxError: 'return' outside function
Opdracht 2¶
Antwoord: [1, 2, 3, 4]
result is de verzamelvariabele: hij begint op [] en groeit per ronde. De if
laat alleen elementen kleiner dan 5 door, dus 5 en 6 komen er niet in. De
return staat na de lus, zodat de hele lijst is opgebouwd voordat hij
teruggaat.
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]))
[1, 2, 3, 4]
Opdracht 3¶
De vijf vragen van het lusrecept, eerst beantwoord:
Verzamelen:
result, startwaarde[].Langs: de getallen 1 tot en met
n, dus eenforop index.Per stap: het getal toevoegen als
ner deelbaar door is.Klaar: als alle getallen bekeken zijn.
Terug:
return result, na de lus.
In de code hieronder staan diezelfde nummers als commentaar, zodat je ziet welke regel welk antwoord uitvoert.
def factors(n):
"""Geeft alle factoren van n terug."""
result = [] # 1. verzamelen, startwaarde
for number in range(1, n + 1): # 2. langs 1 t/m n, 4. klaar als die op zijn
if n % number == 0: # 3. alleen als n deelbaar is
result += [number]
return result # 5. na de lus
assert factors(12) == [1, 2, 3, 4, 6, 12]
assert factors(15) == [1, 3, 5, 15]
assert factors(1) == [1]
print(factors(12))
[1, 2, 3, 4, 6, 12]
Opdracht 4¶
Antwoord: eznaH
result begint leeg, en per ronde komt het nieuwe teken er vóór te staan:
char + result en niet result + char. Daardoor schuift elk teken de vorige
naar rechts en staat de string aan het eind achterstevoren.
def function(string):
result = ""
for char in string:
result = char + result
return result
print(function("Hanze"))
eznaH
Opdracht 5¶
De vijf vragen van het lusrecept:
Verzamelen:
result, startwaarde0.Langs: de tekens van
string, dus eenforop element.Per stap:
resultmet 1 verhogen als het teken een klinker is. De operatorincontroleert of het teken voorkomt in de string met klinkers.Klaar: als alle tekens bekeken zijn.
Terug:
return result, na de lus.
y telt niet mee, dus "rhythm" levert 0 op.
def count_vowels(string):
"""Telt de klinkers in string."""
result = 0 # 1. verzamelen, startwaarde
for char in string: # 2. langs de tekens, 4. klaar als string op is
if char in "aeiou": # 3. alleen als het teken een klinker is
result += 1
return result # 5. na de lus
assert count_vowels("Hanze") == 2
assert count_vowels("rhythm") == 0
assert count_vowels("") == 0
print(count_vowels("Hanze"))
2
Extreme lus¶
De lus uit de opgave stopt nooit. guess is 42, de conditie guess == 42 klopt
dus, en binnen de lus gebeurt niets wat guess verandert. Vraag 3 van het
lusrecept is niet beantwoord: er is
geen stap. Daardoor heeft vraag 4 ook geen antwoord en wordt de laatste regel
nooit bereikt.
Zodra guess in de lus wél verandert, loopt hij af:
guess = 42
print("It keeps on")
while guess == 42:
print("going and")
guess = 41 # 3. de stap die in de opgave ontbreekt
print("Phew! I'm done!")
It keeps on
going and
Phew! I'm done!