Lussen#

Looping for a while

for lussen#

for i in [0, 1, 2]:
    print("i is", i)
i is 0
i is 1
i is 2
for i in range(0, 3):
    print("i is", i)
i is 0
i is 1
i is 2
for x in [10, 15, 2020]:
    print("x is", x)
x is 10
x is 15
x is 2020
for i in ...:
    print("Gefeliciteerd")

Hoe kan dit 10 keer worden uitgevoerd? Hier is een reeks aan oplossingen mogelijk…

for i in range(10):
    print("Gefeliciteerd!")
Gefeliciteerd!
Gefeliciteerd!
Gefeliciteerd!
Gefeliciteerd!
Gefeliciteerd!
Gefeliciteerd!
Gefeliciteerd!
Gefeliciteerd!
Gefeliciteerd!
Gefeliciteerd!

Iteratief ontwerp#

Lussen! Variabelen!

for

for x in [40, 41, 42]:
    print(x)

while

x = 42
while x > 0:
    print(x)
    x -= 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 x in [2, 4, 6, 8]:
    print("x is", x)

print("Done!")

Stap voor stap#

  1. ken elk element toe aan x

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

  2. en vervolg de lus met de het volgende element

    print("x is", x)
  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 i in range(1, n + 1):  # range start at 0, add one!
        result *= i            # result = result * i

    return result              # return the result
fac(5)
120

Quiz#

x = 0

for i in range(4):
    x += 10

print(x)

Wat wordt geprint voor x?

Oplossing#

40

S = "time to think this over! "
result = ""

for i in range(len(S)):
    if S[i - 1] == " ":
        result += S[i]

print(result)

Wat wordt geprint voor result?

Oplossing#

'tttto'

result

S[i - 1]

S[i]

i

'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#

L = [3, 15, 17, 7]

for x in L:
    print(x)
S = "een fijne lus"

for c in S:
    print(c)

Op basis van index#

L = [3, 15, 17, 7]

for i in range(len(L)):
    print(L[i])
S = "een fijne lus"

for i in range(len(S)):
    print(S[i])

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 S[i - 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!
At last!

Simulatie#

def guess(hidden):
    """De computer raadt een geheim getal
    """
    comp_guess = choice(list(range(100)))  # [0, ..., 99]
    
    print("Ik koos", comp_guess)  # print de keus
    time.sleep(0.5)               # pauzeer een halve seconde
    
    if comp_guess == hidden:      # base case, eindelijk...
        print("Gevonden!")        # de computer is blij :)
        return 1                  # poging
    else:                         # recursive case
        return 1 + guess(hidden)  # volgende poging!
from random import choice

def escape(hidden):
    guess = 0
    count = 0
    
    while guess != hidden:
        guess = choice(range(100))
        count += 1

    return count
LC = [escape(42) for i in range(1000)]

Bekijk de eerste 10 resutaten

LC[:10]
[50, 165, 19, 65, 20, 15, 102, 24, 534, 139]

Het snelst geraden

min(LC)
1

Het minste geluk

max(LC)
650

Gemiddeld aantal keren

sum(LC)/len(LC)
101.289

Denken in lussen#

for

for x in range(42):
    print(x)

while

x = 1

while x < 42:
    print(x)
    x *= 2

Verschillen#

Wat zijn de verschillen in ontwerp tussen deze twee Python lussen?

for — eindige herhaling

Voor een bestaande list of bekend aantal herhalingen

while — oneindige herhaling

Voor een onbekend aantal herhalingen