Opstap¶
Opdracht: Opstap
Bij elke opdracht staat het antwoord in de tekst, en daaronder staat hetzelfde programma in een cel die opnieuw wordt uitgevoerd telkens als deze pagina wordt gemaakt. Wat je als uitvoer ziet staan is dus werkelijk wat Python doet, en niet wat iemand dacht dat Python doet.
De laatste deelvraag van elke opdracht - 1c, 2c en 3d - vraagt je om je eigen antwoord te controleren met Python Tutor of met de cel op de pagina. Daar staat hieronder geen antwoord bij, want er valt niets te beantwoorden: die controle is de uitgevoerde cel zelf.
Syntax van functies¶
Opdracht 1¶
a. function maakt een lijst met de getallen vanaf 0 en telt die op.
range(x) telt tot x en niet tot en met x, dus list(range(4)) is
[0, 1, 2, 3] en sum maakt daar 6 van. Bij function(6) loopt de lijst tot en
met 5, en dat is 15.
b. main telt de twee uitkomsten bij elkaar op: 6 + 15. Het programma drukt dus
21 af.
def main():
"""
Main functie. Roept de andere functies aan om hun werk te doen.
"""
x = function(4) + function(6)
print(x)
def function(x):
lst = list(range(x))
return sum(lst)
main()
21
Opdracht 2¶
a. function zet de omgekeerde string vóór de string zelf. x[::-1] is de
slicing uit week 2 die met stapgrootte -1 van achteren naar voren loopt:
"xo"[::-1] is "ox", dus function("xo") geeft "oxxo" terug.
Bij function("lol") is dat lastiger te zien, want "lol" achterstevoren is
weer "lol". De uitkomst is "lollol", en aan dat ene voorbeeld kun je niet
aflezen dat er iets wordt omgekeerd - het ziet eruit alsof de functie de string
verdubbelt. "xo" laat het verschil wel zien.
b. main plakt de twee resultaten aan elkaar met +, want bij strings betekent
+ aaneenplakken: "lollol" + "oxxo". Het programma drukt dus lolloloxxo af.
def main():
"""
Main functie. Roept de andere functies aan om hun werk te doen.
"""
x = function("lol")
y = function("xo")
print(x + y)
def function(x):
s = x[::-1] + x
return s
main()
lolloloxxo
Opdracht 3¶
a. function1 maakt op dezelfde manier een lijst als function in opdracht 1,
en geeft die omgekeerd terug. list(range(5)) is [0, 1, 2, 3, 4], en daarvan
omgekeerd geeft function1(5) dus [4, 3, 2, 1, 0].
b. function2 deelt de som van een lijst door het aantal elementen, en dat is
het gemiddelde. De volgorde van de lijst maakt daarbij niets uit: omkeren
verandert de som niet, en het aantal elementen ook niet.
c. De som van [4, 3, 2, 1, 0] is 10 en de lijst heeft 5 elementen, dus rekent
function2 10 / 5 uit. Het programma drukt 2.0 af, en niet 2.
Die .0 is geen slordigheid van Python. De operator / geeft altijd een float
terug, ook als de deling precies uitkomt; bij twee ints levert // wél een
int op. Wie hier 2 opschreef heeft het antwoord dus net niet goed: het type
hoort erbij.
def main():
"""
Main functie. Roept de andere functies aan om hun werk te doen.
"""
L = function1(5)
x = function2(L)
print(x)
def function1(x):
L = list(range(x))
return L[::-1]
def function2(L):
x = sum(L)
y = len(L)
return x / y
main()
2.0