Uitwerkingen collegeopdrachten lussen

Deze pagina bevat uitvoerbare code.

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:

  1. Verzamelen: result, startwaarde [].

  2. Langs: de getallen 1 tot en met n, dus een for op index.

  3. Per stap: het getal toevoegen als n er deelbaar door is.

  4. Klaar: als alle getallen bekeken zijn.

  5. 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:

  1. Verzamelen: result, startwaarde 0.

  2. Langs: de tekens van string, dus een for op element.

  3. Per stap: result met 1 verhogen als het teken een klinker is. De operator in controleert of het teken voorkomt in de string met klinkers.

  4. Klaar: als alle tekens bekeken zijn.

  5. 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!