{"id":6166,"date":"2012-11-05T20:32:59","date_gmt":"2012-11-06T01:32:59","guid":{"rendered":"http:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=6166"},"modified":"2014-11-24T08:39:35","modified_gmt":"2014-11-24T13:39:35","slug":"14-methods-nl","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/14-methods-nl\/","title":{"rendered":"14: Methoden"},"content":{"rendered":"<p>Tot zover hebben we een tweetal data structuren in Python laten zien: strings en lijsten. Elk ervan kent meerdere <em>methoden<\/em>, die een variant zijn op functies.<\/p>\n<p>Zo is bijvoorbeeld <code>reverse()<\/code>\u00a0een methode bij een lijst. Zoals de naam suggereert draait deze methode de lijst om. Zo wordt bijvoorbeeld het eerste element van de lijst de laatste en omgekeerd). Je roept een methode aan door de punt (<code>.<\/code>) structuur te gebruiken zoals bijvoorbeeld in:<\/p>\n<p><code>\u00abobjectNaam\u00bb.\u00abmethodeNaam\u00bb(\u00ablijst met argumenten, mogelijk leeg\u00bb)<\/code><\/p>\n<p>Ter vergelijking, de syntax die we eerder gezien hebben bij functies:<\/p>\n<p><code>\u00abfunctieNaam\u00bb(\u00ablijst met argumenten, mogelijk leeg\u00bb)<\/code><\/p>\n<p>Hier volgt een voorbeeld van een aanroep van de\u00a0methode <code>reverse<\/code> die werkt op een lijst.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform0\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox0'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Een lijst omdraaien.<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 84px;'><textarea wrap='off' name='usercode0' id='usercode0'  cols=10 rows=3 readonly='readonly'  style = 'height : 84px;'  class='pyboxCode RO'>\nL = [1, 2, 3, 4, 5]\nL.reverse()\nprint(L)<\/textarea><\/div>\n<div id='pbhistory0' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit0' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(0)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(0,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse0\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"0\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"a68c9120529207772697ad707aa355dd\"\/>\n<div id='pbresults0' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit0\").value = \"Run program\";document.getElementById(\"inputInUse0\").value = \"N\";<\/script>\n<\/p>\n<p>Een voorbeeld van een methode met een argument is\u00a0<code>str.startswith<\/code>:<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform1\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox1'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Een string methode.<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 58px;'><textarea wrap='off' name='usercode1' id='usercode1'  cols=10 rows=2 readonly='readonly'  style = 'height : 58px;'  class='pyboxCode RO'>\nprint('piece of cake'.startswith('pie'))\nprint('red'.startswith('blue'))<\/textarea><\/div>\n<div id='pbhistory1' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit1' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(1)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(1,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse1\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"1\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"0df932323286e8bc030de657906c3b21\"\/>\n<div id='pbresults1' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit1\").value = \"Run program\";document.getElementById(\"inputInUse1\").value = \"N\";<\/script>\n<\/p>\n<h2>Veel methoden.<\/h2>\n<p>Hieronder zullen we de meest voorkomende methoden voor strings en lijsten noemen. Het gaat hierbij om taken die je ook zelf wel kunt schrijven, maar het gebruik van standaard methoden heeft het voordeel dat het je programma makkelijker leesbaar maakt om te lezen en ook makkelijker om je programma aan te passen.<\/p>\n<h3>Lijsten<\/h3>\n<p>De volgende methoden veranderen de lijst niet:<\/p>\n<ul>\n<li><code>list.index(X)<\/code>: zoekt\u00a0<code>X<\/code> in de lijst. In het bijzonder geeft het een <code>i<\/code> terug zodanig dat <code>list[i]==X<\/code>\u00a0terwijl het alle elementen doorzoekt. De kleinst mogelijke\u00a0<code>i<\/code> wordt teruggegeven. Wanneer\u00a0<code>X<\/code>\u00a0niet voorkomt in de lijst wordt er een <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/console\/?consolecode=L%3D%5B0%2C%201%2C%202%5D%0Aprint%28L.index%283%29%29\" target=\"_blank\"><code>ValueError<\/code><\/a> veroorzaakt.\n<ul>\n<li><code>X in list<\/code>\u00a0geeft\u00a0<code>True<\/code>\u00a0terug wanneer\u00a0<code>X<\/code>\u00a0een element van de lijst is, anders\u00a0<code>False<\/code>. Door hiervan gebruik te maken wordt een\u00a0<code>ValueError<\/code>\u00a0vermeden. (Merk op dat\u00a0<code>in<\/code>\u00a0een operator is, geen methode.)<\/li>\n<\/ul>\n<\/li>\n<li><code>list.count(X)<\/code>: geeft terug het aantal keren dat <code>X<\/code>\u00a0voorkomt in de lijst<\/li>\n<\/ul>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform2\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox2'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Lijst methoden.<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 110px;'><textarea wrap='off' name='usercode2' id='usercode2'  cols=10 rows=4 readonly='readonly'  style = 'height : 110px;'  class='pyboxCode RO'>\nL = [3, 1, 4, 1, 5, 9]\nprint(L.index(9))\nprint(L[L.index(3)])\nprint(L.count(1))<\/textarea><\/div>\n<div id='pbhistory2' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit2' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(2)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(2,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse2\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"2\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"9993f511a43e0c4b83307fc954f7eeb2\"\/>\n<div id='pbresults2' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit2\").value = \"Run program\";document.getElementById(\"inputInUse2\").value = \"N\";<\/script>\n<\/p>\n<p>De volgende methoden passen de lijst aan:<\/p>\n<ul>\n<li><code>list.append(X)<\/code>\u00a0voegt\u00a0<code>X<\/code> toe aan het van de lijst<\/li>\n<li><code>list.insert(i, X)<\/code> voegt\u00a0<code>X<\/code>\u00a0toe op positie <code>i<\/code><\/li>\n<li><code>list.extend(L)<\/code> voegt een lijst <code>L<\/code>\u00a0toe als elementen aan het eind van de lijst<\/li>\n<li><code>list.remove(X)<\/code> verwijdert het eerste voorkomen van\u00a0<code>X<\/code><\/li>\n<p> in de lijst<\/p>\n<li><code>list.pop(i)<\/code>\u00a0verwijdert &amp; geeft terug\u00a0<code>list[i]<\/code>, terwijl\u00a0<code>list.pop()<\/code> verwijdert &amp; geeft terug het laatste element<\/li>\n<li><code>del list[i]<\/code> verwijdert het <code>i<\/code>-de element van\u00a0<code>list<\/code> (`merk op dat dit een\u00a0\"<code>del<\/code> statement\" is, geen methode)<\/li>\n<li><code>list.reverse()<\/code>\u00a0keert de liist om<\/li>\n<li><code>list.sort()<\/code>\u00a0sorteert de lijst<\/li>\n<\/ul>\n<p>Alle methoden, behalve\u00a0<code>pop<\/code>\u00a0geven\u00a0<code>None<\/code>\u00a0terug. Sommige van deze functies kunnen ook worden aangeroepen met iets andere argumenten; voor een compleet overzicht bekijk je de sectie\u00a0<a href=\"http:\/\/docs.python.org\/py3k\/library\/stdtypes.html#mutable-sequence-types\">lijst methoden<\/a>\u00a0in de Python documentatie. Bij lijsten kunnen \"slices\"  (sublijsten) worden ingevoegd en verwijderd, vergelijkbaar met de\u00a0<code>string[x:y:z]<\/code> notatie die we in\u00a0<a href=\"\/7a-strings\/\">voorgaande lessen<\/a>\u00a0zijn tegengekomen.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform3\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox3'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Coding Exercise: <\/span><span class='title'>De vervangingen<\/span><\/div>Gebruik\u00a0<code>index<\/code>\u00a0en andere lijst methoden om een functie\u00a0<code>replace(list, X, Y)<\/code>\u00a0te schrijven die alle\u00a0<code>X-<\/code>en die voorkomen in\u00a0<code>list<\/code>\u00a0vervangt door\u00a0<code>Y<\/code>. Bijvoorbeeld, wanneer \u00a0<code>L = [3, 1, 4, 1, 5, 9]<\/code>\u00a0dan zal\u00a0<code>replace(L, 1, 7)<\/code>\u00a0bovengenoemde lijst\u00a0<code>L<\/code>\u00a0omzetten in\u00a0<code>[3, 7, 4, 7, 5, 9]<\/code>. Om deze oefening uitdagender te maken, <em>mag je\u00a0<strong>geen<\/strong><\/em>\u00a0<code>[]<\/code>\u00a0gebruiken.<br\/>Merk op dat je geen\u00a0<code>return<\/code>. hoeft te gebruiken<a class=\"hintlink\"  id=\"hintlink4\">Hint<\/a><div class=\"helpOuter\" style=\"display: none;\"><div class=\"helpInner\"><div style=\"text-align: center\">You need to create an account and log in to ask a question.<\/div><\/div><\/div><div class='pyboxTextwrap pyboxCodewrap RW resizy'  style='height: 526px;'><textarea wrap='off' name='usercode3' id='usercode3'  cols=10 rows=20   class='pyboxCode RW'>\ndef replace(list, X, Y):\n# delete this comment and enter your code here\n<\/textarea><\/div>\n<div id='pbhistory3' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput3\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<input type='hidden' id='defaultCode3' value='def replace(list, X, Y):\\n'><\/input>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit3' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch3\" value=\"Input Switch\" onclick=\"pbInputSwitch(3,'Y')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(3)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(3,'Y')\" ><\/td>\n<\/tr><\/table><select id='pbSelect3' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(3,'14.replace')\" >History<\/option>\n<option name='default' data-pbonclick=\"pbSetText(3,descape($('#defaultCode3').val()))\" >Reset code to default<\/option>\n<option name='help' data-pbonclick=\"helpClick(3);\" >Help<\/option>\n<\/select><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse3\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"3\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"6dcd666ff83547f8053e3f17d79f8735\"\/>\n<div id='pbresults3' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>jQuery(function(){pbToggleCodeMirror(3);});pbInputSwitch(3,\"Y\");<\/script>\n<\/p>\n<h2>Strings<\/h2>\n<p>Evenzo als bij lijsten, kun je\u00a0<code>in<\/code>,\u00a0<code>index<\/code>\u00a0en\u00a0<code>count<\/code>\u00a0ook gebruiken bij strings. Ze zijn zelfs sterker, omdat ze ook met substrings werken en niet alleen voor individuele karakters werken:<\/p>\n<ul>\n<li><code>S in T<\/code>\u00a0geeft een Boolean (True of False) wanneer string <code>S<\/code>\u00a0een substring is van string <code>T<\/code><\/li>\n<li><code>S.index(T)<\/code>\u00a0geeft de eerste index van\u00a0<code>S<\/code> waar de substring\u00a0<code>T<\/code>\u00a0begint<\/li>\n<li><code>S.count(T)<\/code> geeft het aantal keren dat T\u00a0niet overlappend voorkomt als substring van\u00a0<code>S<\/code><\/li>\n<\/ul>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform5\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox5'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div><code>index<\/code>\u00a0en\u00a0<code>count<\/code> gebruiken bij strings.<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 84px;'><textarea wrap='off' name='usercode5' id='usercode5'  cols=10 rows=3 readonly='readonly'  style = 'height : 84px;'  class='pyboxCode RO'>\nprint(\"marmalade\".count(\"ma\"))\nprint(\"find a substring\".index(\"substring\"))\nprint(\"key\" in \"monkey\")<\/textarea><\/div>\n<div id='pbhistory5' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit5' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(5)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(5,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse5\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"5\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"261274ce2beec2490b6df7b6e4facb2d\"\/>\n<div id='pbresults5' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit5\").value = \"Run program\";document.getElementById(\"inputInUse5\").value = \"N\";<\/script>\n<\/p>\n<p>Hier volgen een paar nuttige <code>str<\/code> methoden:<\/p>\n<ul>\n<li>Over hoofdletters en kleine letters: <code>capitalize, lower, upper, islower, isupper<\/code><\/li>\n<li>Karakters (letters, cijfers en tekens): <code>isalpha, isdigit<\/code><\/li>\n<li>Uitlijnen: <code>center, ljust, rjust<\/code>; <code>strip<\/code>\u00a0verwijdert het uitlijnen<\/li>\n<li>Substrings:\u00a0<code>endswith, startswith, find, replace<\/code><\/li>\n<li>Parsing: <code>split, splitlines<\/code><\/li>\n<\/ul>\n<p>We zullen ze, wanneer nodig, meer in detail introduceren . Een complete gedetailleerde lijst met\u00a0<a href=\"http:\/\/docs.python.org\/py3k\/library\/stdtypes.html#string-methods\">string methoden<\/a>\u00a0staat in de Python documentatie.<\/p>\n<p><strong>Strings zijn onveranderbaar<\/strong>. We noemden reeds <code>list.reverse()<\/code>\u00a0die de volgorde van een lijst verandert door het om te keren, maar er bestaat geen\u00a0<code>str.reverse()<\/code> methode. Dat is vanwege het feit dat string objecten niet kunnen worden aangepast zodra ze gemaakt zijn. In les 17 zullen we er meer over vertellen.<\/p>\n<p>Hier volgt een voorbeeld van een string methode: <code>S.replace(old, new)<\/code>\u00a0dat een veranderde versie van\u00a0<code>S<\/code>\u00a0teruggeeft waarbij iedere substring van\u00a0<code>old<\/code>\u00a0is vervangen door\u00a0<code>new<\/code>. Dit heeft een nieuwe string tot gevolg zonder dat de de oude wordt aangepast:<br \/>\n<form class=\"pbform\" action=\"#\" id=\"pbform6\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox6'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Voorbeeld: <code>replace<\/code>\u00a0geeft een nieuwe string terug, maar verandert niet de oude.<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 110px;'><textarea wrap='off' name='usercode6' id='usercode6'  cols=10 rows=4 readonly='readonly'  style = 'height : 110px;'  class='pyboxCode RO'>\nname = 'Bob Jones'\nnewName = name.replace('Bob', 'Robert')\nprint(name)\nprint(newName)<\/textarea><\/div>\n<div id='pbhistory6' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit6' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(6)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(6,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse6\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"6\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"c3953c67584745ca9939e83eeb7dcd45\"\/>\n<div id='pbresults6' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit6\").value = \"Run program\";document.getElementById(\"inputInUse6\").value = \"N\";<\/script>\n<\/p>\n<p>Bij de volgende oefening zijn de volgende methoden nuttig:<\/p>\n<ul>\n<li><code>str.replace<\/code>, die we zojuist hebben besproken<\/li>\n<li>de Boolse methode\u00a0<code>str.isalpha()<\/code>\u00a0die\u00a0<code>True<\/code>\u00a0teruggeeft wanneer\u00a0<code>str<\/code>\u00a0een string (of karakter) is die alleen bestaat uit letters<\/li>\n<li>de Boolse methode\u00a0<code>str.isdigit()<\/code>\u00a0die\u00a0<code>True<\/code>\u00a0teruggeeft wanneer\u00a0<code>str<\/code>\u00a0een string (of karakter) is die alleen bestaat uit cijfers<\/li>\n<li><code>str.upper()<\/code>\u00a0die een versie van\u00a0<code>str<\/code>\u00a0teruggeeft in hoofdletters.<\/li>\n<\/ul>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform7\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox7'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Coding Exercise: <\/span><span class='title'>Postcode in Canada<\/span><\/div>Definieer een functie <code>postalValidate(S)<\/code>\u00a0die eerst nagaat of\u00a0<code>S<\/code>\u00a0een <em>toegestane Canadese<\/em>\u00a0 postcode is: <\/p>\n<ul> \t<\/p>\n<li>verwijder eerst alle spaties;<\/li>\n<p> \t<\/p>\n<li>de rest moet van de vorm\u00a0<code>L#L#L#<\/code> zijn waarbij\u00a0<code>L<\/code>\u00a0letters zijn ( kleine letters of hoofdletters) en\u00a0<code>#<\/code>\u00a0cijfers zijn.<\/li>\n<p> <\/ul>\n<p> Wanneer\u00a0<code>S<\/code>\u00a0geen geen toegestane Canadese postcode is, geef je de Boolean\u00a0<code>False<\/code>\u00a0terug. Wanneer S dat wel is geef dan dezelfde postcode terug maar dan in een fraai format <code>L#L#L#<\/code> waarbij elke\u00a0<code>L<\/code>\u00a0een hoofdletter is.<div class=\"helpOuter\" style=\"display: none;\"><div class=\"helpInner\"><div style=\"text-align: center\">You need to create an account and log in to ask a question.<\/div><\/div><\/div><div class='pyboxTextwrap pyboxCodewrap RW resizy'  style='height: 526px;'><textarea wrap='off' name='usercode7' id='usercode7'  cols=10 rows=20   class='pyboxCode RW'>\n# delete this comment and enter your code here\n<\/textarea><\/div>\n<div id='pbhistory7' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput7\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit7' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch7\" value=\"Input Switch\" onclick=\"pbInputSwitch(7,'Y')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(7)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(7,'Y')\" ><\/td>\n<\/tr><\/table><select id='pbSelect7' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(7,'14.postal')\" >History<\/option>\n<option name='help' data-pbonclick=\"helpClick(7);\" >Help<\/option>\n<\/select><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse7\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"7\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"abfd38f9f4c940e5dd6b706a735ac8a1\"\/>\n<div id='pbresults7' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>jQuery(function(){pbToggleCodeMirror(7);});pbInputSwitch(7,\"Y\");<\/script>\n<\/p>\n<p><table class='pywarn'><tr><td class='pywarnleft'><img src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/warning.png'\/><\/td><td class='pywarnright'><span> De rest van deze les is wat technisch van aard en bevat geen vereiste voorkennis voor de rest van de lessen. <\/span><\/td><\/table><\/p>\n<h3>Meer over objecten<\/h3>\n<p>Wanneer je meer over Python leert, zul je nog meer soorten classes (klassen) tegenkomen dan strings en lijsten. Andere die je waarschijnlijk ook nuttig zult vinden zijn\u00a0<em>file (bestand) objecten\u00a0<\/em>, <em>sets (<\/em><i>verzamelingen)<\/i>, en\u00a0<i>dictionaires<\/i>. \u00a0Ze \u00a0kennen allemaal vele nuttige methoden. Je kunt Python vragen naar alle methoden van een gegeven object door de \u00a0<code>dir<\/code> functie te gebruiken:<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform8\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox8'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>De methoden van een\u00a0<code>str<\/code>. Merk op dat\u00a0<code>startswith<\/code>\u00a0een van de methoden is.<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 58px;'><textarea wrap='off' name='usercode8' id='usercode8'  cols=10 rows=2 readonly='readonly'  style = 'height : 58px;'  class='pyboxCode RO'>\nmyName = 'Jim'\nprint(dir(myName))<\/textarea><\/div>\n<div id='pbhistory8' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit8' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(8)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(8,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse8\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"8\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"b61570b2b95b30ad8670236bea6a68b9\"\/>\n<div id='pbresults8' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit8\").value = \"Run program\";document.getElementById(\"inputInUse8\").value = \"N\";<\/script>\n<\/p>\n<p>Kijken naar de eigenschappen van een object wordt ook wel\u00a0<em>introspection<\/em>\u00a0(introspectie) genoemd. In Python kunnen allerlei objecten methoden hebben:<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform9\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox9'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>De \u00a0members van \u00a0<code>int<\/code>.<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 84px;'><textarea wrap='off' name='usercode9' id='usercode9'  cols=10 rows=3 readonly='readonly'  style = 'height : 84px;'  class='pyboxCode RO'>\nx = 42\nprint(dir(x)) # includes 'bit_length' \nprint(x.bit_length()) # a method of int<\/textarea><\/div>\n<div id='pbhistory9' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit9' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(9)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(9,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse9\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"9\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"67274b4370fe010f7675c24568b2b247\"\/>\n<div id='pbresults9' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit9\").value = \"Run program\";document.getElementById(\"inputInUse9\").value = \"N\";<\/script>\n<\/p>\n<p>Sommige elementen van\u00a0<code>dir<\/code> zijn\u00a0<em>member variabelen\u00a0<\/em>in plaats van methoden, zo is bijvoorbeeld \u00a0<code>int.denominator<\/code>\u00a0een getal en geen functie. Technisch gezien, <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/console\/?consolecode=def%20f%28%29%3A%20return%2042%0Ag%20%3D%20f%0Aprint%28g%28%29%29%0Aprint%28type%28f%29%29\" target=\"_blank\">zijn in Python functies objecten<\/a>, en zijn member functies speciale gevallen van member variabelen.<\/p>\n<p>Je kunt ook introspectie toepassen op modules. Wanneer je\u00a0<code>import math<\/code>\u00a0(math importeert) en daarna\u00a0<code>dir(math)<\/code>\u00a0uitvoert, krijg je een lijst met alles uit de\u00a0<code>math<\/code> module, inclusief het getal\u00a0<code>pi<\/code>\u00a0en de functie\u00a0<code>sqrt<\/code>.<\/p>\n<h3>Waarom objecten?<\/h3>\n<p>Waarom hebben we methoden zoals <code>S.index(T)<\/code> in plaats van een eenvoudige functieaanroep <code>index(S, T)<\/code>? Of anders gezegd waarom willen we\u00a0 \u00fcberhaupt een <em>object<\/em> <code>S<\/code> en de <em>methode<\/em> <code>str.index()<\/code>?<\/p>\n<p>De belangrijkste voordelen van objecten worden duidelijker naar mate je meer complexe en gevarieerde datatypen gebruikt bij het programmeren. Elk type object (bijv. de <code>str<\/code>\u00a0<em>class<\/em>) representeert zowel de onderliggende data die wordt opgeslagen (bijv. een rij karakters en zijn lengte) als het type operaties die er op kunnen worden uitgevoerd\u00a0 (bijv., het omzetten naar hoofdletters of het produceren van een substring). Een meer complex voorbeeld vormen de <em>file objecten<\/em>: ze representeren de naam van de file die kan worden geopend, de huidige positie in de file, en methoden om er in te schrijven en er uit te lezen. Je kunt zelfs je eigen datatypen defini\u00ebren!<\/p>\n<p>Deze algemene aanpak wordt ook wel\u00a0 \"object-oriented programming\" (OOP) genoemd. Enige voordelen zijn:<\/p>\n<ul>\n<li><strong>organisatie<\/strong>: Alles uit de <code>math<\/code>\u00a0module kan worden gebruikt door middel van de\u00a0 <code>math.\u00abname\u00bb<\/code>\u00a0syntax, waarmee wordt vermeden dat bestaande variabelen in je programma worden overschreven.<\/li>\n<li><strong><strong>encapsulation<\/strong>:<\/strong>\u00a0Zoals een programma tegelijkertijd kan werken met verschillende strings en files, \u00a0kun je werken met vele verschillende kopie\u00ebn (<em>instances<\/em>) van het data type gedefinieerd door een andere element uit een class.<\/li>\n<li><strong>hergebruik<\/strong>: Wanneer je eenmaal een data type (zoals\u00a0<code>str<\/code>) of een bibliotheek met methode (zoals\u00a0<code>math<\/code>) hebt, kun je het \u00a0keer op keer gebruiken, of het delen met andere mensen.<\/li>\n<li><strong>debugging<\/strong>: Eerder zagen we dat door een functie te schrijven het hebben van vele kopie\u00ebn van gelijksoortige code overbodig maakt, waardoor het debuggen gemakkelijker wordt. Functies verzamelen die samenhangen met een data type op een enkele plaats \u00a0(de class definitie heeft hetzelfde effect.<\/li>\n<li><strong>relaties tussen classes<\/strong>: Python weet dat de\u00a0<code>index<\/code>\u00a0methode het een kan betekenen voor een string maar iets anders voor lijst. Evenzo, kan Python niet alleen files \u00a0lezen en schrijven op je computer, maar het kan ook data lezen en schrijven \u00a0van het Internet. In beide gevallen (karakters of lijst elementen, en lokale files of die op afstand) de classes die er mee samenhangen kunnen op dezelfde manier worden gebruikt waarbij het concept <em>overerving (inheritance)<\/em>\u00a0optreedt.<\/li>\n<\/ul>\n<p>In de rest van de CS Circles lessen zulllen we alleen maar objecten en methoden <em>gebruiken<\/em>; je kunt later meer leren over het zelf maken van classes (kijk op de Resources pagina).<\/p>\n<p>De volgende drie lessen kunnen in een willekeurige volgorde worden doorgewerkt. Ze vormen een scala aan uitdagingen waarin onderwerpen uit vroegere lessen gecombineerd aan de orde zullen komen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tot zover hebben we een tweetal data structuren in Python laten zien: strings en lijsten. Elk ervan kent meerdere methoden, die een variant zijn op functies. Zo is bijvoorbeeld reverse()\u00a0een methode bij een lijst. Zoals de naam suggereert draait deze &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/14-methods-nl\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6166","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/6166","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/comments?post=6166"}],"version-history":[{"count":28,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/6166\/revisions"}],"predecessor-version":[{"id":8796,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/6166\/revisions\/8796"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=6166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}