Program Arcade Games
With Python And Pygame

Chapter 7: Inleiding tot lists

7.1 Data Types

Video: Introduction to Lists

Tot nu toe hebben we gesproken over vier types of data:

Python kan tonen over welk datatype het gaat door de type functie. Ik geef toe dat deze functie niet de meest waardevolle is in een programma, maar soms het handig zijn tijdens het programmeren of debuggen van je programma. Geef bijvoorbeeld de volgende commando's in via de interactieve IDLE shell. (Maak geen nieuw window want anders werkt het niet)

type(3)
type(3.145)
type("Hi there")
type(True)
Output:
>>> type(3)
<class 'int'>

>>> type(3.145)
<class 'float'>

>>> type("Hi there")
<class 'str'>

>>> type(True)
<class 'bool'>

Het is ook mogelijk om door gebruik te maken van de type om te kijken over welke data het gaat.

x = 3
type(x)

De twee nieuwe datatypes die we bespreken in dit hoofdstuk zijn de lists en de Tuples. Probeer het volgende commando in de interactieve Python Shell en kijk wat er wordt getoont :

type(  (2,3,4,5) )
type(  [2,3,4,5] )

7.2 Werken met lists

Je hebt alvast winkel lijstjes en todo lijstjes gemaakt, maar hoe maak je nu een lijsje op een computer?

fig.grocery_list
Figure 7.1: Zelfs computers gebruiken lijstjes (lists)

Probeer de volgende voorbeelden met IDLE's command line. Om een list te creeren en ze te printen probeer je het volgende :

>>> x = [1,2]
>>> print(x)
[1, 2]

Om slechts 1 element te printen in de reeks (array) :

>>> print(x[0])
1

Dit nummer met de positie van het element noemen we de index. Merk op dat de positie start op nul. Dus een list met 10 elementen geeft geen element op plaats 10. Alleen maar plaatsen van [0] tot [9]. Het kan wel wat verwarrend zijn om een lijstje te hebben met 10 elementen en geen element 10 te hebben, maar computers starten nu eenmaal met tellen vanaf 0 in plaats vanaf 1.

Denk aan een list zoals een ijsblokjeshouder dat getallen bevat zoals in Figuur 7.2. De waarden zijn opgeslagen in elk vakje en op het vakje staat het getal dat de positie van het vakje voorstelt beginnend met nul.

Denk eraan dat er 2 reeksen van getallen zijn waar je met een list mee werkt : De positie en de waarde zelf. De positie wordt ook de index genoemd verwijst naar waar de waarde staat. De waarde is de huidige waarde dat bewaard wordt op die locatie. Wanneer je met een array(reeks) werkt is het dus belangrijk te weten dat je zowel een locatie als een waarde nodig hebt.

Het is gemakkelijk om de waarde te geven als je een locatie hebt, maar het is veel moeilijker om een locatie te geven als je alleen maar de waarde hebt. Hoofdstuk 16 behandeld het antwoord hoe je de locatie vindt als je alleen maar de waarde hebt.

fig.ice_cube_tray
Figure 7.2: Lists zijn zoals ijsblokjeshouders

Een programma kan nieuwe waarden toewijzen tot individuele elementen van een list. In het voorbeeld hieronder wordt de waarde van het element op de eerste plaats (locatie nul en niet 1) op het getal 22 gezet.

>>> x[0] = 22
>>> print(x)
[22, 2]

Daarnaast kan een programma ook een “tuple” aanmaken. Dit data type werkt net zoals een list, maar er zijn twee verschillen. Eerst en vooral worde, tuples aangemaakt met ronde haakjes in plaats van met vierkante haken. Ten tweede is het niet mogelijk om de tuple te wijzigen eenmaal deze werd gecreerd. Zie hieronder :

>>> x = (1,2)
>>> print(x)
(1, 2)
>>> print(x[0])
1
>>> x[0] = 22
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    x[0] = 22
TypeError: 'tuple' object does not support item assignment
>>>

