{"id":5555,"date":"2012-09-13T16:31:02","date_gmt":"2012-09-13T20:31:02","guid":{"rendered":"http:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=5555"},"modified":"2020-04-08T08:42:19","modified_gmt":"2020-04-08T12:42:19","slug":"4-de","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/4-de\/","title":{"rendered":"4: Typen"},"content":{"rendered":"<p><em>Von nun an haben Code-Boxen zwei weitere Buttons<\/em><strong>. In der Konsole \u00f6ffnen<\/strong> <em>und<\/em> <strong>Visualisieren<\/strong>. <em>Sie k\u00f6nnen dir beim Debuggen und Verstehen des Programms helfen.<\/em><\/p>\n<p>Im <a href=\"\/0-de\/\">\"Hallo, Welt!\"-Programm<\/a> haben wir gesehen, dass Python Zeichenketten verarbeiten kann. Wir haben auch verschiedene Beispiele mit Zahlen gesehen. Zahlen und Zeichenketten unterscheiden sich extrem voneinander und es treten Fehler auf, wenn man sie durcheinander bringt:<\/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>Vergleich von Zeichenkette und Zahl<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>Wie du sehen kannst, bekommen wir eine Fehlermeldung, da die beiden Argumente von <code>max<\/code> von unterschiedlichem Typ sind. Diese Fehlermeldung ist eine gute Einf\u00fchrung in dieses Kapitel:<\/p>\n<ul>\n<li><code>\"Hello, World!\"<\/code> ist eine <strong>Zeichenkette<\/strong>; in Python <code>str<\/code>. Zeichenketten haben wir in Lektion 3 bereits einleitend kennengelernt; mehr dazu gibt es auch in Lektion 7A.<\/li>\n<li><code>35<\/code> ist eine <strong>Ganzzahl<\/strong>; in Python <code>int<\/code>. Beispiele f\u00fcr ganze Zahlen sind 42, -12, und 0.<\/li>\n<\/ul>\n<p>Das Nutzen von Variablen mit einem falschen Typ ist eine h\u00e4ufige Fehlerursache in Programmen. Es ist wie der Versuch, ein Sandwich zu trinken: es ist nicht m\u00f6glich, da man nur Fl\u00fcssigkeiten trinken kann - und ein Sandwich ist eben nicht fl\u00fcssig.<\/p>\n<p>Du kannst den Typ einer Variable durch die Funktion <code>type<\/code> ermitteln.<\/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>Einige Beispieltypen.<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>(Klassen (<code>class<\/code>) sind nicht dasselbe wie Typen, aber zun\u00e4chst reicht es, wenn wir das annehmen.) Das obige Beispiel zeigt, dass Zahlen in zwei verschiedene Typen aufgeteilt sind: Ganzzahlen (<code>int<\/code>) haben wir bereits kennen gelernt und Gleitpunktzahlen (manchmal auch Flie\u00dfpunktzahlen genannt - Englisch: floating point numbers - <code>float<\/code>) sind zum Speichern von nicht-ganzen Zahlen (also solchen mit Nachkommastellen). Gleitpunktzahlen sind dabei nicht immer ganz exakt und eher eine Ann\u00e4herung (mehr dazu in Lektion 7B). Gleitpunktzahlen und Ganzzahlen k\u00f6nnen miteinander kombiniert werden; das Ergebnis ist dann eine weitere Gleitpunktzahl.<\/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>Kombinieren von <code>int<\/code> und <code>float<\/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>Um genau zu sein: Python kombiniert nicht die Gleitpunktzahl mit der Ganzzahl, sondern wandelt die Ganzzahl in eine Gleitpunktzahl um und verrechnet zwei Gleitpunktzahlen.<\/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'>Floating<\/span><\/div><div>Wenn wir in obigen Beispiel <code>1.2<\/code> in <code>1.5<\/code> \u00e4ndern, wie lautet dann die erste Zeile der Ausgabe?<\/div><label>Your choice: <\/label><select id=\"pyselect3\"><option value=\"d\" selected>Select one<\/option><option value=\"w\">Es wird ein Fehler erzeugt<\/option><option value=\"w\">1.5 2 3<\/option><option value=\"r\">1.5 2 3.0<\/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\">Korrekt! Wir m\u00fcssen zwei Fakten erkl\u00e4ren, um zu sehen, warum <code>z<\/code> ausgegeben wird als <code>3.0<\/code>.\n<ul>\n<li>Der Ausdruck <code>x * y<\/code> mischt ein <code>int<\/code> und ein <code>float<\/code>, was Python behandelt, als ob es sich um zwei <code>float<\/code>s handeln w\u00fcrde, und das Resultat <code>z<\/code> ist deshalb ein <code>float<\/code>.<\/li>\n<li>Der mathematische Wert von <code>z<\/code> ist 1.5 mal 2, was 3 ergibt, aber gespeichert wird in ungenauer Dezimalform des Typs <code>float<\/code>. Wenn Python ein <code>float<\/code> ausgibt, wenn sein Wert eine Ganzzahl ist, wird er mit <code>.0<\/code> ausgegeben, um klarzustellen, dass es sich um einen ungenauen Wert handelt.<\/li>\n<\/ul>\nBeachtet au\u00dferdem, dass der Wert und der Typ von <code>y<\/code> sich niemals \u00e4ndern.<\/div><\/div>\n<p>Oft ist es n\u00f6tig, Daten von einem Typ in einen anderen umzuwandeln. So wie man ein Sandwich in eine Fl\u00fcssigkeit umwandeln kann, kann man auch auch eine <strong>Typumwandlung<\/strong> (engl: typecast) benutzen. Damit kann man eine Zahl in eine Zeichenkette umwandeln - und umgekehrt. Dazu benutzt man den Namen des gew\u00fcnschten Typs wie eine Funktion, zum Beispiel \u00e4ndert<\/p>\n<pre>x = float(\"3.4\")\r\nprint(x-1)<\/pre>die Zeichenkette <code>\"3.4\"<\/code> in die Gleitpunktzahl <code>3.4<\/code> und gibt dann <code>2.4<\/code> aus. Ohne die Typumwandlung w\u00fcrde das <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/console\/?consolecode=x%3D%223.4%22%0Aprint%28x-1%29\" target=\"_blank\">Programm abst\u00fcrzen<\/a>, da man keine Zahl von einer Zeichenkette abziehen kann.<\/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> Manchmal <em>erlaubt<\/em> Python die Nutzung von arithmetischen Operatoren auf Zeichenketten. Der Befehl\u00a0<code><code>print(\"test\" * 2)<\/code><\/code> wird <code>testtest<\/code> ausgeben. Bei der Multiplikation von Zeichenketten mit einer Ganzzahl <em>n<\/em> bedeutet f\u00fcr Python, die Zeichenkette <em>n<\/em>-mal hintereinander zu setzen. Wir werden auch noch sehen, dass in Python auch die Addition von zwei Zeichenketten m\u00f6glich ist.  <\/span><\/td><\/table><\/p>\n<p>Die verschiedenen Typumwandlungen verhalten sich unterschiedlich:<\/p>\n<ul>\n<li>bei der Umwandlung eines <code>float<\/code> in ein <code>int<\/code> geht die Information hinter dem Dezimalpunkt verloren. Zum Beispiel wird <code>int(1.234)<\/code> zu <code>1<\/code>, und <code>int(-34.7)<\/code> ergibt <code>-34<\/code>.<\/li>\n<li>die Konvertierung eines <code>str<\/code> in ein <code>int<\/code> verursacht einen Fehler, wenn die Zeichenkette nicht genau nur eine Ganzzahl enth\u00e4lt. Zum Beispiel <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/console\/?consolecode=x%20%3D%20int%28%221.234%22%29\" target=\"_blank\">erzeugt <code>int(\"1.234\")<\/code> einen Fehler<\/a>.<\/li>\n<li>die Umwandlung eines <code>str<\/code> in ein <code>float<\/code> schl\u00e4gt fehl, wenn die Zeichenkette keine Zahl ist. Zum Beispiel <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/console\/?consolecode=x%20%3D%20float%28%22sandwich%22%29\" target=\"_blank\">erzeugt <code>float(\"sandwich\")<\/code> einen Fehler<\/a>.<\/li>\n<\/ul>\n<p>Typumwandlungen werden h\u00e4ufig genutzt, um Nutzereingaben - die immer in Form einer Zeichenkette sind - zu verarbeiten. Folgendes Beispiel zeigt, wie es aussehen k\u00f6nnte.<\/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>Beispiel einer Typumwandlung.<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 kommt noch eine abschlie\u00dfende \u00dcbung.<\/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> Da der Editor jetzt viele Funktionen hat, sind einige im Men\u00fc <strong>Mehr Optionen...<\/strong> versteckt. <\/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'>Leckere Typumwandlung<\/span><\/div>Schreibe ein Programm, das dir hilft, deine Freunde auf einer Party satt zu machen, indem du ein wenig mit quadratischen Pizzen rechnest. Eine Zeichenkette <code>inputStr<\/code>, die die Seitenl\u00e4nge <em>L<\/em> der Pizza in cm bestimmt, ist vordefiniert. Die Fl\u00e4che der Pizza kann mit <em>A = L*L<\/em> berechnet werden. Dann nehmen wir an, dass jede Person auf der Party 100 cm<sup>2<\/sup> Pizza isst. Berechne die Anzahl der Personen (eine <em>Ganzzahl<\/em>), die du mit dieser Pizza vollst\u00e4ndig satt bekommst. <a class=\"hintlink\"  id=\"hintlink6\">Hinweis<\/a><\/p>\n<div><em>Beispiel<\/em>: wenn <code>inputStr<\/code> <code>\"17.5\"<\/code> ist, dann ist die Fl\u00e4che 306.25 cm<sup>2<\/sup>, so dass <code>3<\/code> die richtige L\u00f6sung ist.<\/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=\"01d1c1ec2592587e86368c0d6e903b30\"\/>\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>Wenn du fertig bist, kannst du mit der n\u00e4chsten Lektion weitermachen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Von nun an haben Code-Boxen zwei weitere Buttons. In der Konsole \u00f6ffnen und Visualisieren. Sie k\u00f6nnen dir beim Debuggen und Verstehen des Programms helfen. Im \"Hallo, Welt!\"-Programm haben wir gesehen, dass Python Zeichenketten verarbeiten kann. Wir haben auch verschiedene Beispiele &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/4-de\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2653,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-5555","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5555","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\/2653"}],"replies":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/comments?post=5555"}],"version-history":[{"count":18,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5555\/revisions"}],"predecessor-version":[{"id":11316,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5555\/revisions\/11316"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=5555"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}