Program Arcade Games
With Python And PygameChapter 7: Inleiding tot lists
7.1 Data Types
Tot nu toe hebben we gesproken over vier types of data:
- String (een string is de afkorting van “string (reeks) van characters,” wat normale mensen aanzien als tekst.)
- Integer (geheel getal)
- Floating point (reeel getal)
- Boolean (Booleaans getal)
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?
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.
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
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] |
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
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
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=" ")
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 :
Waarde | Char | Waarde | Char | Waarde | Char | Waarde | Char |
40 | ( | 61 | = | 82 | R | 103 | g |
41 | ) | 62 | > | 83 | S | 104 | h |
42 | * | 63 | ? | 84 | T | 105 | i |
43 | + | 64 | @ | 85 | U | 106 | j |
44 | , | 65 | A | 86 | V | 107 | k |
45 | - | 66 | B | 87 | W | 108 | l |
46 | . | 67 | C | 88 | X | 109 | m |
47 | / | 68 | D | 89 | Y | 110 | n |
48 | 0 | 69 | E | 90 | Z | 111 | o |
49 | 1 | 70 | F | 91 | [ | 112 | p |
50 | 2 | 71 | G | 92 | \ | 113 | q |
51 | 3 | 72 | H | 93 | ] | 114 | r |
52 | 4 | 73 | I | 94 | ^ | 115 | s |
53 | 5 | 74 | J | 95 | _ | 116 | t |
54 | 6 | 75 | K | 96 | ` | 117 | u |
55 | 7 | 76 | L | 97 | a | 118 | v |
56 | 8 | 77 | M | 98 | b | 119 | w |
57 | 9 | 78 | N | 99 | c | 120 | x |
58 | : | 79 | O | 100 | d | 121 | y |
59 | ; | 80 | P | 101 | e | 122 | z |
60 | < | 81 | Q | 102 | f |
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.
# 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.
# 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.
English version by Paul Vincent Craven
Spanish version by Antonio Rodríguez Verdugo
Russian version by Vladimir Slav
Turkish version by Güray Yildirim
Portuguese version by Armando Marques Sobrinho and Tati Carvalho
Dutch version by Frank Waegeman
Hungarian version by Nagy Attila
Finnish version by Jouko Järvenpää
French version by Franco Rossi
Korean version by Kim Zeung-Il
Chinese version by Kai Lin