Zoals je kan zien aan de output hierboven, kunnen we een element van een tuple geen nieuwe waarde toekennen. Waarom willen we dan dergelijke beperkingen? Eerst is het zo dat een computer veel sneller kan werken als hij weet dat de waarden niet gaan wijzigen. Ten tweede wil je soms dat lijstjes niet wijzigen, zoals bijvoorbeeld de lijst met RGB kleuren. De kleur rood zal nooit wijzigen en dan is het beter om voor een onveranderlijke tuple te kiezen.

Een array of reeks is een lijst van objecten. Het is een belangrijke data structuur in de informatica. Het “list” data type in Python is heel gelijkaardig met een array data structure in de informatica.

7.3 Herhalingen door een list

Video: Herhalingen door een list

Wanneer een programma door een lijst moet gaan om deze bijvoorbeeld te printen, dan zijn er twee manieren om dit te doen met een for lus.

De eerste manier is door te herhalen voor elk element in de lus door middel van een “for-each” lus. Deze manier neemt de lus en gaat via de code element per element door de lijst. Je neemt telkens een copy van het element en bewaard dit in een andere variabele om ze nadien te verwerken.

De format van het commando ziet er als volgt uit :
for item_variable in list_name:

Hier zijn enkele voorbeelden :

my_list = [101,20,10,50,60]
for item in my_list:
    print( item )
Output:
101
20
10
50
60

Programma kunnen strings ook bewaen in lists :

my_list = ["lepel", "vork", "mes"]
for item in my_list:
    print(item)
Output:
lepel
vork
mes

Lists kunnen zelf andere lists bevatten. Deze herhaling gaat door elk element van de hoofdlijst, mar niet van de sublijst.

my_list = [ [2,3], [4,3], [6,7] ]
for item in my_list:
    print(item)
Output:
[2,3]
[4,3]
[6,7]

De andere manier om door een lijst te gaan is met de index variabele en dan kan je meteen de lijst gebruiken in plaats van deze te copieren naar een variabele. Om de index variabele te gebruiken telt het programma van 0 tot het aantal elementen in de list. Als er 10 elementen zijn dan moet de lus van 0 tot 9 door de lijst gaan.

De lengte van een list kan he vinden door gebruik te maken van de len functie. Wanneer je dat combineert met de range functie kan je door de volledige lijst gaan.

my_list = [101,20,10,50,60]
for i in range( len(my_list) ):
    print( my_list[i] )
Output:
101
20
10
50
60

Deze manier is moeilijker, maar ook krachtiger. Omdat er meteen met de elementen van de lijst gewerkt wordt in plaats van met een copy. Je kan ook de inhoud van de lijst meteen aanpassen terwijl je dit mer de for-each lus niet kan.

7.4 Toevoegen aan een list

Nieuwe items kan je toevoegen aan een list ( maar niet aan een tuple) door gebruik te maken van het append commando. Bijvoorbeeld :

my_list = [2,4,5,6]
print(my_list)
my_list.append(9)
print(my_list)
Output:
[2,4,5,6]
[2,4,5,6,9]
Video: Toevoegen aan een list

Bemerking : Wanneer performantie (snelheid) bij het toevoegen belangrijk is, is het zeer belangrijk om te weten hoe een list werkt. Bijvoorbeeld. Wanneer een list werkt als een array data type, dan is het toevoegen van een element tot een list gelijkaardig is als het plaatsen van een nieuw ei bij een vol karton eieren. Eerst moet er een nieuw karton gemaakt worden met 13 plaatsen, dan moeten de 12 eieren verplaatst worden naar het nieuwe karton, dan kan het nieuwe ei erbij geplaatst worden, en dan mag het oude karton weg. Omdat deze acties allemaal verwerkt zitten in de functie, vergeet de programmeur dat dit veel werk is voor de computer. Het zou veel eenvoudiger zijn indien de computer over een karton met genoeg plaats. Gelukkig werkt de list van Python niet als een arrau data type, maar het is belangrijk om de nodige aandacht te besteden aan performantie bij data structuren.

Om een nieuwe list aan te maken is het noodzakelijk om met een lege list te vertrekken en deze daarna op te vullen met de append functie.

my_list = [] # Empty list
for i in range(5):
    userInput = input( "Geef een geheel getal : ")
    userInput = int( userInput )
    my_list.append(userInput)
    print(my_list)
