Opstap

Deze pagina bevat uitvoerbare code.

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