{"id":6139,"date":"2012-11-05T20:12:07","date_gmt":"2012-11-06T01:12:07","guid":{"rendered":"http:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=6139"},"modified":"2019-03-04T02:39:37","modified_gmt":"2019-03-04T07:39:37","slug":"4-types-nl","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/4-types-nl\/","title":{"rendered":"04: Types"},"content":{"rendered":"<p><em>Vanaf deze les, hebben voorbeelden en programma-invoervensters extra knoppen: <strong>Open in the console <\/strong> <em>en<\/em> <strong><strong>Visualiseer<\/strong>.\u00a0<\/strong>Gebruik ze om het programma te verbeteren en te onderzoeken.<\/em><\/p>\n<p>In het <a href=\"\/\">Hello, World!-programma<\/a> zagen we dat Python in staat is om een tekenreeks (een stuk tekst) voor ons te herhalen. We hebben ook meerdere rekenvoorbeelden met getallen gezien. Getallen en tekenreeksen zijn fundamenteel verschillende soorten <em>waarden<\/em>, en wanneer je ze op de verkeerde manier in Python door elkaar gebruikt kan dat een foutmelding tot gevolg hebben:<\/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>Dit programma probeert een tekenreeks met een getal te vergelijken.<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'>\nx = \"Hello, World!\"\ny = 35\nz = max(x, y)<\/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=\"be6e76a12e6524cb283e5659895e5c2f\"\/>\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>Zoals je kunt zien, krijgen we een foutmelding waarin wordt aangegeven dat de twee argumenten van <code>max<\/code> van verschillende <em>types<\/em> zijn. De foutmelding is een goede inleiding tot de rest van de les:<\/p>\n<ul>\n<li><code><code>\"Hello, World!\"<\/code><\/code> is een <strong>tekenreeks<\/strong> (Eng.:\u00a0<strong><em>string<\/em><\/strong>), die door Python als\u00a0 <code>str<\/code> wordt aangemerkt. Een tekenreeks is een willekeurige rij van letters, cijfers, spaties, en leestekens; we zullen er meer over leren in les 7A.<\/li>\n<li><code>35<\/code> is een <strong>geheel getal<\/strong> (Eng.:\u00a0<strong><em>integer<\/em><\/strong>). Gehele getallen worden\u00a0door Python als <code>int<\/code>\u00a0aangemerkt.<\/li>\n<\/ul>\n<p>Een waarde van de verkeerde soort willen gebruiken is een veel voorkomende oorzaak van een fout in een computerprogramma. Het is als het drinken van een boterham: dat kan niet want je kunt alleen maar vloeibare dingen drinken, en een boterham is niet vloeibaar maar vast.<\/p>\n<p>Je kunt het type van een waarde achterhalen door de functie <code>type<\/code> aan te roepen:<\/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 paar voorbeelden van het gebruik van de functie\u00a0<code>type<\/code>.<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 84px;'><textarea wrap='off' name='usercode1' id='usercode1'  cols=10 rows=3 readonly='readonly'  style = 'height : 84px;'  class='pyboxCode RO'>\nprint(type(\"Hello, World!\"))\nprint(type(34))\nprint(type(1.234))<\/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=\"768daed3b2e69c5cd5bc93ea45e1fc32\"\/>\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<p>(Alle Python-types zijn ook\u00a0<em>klassen<\/em> (Eng.:\u00a0<em>classes<\/em>).)\u00a0 Bovenstaand voorbeeld laat zien dat er twee verschillende types van getallen zijn in Python: het type\u00a0<code>int<\/code> van gehele getallen en het type\u00a0<code>float<\/code> van <em>vlottende-kommagetallen<\/em> (Eng.:\u00a0<em>floating-point numbers<\/em>). Het type <code>float<\/code> laat toe te rekenen met kommagetallen in Python. (Merk op dat kommagetallen in Python genoteerd worden met een punt in plaats van een komma.) Let wel: niet alle kommagetallen kunnen exact voorgesteld worden als een <code>float<\/code>-waarde. Bij berekeningen met <code>float<\/code>-waarden zullen er dan ook doorgaans <em>afrondingen<\/em> optreden;\u00a0meer hierover in les 7B.<\/p>\n<p>Je kunt <code>float<\/code>-waarden mixen met <code>int<\/code>-waarden; het resultaat is een <code>float<\/code>.<\/p>\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>Een <code><code>int<\/code><\/code> en een <code><code>float<\/code> mixen<\/code>.<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 136px;'><textarea wrap='off' name='usercode2' id='usercode2'  cols=10 rows=5 readonly='readonly'  style = 'height : 136px;'  class='pyboxCode RO'>\nx = 1.2\ny = 2\nz = x * y\nprint(x, y, z)\nprint(type(x), type(y), type(z))<\/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=\"6f21ee769bd3e22ec989fbb8a69edbf5\"\/>\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>Wat Python in feite doet wanneer je een <code>float<\/code> met een\u00a0<code>int<\/code> mixt is dat het de <code>int<\/code> omzet naar een\u00a0<code>float<\/code>\u00a0en dan verder gaat met twee <code>float<\/code>s.<\/p>\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'>Multiple Choice Exercise: <\/span><span class='title'>Float<\/span><\/div><div>Wanneer we <code><code>1.2<\/code><\/code> veranderen in <code><code>1.5<\/code><\/code> in bovenstaand programma, wat is dan de eerste regel in de uitvoer?<\/div><label>Your choice: <\/label><select id=\"pyselect3\"><option value=\"d\" selected>Select one<\/option><option value=\"w\">Er treedt een fout op<\/option><option value=\"r\">1.5 2 3.0<\/option><option value=\"w\">1.5 2 3<\/option><option value=\"w\">1.5 2.0 3.0<\/option><\/select><div class='pyboxbuttons'><input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" name=\"slug\" value=\"4.mixing\"\/><input type='submit' style='margin:5px;' value='Check answer' onClick='pbMultiCheck(3)'\/><\/div><div class=\"pbresults\" id=\"pyMultiResults3\"><\/div><div class=\"epilogue\">Correct! We moeten twee dingen nader toelichten, om te laten zien waarom <code>z<\/code> als <code>3.0<\/code> wordt afgedrukt.\n\n<ul>\n \t\n<li>Wanneer we <code>x * y<\/code> berekenen dan mixen we een <code>int<\/code> en een <code>float<\/code>, maar Python behandelt die als twee <code>float<\/code>s, waardoor <code>z<\/code> een <code>float<\/code> wordt.<\/li>\n\n \t\n<li>Om duidelijk te maken dat het om een <code>float<\/code> gaat, drukt Python de waarde van <code>z<\/code> af als <code>3.0<\/code> in plaats van <code>3<\/code>.<\/li>\n\n<\/ul>\n\nMerk op dat de waarde en het type van <code>y<\/code> niet veranderd zijn.\n<\/div><\/div>\n<p>Het is vaak noodzakelijk een waarde van het ene type om te zetten in een ander type. Zoals je aardbeien met een blender kunt omzetten van vast naar vloeibaar, kun je ook een waarde van het ene type soms omzetten naar een ander type daarbij gebruik makend van een\u00a0<strong>typeconversiefunctie<\/strong> (Eng.:\u00a0<strong><em>typecast function<\/em><\/strong>). Je schrijft de naam van het gewenste nieuwe type op dezelfde manier als bij de aanroep van een functie, bijvoorbeeld<\/p>\n<pre>x = float(\"3.4\")\r\nprint(x-1)<\/pre>zet de tekenreeks <code>\"3.4\"<\/code> om naar het kommagetal 3,4\u00a0en drukt dan af <code><code>2.4<\/code><\/code>. Zonder de typecast, zou <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/console\/?consolecode=x%3D%223.4%22%0Aprint%28x-1%29\" target=\"_blank\">het programma crashen<\/a>, omdat het niet mogelijk is een getal van een tekenreeks af te trekken.<\/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> Soms staat Python toe dat je tekenreeksen en getallen combineert waarbij rekenkundige operatoren worden gebruikt. De opdracht\u00a0<code><code>print(\"hots\" * 2)<\/code>\u00a0<\/code>drukt\u00a0<code>hotshots<\/code>\u00a0af. Daarbij is het een Python-regel dat wanneer je een tekenreeks\u00a0<em>s<\/em> vermenigvuldigt met een geheel getal\u00a0<em>n<\/em> dit betekent dat je <em>n<\/em> kopie\u00ebn van <em>s<\/em> na elkaar plaatst. We zullen later zien dat de \"optelling van twee tekenreeksen\" ook gedefinieerd is in Python.  <\/span><\/td><\/table><\/p>\n<p>Verschillende typeconversies gedragen zich verschillend:<\/p>\n<ul>\n<li>wanneer een <code>float<\/code> in een <code>int<\/code> wordt omgezet dan gaat het gedeelte na de komma verloren, bijvoorbeeld <code><code>int(1.234)<\/code><\/code> is <code>1<\/code>, en\u00a0 <code><code>int(-34.7)<\/code><\/code> is <code>-34<\/code>.<\/li>\n<li>wanneer een\u00a0<code>str<\/code> in een <code>int<\/code> wordt omgezet dan veroorzaakt dat een foutmelding wanneer de tekenreeks niet de precieze vorm heeft van een geheel getal. Bijvoorbeeld: <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/console\/?consolecode=x%20%3D%20int%28%221.234%22%29\" target=\"_blank\"><code><code>int(\"1.234\")<\/code><\/code> veroorzaakt een foutmelding<\/a>.<\/li>\n<li>wanneer een\u00a0<code>str<\/code> in een\u00a0<code>float<\/code> wordt omgezet dan veroorzaakt dat een foutmelding wanneer de tekenreeks geen getal voorstelt. Bijvoorbeeld: <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/console\/?consolecode=x%20%3D%20float%28%22boterham%22%29\" target=\"_blank\"><code>float(\"boterham\")<\/code> veroorzaakt een foutmelding<\/a>.<\/li>\n<\/ul>\n<p>Een typisch gebruik van type-omzetting dat we weldra zullen zien is het omzetten van invoer door de gebruiker, wat altijd een tekenreeks is, in een numerike vorm. Hier volgt een voorbeeld.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform4\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox4'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Voorbeeld van een type-omzetting.<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 136px;'><textarea wrap='off' name='usercode4' id='usercode4'  cols=10 rows=5 readonly='readonly'  style = 'height : 136px;'  class='pyboxCode RO'>\ninputStr = \"12\"                          # a piece of user input\nprint(\"The input type is\", type(inputStr))\nx = int(inputStr)\nprint(x, \"is of type\", type(x), \"and its square is\", x*x)\nprint(inputStr * inputStr)               # this line should cause an error<\/textarea><\/div>\n<div id='pbhistory4' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit4' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(4)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(4,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse4\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"4\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"c7f8b39cee9546a0c8c059ff52a0e7cf\"\/>\n<div id='pbresults4' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit4\").value = \"Run program\";document.getElementById(\"inputInUse4\").value = \"N\";<\/script>\n<\/p>\n<p>Hier volgt nog een voorbeeld om deze les af te sluiten.<\/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> Omdat er nu veel mogelijke editor-opdrachten zijn, zijn sommige verplaatst naar een knop <strong>Meer acties...<\/strong> <\/span><\/td><\/table><\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform5\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox5'>\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'>Smakelijke type-omzetting<\/span><\/div>Schrijf een programma dat door wat rekenwerk helpt om je vrienden van voedsel te voorzien bij een feestje met\u00a0<em>vierkante pizza's<\/em>. Neem aan dat het nakijkprogramma een tekenreeks\u00a0<code>inputStr<\/code> definieert, met een decimale tekenreeks die de lengte van de zijde\u00a0<em>L<\/em> van de pizza weergeeft in cm. Bereken de oppervlakte van de pizza met de formule O<em> = L*L<\/em>.\u00a0Bereken dan, aangenomen dat elke persoon 100 cm<sup>2<\/sup> pizza eet, het aantal mensen die kunnen mee-eten;\u00a0<em>rond daarbij af naar beneden naar het dichtstbijzijnde gehele getal.<\/em>\u00a0<a class=\"hintlink\"  id=\"hintlink6\">Hint<\/a> <\/p>\n<div><em>Voorbeeld<\/em>: wanneer <code>inputStr<\/code> is <code>\"17.5\"<\/code>, zal de oppervlakte 306,25 cm<sup>2 <\/sup>zijn, dus is <code>3<\/code> de correcte uitvoer.<\/div>\n<p> <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='usercode5' id='usercode5'  cols=10 rows=20   class='pyboxCode RW'>\n# delete this comment and enter your code here\n<\/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,'Y')\" ><\/td>\n<td><input type='button' name='history' value=\"History\" onclick=\"historyClick(5,'4.pizza')\" ><\/td>\n<\/tr><\/table><select id='pbSelect5' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='help' data-pbonclick=\"helpClick(5);\" >Help<\/option>\n<\/select><\/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=\"f8ebb2bdc839f14cddc22ed48d2d131c\"\/>\n<div id='pbresults5' class='pbresults avoidline'><\/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>Zodra je dit gedaan hebt, kun je doorgaan met de volgende les.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vanaf deze les, hebben voorbeelden en programma-invoervensters extra knoppen: Open in the console en Visualiseer.\u00a0Gebruik ze om het programma te verbeteren en te onderzoeken. In het Hello, World!-programma zagen we dat Python in staat is om een tekenreeks (een stuk &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/4-types-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":"open","template":"","meta":{"footnotes":""},"class_list":["post-6139","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/6139","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=6139"}],"version-history":[{"count":37,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/6139\/revisions"}],"predecessor-version":[{"id":11188,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/6139\/revisions\/11188"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=6139"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}