Output:
Enter an integer: 4
[4]
Enter an integer: 5
[4, 5]
Enter an integer: 3
[4, 5, 3]
Enter an integer: 1
[4, 5, 3, 1]
Enter an integer: 8
[4, 5, 3, 1, 8]

Wanneer een programma een reeks nodig heeft met bepaalde lengte, en waar de elementen allemaal dezelfde waarde moeten hebben kan je dit met een simpele truc :

# Maak een reeks met 100 nullen.
my_list = [0] * 100

7.5 Optellen of wijzigen van een list

Video: Optellen van een list

Het maken van een totaal van een reeks getallen is een veelvoorkomende bewerking. Hier wordt getoont hoe het moet :

# Copieer de reeks naar sum
myArray = [5,76,8,5,3,3,56,5,23]

# De som moet eerst geinitialiseerd worden
arrayTotal = 0

# Herhaal van 0 tot en met het aantal elementen 
# in de reeks : 
for i in range( len(myArray) ):
	# Tel element 0, next 1, then 2, etc. erbij
	arrayTotal += myArray[i]
	
# Print Het resultaat
print( arrayTotal )

Hetzelfde kan worden gedaan door gebruik te maken van de for lus :

# Copieer de reeks naar een totaal
myArray = [5,76,8,5,3,3,56,5,23]

# Het totaal moet eerst geinitialiseerd worden
arrayTotal = 0

# Ga door de reeks en copieer elk item naar een variabele item
# Tel dan de variabele item bij het totaal.
for item in myArray:
	# Add each item
	arrayTotal += item
	
# Print het resultaat
print( arrayTotal )

De getallen in een reeks kunnen ook gewijzigd worden met een for lus :

# Copier de array die gewijzigd moet worden.
myArray = [5,76,8,5,3,3,56,5,23]

# Herhaal van 0 tot het aantal elementen 
# in de reeks :
for i in range( len(myArray) ):
	# Wijzig het element door het te verdubbelen
	myArray[i] = myArray[i] * 2
	
# Print het resultaat 
print( myArray )

Hoewel versie 2 zal niet werken om de waarden te verdubbelen in de reeks. Waarom? Omdat item een copy is van het element van de reeks. De code hierboven verdubbeld de copy, maar de originele array (reeks) blijft onveranderd.

# Copieer de array om te wijzigen
myArray = [5,76,8,5,3,3,56,5,23]

# Ga door elk element in myArray
for item in myArray:
	# Deze verdubbeld het item, maar wijzigt niet de array
	# omdat item een copy is van 1 enkel element.
	item = item * 2
	
# Print het resultaat
print( myArray )

7.6 Splitsen van strings

Video: splitsen van strings

Strings zijn eigenlijk lists van characters. Ze kunnen behandeld worden als lists waarbij elke letter een apart item is. Laat de volgende code lopen met beide versies van x :

x = "This is a sample string"
#x = "0123456789"

print("x=",x)

# Benader een enkel character
print("x[0]=",x[0])
print("x[1]=",x[1])

# Benaderen van de rechterkant
print("x[-1]=",x[-1])

# Benader 0-5
print("x[:6]=",x[:6])
# Benader 6
print("x[6:]=",x[6:])
# Benader 6-8
print("x[6:9]=",x[6:9])

Strings in Python kunnen ook gebruikt worden met sommige wiskundige bewerkingen. Probeer de volgende code en kijk wat er gebeurt :

a = "Hi"
b = "There"
c = "!"
print(a + b)
print(a + b + c)
print(3 * a)
print(a * 3)
print((a * 2) + (b * 2))

Het is mogelijkom de lengte te bepalen van een string. En het is mogelijk om te weten welk type array het is.

a = "Hi There"
print(len(a))

b = [3,4,5,6,76,4,3,3]
print(len(b))

Omdat een string een array is, kan je het programma laten herhalen voor elke letter van een string net zoals bij een array :

for character in "This is a test.":
    print (character)

Oefening : Start met de volgende code :

months = "JanFebMarAprMayJunJulAugSepOctNovDec"

n = int(input("Geef de naam van de maand: "))

Print de drie letter afkorting van de maand dat de gebruiker heeft ingetypt. (Bereken de startpositie van de string en gebruik dan de info die we juist hebben gezien om de string correct af te printen).

