Opstap¶
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]]