Lussen

Deze pagina bevat uitvoerbare code.

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

  1. ken elk element toe aan number

for number in [2, 4, 6, 8]:
  1. de BODY of BLOCK gebruikt de waarde van number

  2. en vervolg de lus met de het volgende element

    print("number is", number)
  1. 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'

result

string[ix - 1]

string[ix]

ix

't'

' '

't'

0

't'

'i'

1

'i'

'm'

2

'm'

'e'

3

'e'

' '

4

'tt'

' '

't'

5

't'

'o'

6

'o'

' '

7

'ttt'

' '

't'

8

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 == 42

  • guess > 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.

  1. Wat verzamel je, en wat is de startwaarde? Die variabele heet de verzamelvariabele.

  2. Wat loop je langs? Daaruit volgt for of while. Bij een for kies je hier ook tussen de twee typen hierboven: op element of op index.

  3. Wat gebeurt er per stap met wat je verzamelt?

  4. Wanneer is het klaar? Bij een begrensde lus ligt dat vast. Bij een onbegrensde lus schrijf je het zelf.

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

  1. Verzamelen: result, startwaarde 0

  2. Langs: de elementen van L, dus een for op element

  3. Per stap: result erbij optellen

  4. Klaar: als L op is

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

  1. Verzamelen: result, startwaarde 1

  2. Langs: geen bestaande reeks, dus een while

  3. Per stap: result verdubbelen

  4. Klaar: zodra result minstens limit is. Elke stap verdubbelt result, dus dat gebeurt ook echt

  5. Terug: 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 n accepteert

  • Een lijst teruggeeft met alle factoren van n

  • Gebruik 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 string accepteert

  • Alle 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