Opstap

Deze pagina bevat uitvoerbare code.

De uitwerkingen staan in dezelfde volgorde als de dertien opdrachten in de opstap. Bij de leesopdrachten rekent de cel het antwoord uit.

Opdracht 1

len(w) komt in de lijst, niet w zelf. Het filter in regel 3 houdt de veelvouden van 3 over, en 0 hoort daarbij. In regel 4 komen de posities van de klinkers erin, niet de klinkers. In regel 6 kiest de conditionele expressie per getal een woord; bij 5 is x > 5 niet waar.

print([len(w) for w in ["de", "vuurtoren", "draait"]])
print([w for w in ["de", "vuurtoren", "draait"] if len(w) > 2])
print([x for x in range(10) if x % 3 == 0])
print([i for i, c in enumerate("toren") if c in "aeiou"])
print([a + b for a, b in zip([1, 2, 3], [10, 20, 30])])
print(["hoog" if x > 5 else "laag" for x in [3, 8, 5]])
[2, 9, 6]
['vuurtoren', 'draait']
[0, 3, 6, 9]
[1, 3]
[11, 22, 33]
['laag', 'hoog', 'laag']

Opdracht 2

def mult_of_five(n):
    """Geeft een lijst met de eerste n veelvouden van 5."""
    return [x * 5 for x in range(1, n + 1)]


assert mult_of_five(0) == []
assert mult_of_five(1) == [5]
assert mult_of_five(3) == [5, 10, 15]

Opdracht 3

def divisible_by(n, L):
    """Geeft de getallen uit L die deelbaar zijn door n."""
    return [x for x in L if x % n == 0]


assert divisible_by(5, [15, 0, 23, 4]) == [15, 0]
assert divisible_by(3, [2, 4, 8, 10]) == []
assert divisible_by(2, []) == []

Opdracht 4

def positions(L, x):
    """Geeft de posities waarop x in L staat."""
    return [i for i, element in enumerate(L) if element == x]


assert positions(["de", "toren", "de"], "de") == [0, 2]
assert positions(["de", "toren"], "licht") == []
assert positions([], "de") == []

Opdracht 5

def zipper(L1, L2):
    """Combineert L1 en L2 element voor element tot een lijst van lijsten."""
    return [[a, b] for a, b in zip(L1, L2)]


assert zipper([1, 3, 5], [2, 4, 6]) == [[1, 2], [3, 4], [5, 6]]
assert zipper([10, 9, 12], ["jan", "feb", "mrt"]) == [
    [10, "jan"],
    [9, "feb"],
    [12, "mrt"],
]
assert zipper([], []) == []

Opdracht 6

Het resultaat is even lang als temperatures: de conditionele expressie kiest per element een waarde en laat niets weg.

def frost(temperatures):
    """Geeft per temperatuur "vorst" bij 0 graden of kouder, en anders "dooi"."""
    return ["vorst" if t <= 0 else "dooi" for t in temperatures]


assert frost([-1, 0, 10]) == ["vorst", "vorst", "dooi"]
assert frost([21, -21]) == ["dooi", "vorst"]
assert frost([]) == []

Opdracht 7

Regel 1 is een set: elke letter staat er één keer in, ook de u en de r die dubbel in het woord staan. Regel 3 is ook een set, met de drie mogelijke resten bij deling door 3. Regel 4 is een lijst van lijsten met één for; regel 5 is een geneste comprehension, met twee rijen van drie.

print({c for c in "vuurtoren"})
print({w: len(w) for w in ["licht", "nacht"]})
print({x % 3 for x in range(10)})
print([[y] * 2 for y in range(3)])
print([[x * y for x in range(1, 4)] for y in range(1, 3)])
{'v', 'o', 'u', 'r', 't', 'e', 'n'}
{'licht': 5, 'nacht': 5}
{0, 1, 2}
[[0, 0], [1, 1], [2, 2]]
[[1, 2, 3], [2, 4, 6]]

Opdracht 8

def first_letters(words):
    """Geeft de set van beginletters van de woorden."""
    return {word[0] for word in words}


assert first_letters(["de", "vuurtoren", "draait"]) == {"d", "v"}
assert first_letters(["licht"]) == {"l"}
assert first_letters([]) == set()

Opdracht 9

Een woord dat twee keer voorkomt, wordt twee keer als sleutel gezet, met dezelfde waarde. In de dictionary staat het één keer.

def word_lengths(words):
    """Geeft een dictionary van elk woord naar zijn lengte."""
    return {word: len(word) for word in words}


assert word_lengths(["de", "toren"]) == {"de": 2, "toren": 5}
assert word_lengths(["de", "de"]) == {"de": 2}
assert word_lengths([]) == {}

Opdracht 10

def common(counts, n):
    """Geeft de woorden uit counts die minstens n keer voorkomen, met hun aantal."""
    return {word: count for word, count in counts.items() if count >= n}


assert common({"de": 3, "toren": 1, "licht": 2}, 2) == {"de": 3, "licht": 2}
assert common({"de": 3}, 4) == {}
assert common({}, 2) == {}

Opdracht 11

def count_vowels(s):
    """Geeft het aantal klinkers in s."""
    return sum([1 for c in s if c in "aeiou"])


assert count_vowels("vuurtoren") == 4
assert count_vowels("bbc") == 0
assert count_vowels("") == 0

Opdracht 12

Een geneste comprehension kan ook: [["." for _ in range(width)] for _ in range(height)]. Allebei goed.

def grid(width, height):
    """Geeft een raster van height rijen met elk width punten."""
    return [["."] * width for _ in range(height)]


assert grid(3, 2) == [[".", ".", "."], [".", ".", "."]]
assert grid(1, 1) == [["."]]
assert grid(3, 0) == []

Opdracht 13

def mul_table(n):
    """Geeft de tafel van vermenigvuldiging van 1 tot en met n."""
    return [[x * y for x in range(1, n + 1)] for y in range(1, n + 1)]


assert mul_table(0) == []
assert mul_table(1) == [[1]]
assert mul_table(2) == [[1, 2], [2, 4]]
assert mul_table(3) == [[1, 2, 3], [2, 4, 6], [3, 6, 9]]