Python basis

Loops en lists

Vaak komt het voor dat je een bewerking wilt uitvoeren op alle elementen in een list. Als je een list print, dan zie je ook de haken van de list en komma's tussen de elementen. Stel dat je alle elementen gewoon onder elkaar wilt printen, hoe gaat dat?

tovenaars = ['tita', 'merlin', 'hans klok']
print(tovenaars)

# output
['tita', 'merlin', 'hans klok']

Hieronder worden de tovenaars 1 voor 1 in een loop getoond op het scherm.

for tovenaar in tovenaars:
    print(tovenaar)
 
#output
tita
merlin
hans klok

In de regel for tovenaar in tovenaars wordt voor alle tovenaars 1 voor 1 een waarde aan de variabele tovenaar toegekend. Je noemt dit een 'loop' omdat deze actie net zo lang wordt herhaald totdat alle elementen in tovenaars een keer aan de beurt zijn geweest.

Je ziet dat de regel print(tovenaar) iets van de kant af staat. Deze regel is ingesprongen. In Python betekent dit dat de print-opdracht is ingebed in de for-loop. Hier moet je goed op letten, want Python is streng. Als je slordig omgaat met inspringingen dan krijg je foutmeldingen.

counter = 0
for tovenaar in tovenaars:
    counter += 1
    # Dit is hetzelfde als counter = counter + 1
    # counter wordt dus steeds 1 meer in de loop

    print(tovenaar.title())
    print(f"{ tovenaar.title() } is tovenaar { counter }")
    # Je kunt meerdere opdrachten uitvoeren in een loop!
print("Zo, dat was het")

Zoals je ziet wordt alle code die is ingesprongen herhaald in de for-loop. Als laatste wordt nog "Zo, dat was het" getoond. Dit is niet ingesprongen. Het valt buiten de loop en wordt na de loop maar 1 keer uitgevoerd. De : in de eerste regel can de for-loop en de inspringing bepalen waar de code in de loop begint en waar die eindigt.

Code herhalen zonder list

Je kunt ook zelf definiƫren hoe vaak een loop moet worden gebruikt. Hieronder een voorbeeld:

for v in range(1, 3):
    print(v)

#output
1
2

Met range() kun je aangeven hoe vaak de code in de for-loop moet worden herhaald. De variabele v krijgt steeds de eerstvolgende waarde uit de range. Je ziet dat de loop maar 2x wordt uitgevoerd. De eerste waarde in range wordt getoond, maar de laatste niet!

Je kunt ook nummers overslaan in een range...

for v in range(2, 8, 2):
    print(v)

#output
2
4
6

Het derde argument in de functie range() bepaalt hoeveel er wordt opgeteld bij huidig getal. De eerste keer wordt 2 weergegeven. Bij 2 wordt 2 opgeteld, dus wordt 4 weergegeven etc. etc. Het laatste getal 8 wordt niet meer weergegeven!

Berekeningen in een loop

Je kunt de variabele v gebruiken om berekeningen mee uit te voeren. Onderstaand voorbeeld laat zien hoe je iedere v kunt vermenigvuldigen met zichzelf (kwadraat). Het resultaat wordt toegevoegd aan een list!

# Een lege list maken
lst = []

for v in range(2, 8, 2):
    # kwadraat van zichzelf
    lst.append(v ** 2)

print(lst)
    
#output
[4, 16, 36]

List comprehensions

Bovenstaand voorbeeld kun je ook nog korter weergeven. Python heeft hiervoor de list comprehension. Je kunt tussen de rechte haken van een list een klein stukje code opnemen waarmee je de list genereert...

kwadraten = [v ** 2 for v in range(2, 8, 2)]
print(kwadraten)

#output
[4, 16, 36]

Lists to copy or not to copy

Bekijk onderstaande code...

a =[1, 2, 3]
b = a
b[2] = 4
print(a)

#output
[1, 2, 4]

Wat gebeurt hier? Er wordt een lijst a gemaakt. b wordt gelijk aan a. b wordt veranderd, maar uit de print-opdracht blijkt dat a ook is veranderd! De opdracht b = a levert alleen een verwijzing op in plaats van een kopie. a en b verwijzen beide naar dezelfde list!

Lists slicen

We herhalen het bovenstaande nog een keer maar met 1 klein verschil..

a =[1, 2, 3]
b = a[:]
b[2] = 4
print(a)

#output
[1, 2, 3]

Door de toevoeging van [:] wordt er wel een echte kopie gemaakt van a! Met de [:]-syntax kun je met een gedeelte van een list een nieuwe list maken. Met [:] geef je aan dat je van alle elementen in een bestaande list een nieuwe list wilt maken.
Als je alle elementen vanaf het 1e element in de list wil hebben dan doe je dat zo...

my_lst = [1, 2, 3, 4]
nw_list = my_lst[1:]
print(nw_list)

#output
[2, 3, 4]

Alle elementen tot aan list-element 4...

my_lst = [1, 2, 3, 4]
nw_list = my_lst[:3]
print(nw_list)

#output
[1, 2, 3]

Alle elementen vanaf 1 tot 4

my_lst = [1, 2, 3, 4]
nw_list = my_lst[1:3]
print(nw_list)

#output
[2, 3]