7.7 Geheime codes

Deze code print elke letter van een string individueel :

plain_text = "This is a test. ABC abc"

for c in plain_text:
    print (c, end=" ")
Video: Geheime codes

Computers bewaren niet alle letters van een string in hun geheugen. Computers bewaren reeksen van getallen. Elk getal vormt een letter. De tabel dat de computer gebruikt om de getallen om te zetten in letters is het American Standard Code for Information Interchange(ASCII). Daarnaast zijn er nog andere tabellen met andere internationale characters (cyrilisch, kanji,...) Standaard gebruikt Python ASCII.

De ASCII characters gaan van 0-255. Elke letter vertegenwoordigt 1 byte in het geheugen. Hieronder kan je een deel van de ASCII tabel vinden :

WaardeCharWaardeCharWaardeCharWaardeChar
40(61=82R103g
41)62>83S104h
42*63?84T105i
43+64@85U106j
44,65A86V107k
45-66B87W108l
46.67C88X109m
47/68D89Y110n
48069E90Z111o
49170F91[112p
50271G92\113q
51372H93]114r
52473I94^115s
53574J95_116t
54675K96`117u
55776L97a118v
56877M98b119w
57978N99c120x
58:79O100d121y
59;80P101e122z
60<81Q102f

Voor meer informatie rond ASCII :
http://en.wikipedia.org/wiki/ASCII

De volgende code converteert elke letter van het vorige voorbeeld in een ascii waarde.

plain_text = "This is a test. ABC abc"

for c in plain_text:
    print (ord(c), end=" ")

Het volgende programma neemt elke ASCII waarde en telt er eentje bij, en print de nieuwe ASCIIwaarde en converteert opnieuw naar de waarde van de letter.

plain_text = "This is a test. ABC abc"

for c in plain_text:
    x = ord(c)
    x = x + 1
    c2 = chr(x)
    print (c2, end="")

De volgende code neemt elke ASCII waarde en telt er eentje bij, en converteert dan de waarde opnieuw naar een letter.

fig.encryption
# Sample Python/Pygame Programs
# Simpson College Computer Science
# http://programarcadegames.com/
# http://simpson.edu/computer-science/

# Explanation video: http://youtu.be/sxFIxD8Gd3A

plain_text = "This is a test. ABC abc"

encrypted_text = ""
for c in plain_text:
    x = ord(c)
    x = x + 1
    c2 = chr(x)
    encrypted_text = encrypted_text + c2
print(encrypted_text)

Tenslotte neemt de laatste code elke ASCII waarde en trekt er eentje af, en converteert opnieuw naar een letter. Wanneer je de output neemt van het vorig programma als input van dit programma heb je een decoder gemaakt om de string opnieuw te ontcijferen dat in de vorige oefening werd geencrypteerd.

fig.decryption
# Sample Python/Pygame Programs
# Simpson College Computer Science
# http://programarcadegames.com/
# http://simpson.edu/computer-science/

# Explanation video: http://youtu.be/sxFIxD8Gd3A

encrypted_text = "Uijt!jt!b!uftu/!BCD!bcd"

plain_text = ""
for c in encrypted_text:
    x = ord(c)
    x = x - 1
    c2 = chr(x)
    plain_text = plain_text + c2
print(plain_text)

7.8 Associatieve Arrays

Python is niet gelimiteerd to het gebruik van getallen als array index. Het is ook mogelijk om een associatieve array te gebruiken. Hier is de index geen getal maar vb een string. Een associatizve array werkt als volgt :

# Maak een lege associatieve array
# Let op de accolades
x = {}

# Voeg verschillende elementen toe
x["fred"] = 2
x["scooby"] = 8
x["wilma"] = 1

# Zoek het element en print het af
print(x["fred"])

Je zal in dit boek geen associatieve arrays nodig hebben, maar weet dat het bestaat en dat het mogelijk is.

7.9 Herhaling

7.9.1 Multiple Choice Kwis

Click here for a multiple-choice quiz.

7.9.2 Korte inhoud werkblad

Click here for the chapter worksheet.

7.9.3 Oefening

Click here for the chapter lab.


You are not logged in. Log in here and track your progress.