{"id":5528,"date":"2012-09-12T20:39:41","date_gmt":"2012-09-13T00:39:41","guid":{"rendered":"http:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=5528"},"modified":"2024-07-11T06:09:37","modified_gmt":"2024-07-11T10:09:37","slug":"14-de","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/14-de\/","title":{"rendered":"14: Methoden"},"content":{"rendered":"<p>Bislang haben wir eine Reihe von Datenstrukturen in Python gesehen: strings und Listen. Jede von ihnen unterst\u00fctzt mehrere <em>Methoden<\/em>, die Varianten von Funktionen sind.<\/p>\n<p>Zum Beispiel ist eine <em>Methode<\/em> von <code>Listen<\/code> die <code>reverse()<\/code> Methode. Wie der Name schon andeutet, kehrt sie die Liste um (so wird aus dem ersten Element das letzte und umgekehrt). Man ruft eine Methode auf, in dem man ein Periodenzeichen (<code>.<\/code>) verwendet wie im Folgenden:<\/p>\n<p style=\"text-align: center;\"><code>\u00abobjectName\u00bb.\u00abmethodName\u00bb(\u00ablist of arguments, if any\u00bb)<\/code><\/p>\n<p>Zum Vergleich, die Syntax, die wir bereits gesehen haben, um Funktionen aufzurufen, war<\/p>\n<p style=\"text-align: center;\"><code>\u00abfunctionName\u00bb(\u00ablist of arguments, if any\u00bb)<\/code><\/p>\n<p>Hier ist ein Beispiel f\u00fcr das Aufrufen der <code>Umkehr<\/code>-Methode in einer Liste.<\/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>Listen umkehren.<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>Ein Beispiel einer Methode, die ein Argument ben\u00f6tigt, ist <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>Einige Zeichenkettenmethoden.<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>Viele Methoden<\/h2>\n<p>Unten erw\u00e4hnen wir die h\u00e4ufigsten Methoden f\u00fcr die Zeichenketten- und Listenklassen. Diese erledigen zumeist Aufgaben, die du selbst zu schreiben in der Lage sein solltest, aber das Verwenden von Standardmethoden hat den Vorteil, dass es deinen Code leichter f\u00fcr andere zu lesen und zu bearbeiten macht.<\/p>\n<h3>Listen<\/h3>\n<p>Diese Methoden ver\u00e4ndern die Liste nicht:<\/p>\n<ul>\n<li><code>list.index(X)<\/code>: finde <code>X<\/code> in der Liste. Genauer gesagt, gibt diese Methode ein <code>i<\/code> aus, das <code>list[i]==X<\/code> ergibt, wenn man alle Elemente durchsucht. Das niedrigst m\u00f6gliche <code>i<\/code> wird ausgegeben. Wenn <code>X<\/code> nicht in der Liste vorhanden ist, wird <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>ausgel\u00f6st<\/a>.\n<ul>\n<li><code>X in list<\/code> gibt <code>True<\/code> aus, wenn <code>X<\/code> ein Element der Liste ist, sonst <code>False<\/code>. Diese Methode zu verwenden kann helfen, einen <code>ValueError<\/code> zu vermeiden. (Achtung: <code>in<\/code> ist ein Operator, keine Methode.)<\/li>\n<\/ul>\n<\/li>\n<li><code>list.count(X)<\/code>: gibt aus, wie oft <code>X<\/code> in der Liste vorkommt<\/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>Listenmethoden.<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>Diese Methoden ver\u00e4ndern die Liste:<\/p>\n<ul>\n<li><code>list.append(X)<\/code> f\u00fcgt <code>X<\/code> am Ende von <code>list<\/code> ein<\/li>\n<li><code>list.insert(i, X)<\/code> f\u00fcgt <code>X<\/code> an der Stelle <code>i<\/code> ein<\/li>\n<li><code>list.extend(L)<\/code> f\u00fcgt eine Liste <code>L<\/code> an das Ende an<\/li>\n<li><code>list.remove(X)<\/code> entfernt das erste Auftreten von <code>X<\/code><\/li>\n<li><code>list.pop(i)<\/code> l\u00f6scht &amp; gibt Element <code>list[i]<\/code> zur\u00fcck, w\u00e4hrend <code>list.pop()<\/code> das letzte Element l\u00f6scht &amp; zur\u00fcckgibt.<\/li>\n<li><code>del list[i]<\/code> l\u00f6scht das <code>i<\/code>te Element von <code>list<\/code> (Achtung: dies ist ein \"del Statement\", keine Methode)<\/li>\n<li><code>list.reverse()<\/code>kehrt die Liste um<\/li>\n<li><code>list.sort()<\/code>sortiert die Liste<\/li>\n<\/ul>\n<p>Alle Methoden oben au\u00dfer <code>pop<\/code> geben <code>None<\/code> aus. Einige dieser Funktionen k\u00f6nnen au\u00dferdem auch mit leicht ver\u00e4nderten Argumenten aufgerufen werden; f\u00fcr mehr Details siehe den Abschnitt \u00fcber <a href=\"http:\/\/docs.python.org\/py3k\/library\/stdtypes.html#mutable-sequence-types\">Listenmethoden<\/a> in der Python Dokumentation. Listen unterst\u00fctzen auch komplexe Unterbereiche, die \u201eslices\u201c genannt werden, und die es uns erlauben, ganze Unterlisten einzuf\u00fcgen oder zu l\u00f6schen, \u00e4hnlich wie in der <code>string[x:y:z]<\/code> Schreibweise, die wir in <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/7a-de\/\">vorherigen<\/a> <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/12-de\/\">Lektionen gesehen haben<\/a>.<\/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'>The Replacements<\/span><\/div>Verwende <code>index <\/code>und andere Listenmethoden um eine Funktion <code>replace(list, X, Y)<\/code> zu schreiben, die <code>X<\/code> jedesmal durch <code>Y<\/code> ersetzt, wenn es in <code>list<\/code> vorkommt. Zum Beispiel, wenn <code>L = [3, 1, 4, 1, 5, 9]<\/code>, dann w\u00fcrde <code>replace(L, 1, 7)<\/code> n\u00e4mlich <code>L<\/code> durch <code>[3, 7, 4, 7, 5, 9]<\/code> ersetzen. Damit diese Aufgabe eine Herausforderung ist, <em>ist es dir <strong>nicht<\/strong> erlaubt<\/em>, <code>[]<\/code>, zu verwenden. Hinweis: du brauchst <code>return<\/code> nicht zu verwenden.<br \/>\n<a class=\"hintlink\"  id=\"hintlink4\">Tipp<\/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=\"c6c8e3d5bfffbc9ca365b887c6b22713\"\/>\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>Zeichenketten<\/h2>\n<p>Genau wie bei Listen, kannst du <code>in<\/code>,<code>index<\/code> und <code>count<\/code> mit Zeichenketten verwenden. Sie sind sogar noch wirkungsvoller, da sie auch mit Unterketten funktionieren und nicht nur individuelle Zeichen finden:<\/p>\n<ul>\n<li><code>S in T<\/code> ist ein bool, der angibt, ob Kette <code>S<\/code> eine Unterkette von Kette <code>T<\/code> ist.<\/li>\n<li><code>S.index(T)<\/code> findet den ersten Index von <code>S<\/code>, wo <code>T<\/code> eine Unterkette ist<\/li>\n<li><code>S.count(T)<\/code> gibt die Zahl von sich nicht \u00fcberschneidenden Auspr\u00e4gungen von <code>T<\/code> an als Unterkette von <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> und <code>count<\/code> f\u00fcr Strings aufrufen.<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 sind einige der allgemein hilfreichsten <code>str<\/code> Methoden:<\/p>\n<ul>\n<li>Gro\u00df- und Kleinschreibung: <code>capitalize, lower, upper, islower, isupper<\/code><\/li>\n<li>Zeichen: <code>isalpha, isdigit<\/code><\/li>\n<li>F\u00fcllung: <code>center, ljust, rjust<\/code>; <code>strip<\/code> l\u00f6schen F\u00fcllzeichen<\/li>\n<li>Unterketten: <code>endswith, startswith, find, replace<\/code><\/li>\n<li>Parsing: <code>split, splitlines<\/code><\/li>\n<\/ul>\n<p>Wir werden diese detaillierter einf\u00fchren, sofern dies notwendig ist. Eine komplette, detaillierte Liste von <a href=\"http:\/\/docs.python.org\/py3k\/library\/stdtypes.html#string-methods\">Zeichenkettenmethoden<\/a> findest du in der Python Dokumentation.<\/p>\n<p><strong>Strings sind unver\u00e4nderlich<\/strong>. Wir erw\u00e4hnten <code>list.reverse()<\/code>, welches eine Liste ver\u00e4ndert, indem es sie umkehrt, aber es existiert keine <code>str.reverse()<\/code> Methode. Das ist so, weil Zeichenkettenobjekte nicht mehr ver\u00e4ndert werden k\u00f6nnen, wenn sie einmal entworfen wurden. In Lektion 17 erkl\u00e4ren wir dies etwas genauer.<\/p>\n<p>Hier ist ein Beispiel einer Kettenmethode: <code>S.replace(old, new)<\/code> gibt eine modifizierte Version von <code>S<\/code> aus, bei der jedes Vorkommen von Unterkette <code>old<\/code> ersetzt wurde durch <code>new<\/code>. Dies ruft eine neue Kette hervor, ohne die alte zu ver\u00e4ndern:<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>Example: <code>replace<\/code> gibt eine neue Kette aus und ver\u00e4ndert das Original nicht.<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>F\u00fcr die n\u00e4chste \u00dcbung sind die folgenden Methoden hilfreich:<\/p>\n<ul>\n<li><code>str.replace<\/code>, die wir gerade beschrieben haben<\/li>\n<li>die Boolesche Methode <code>str.isalpha()<\/code>, die <code>True<\/code> ergibt, wenn <code>str<\/code> eine Kette (oder Zeichen) ist, die nur aus Buchstaben besteht<\/li>\n<li>die Boolesche Methode <code>str.isdigit()<\/code>, die <code>True<\/code> ergibt, wenn <code>str<\/code> eine Kette (oder Zeichen) ist, die nur aus Zahlen besteht<\/li>\n<li><code>str.upper()<\/code>, die eine Version von <code>str<\/code> ausgibt, die zu Gro\u00dfbuchstaben konvertiert wurde.<\/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'>Exact Postage<\/span><\/div>Definiere eine Funktion <code>postalValidate(S)<\/code>, die zuerst \u00fcberpr\u00fcft, ob <code>S<\/code> eine Postleitzahl ist, die <em>zul\u00e4ssig<\/em> ist:<\/p>\n<ul>\n<li>zuerst, l\u00f6sche alle Leerzeichen;<\/li>\n<li>der Rest muss die Form <code>L#L#L#<\/code> haben, bei der <code>L<\/code> Buchstaben (Gro\u00df- oder Kleinbuchstaben) und <code>#<\/code> Zahlen sind.<\/li>\n<\/ul>\n<p>Wenn <code>S<\/code> keine zul\u00e4ssige Postleitzahl ist, dann gib den Booleschen <code>False<\/code> aus. Wenn S zul\u00e4ssig ist, dann gib eine Version derselben Postleitzahl in dem Format <code>L#L#L#<\/code> aus, in welcher jedes <code>L<\/code> in Gro\u00dfbuchstaben ist.<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=\"40160dbfe0fb06dae0bece12826bbca8\"\/>\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<!--Das war's erstmal! Du bist bereit f\u00fcr die n\u00e4chste Lektion.--><\/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> Der Rest dieser Lektion ist ein bisschen technisch und kein n\u00f6tiges Wissen f\u00fcr die restlichen Lektionen. <\/span><\/td><\/table><\/p>\n<h3>Mehr \u00fcber Objekte<\/h3>\n<p>W\u00e4hrend du mehr \u00fcber Python lernst, wirst du mehreren Klassen als nur strings und Listen begegnen.<br \/>\nAndere, die du wohl n\u00fctzlich finden wirst, sind <em>file objects<\/em>, <em>sets<\/em>, und <em>dictionaries<\/em>.<br \/>\nSie haben alle viele n\u00fctzliche Methoden. Du kannst Python nach allen Methoden eines gegebenen Objektes fragen,<br \/>\nindem du die <code>dir<\/code>-Funktion anwendest:<\/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>Die Methoden eines <code>str<\/code>. Bemerke, dass <code>startswith<\/code> eines der Ausgaben ist.<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>Die Eigenschaften eines Objekts anzuschauen wird <em>introspection<\/em> genannt. Alles in Python darf Methoden haben:<\/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>Die Glieder eines <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>Einige der Eintr\u00e4ge in <code>dir<\/code> sind eigentlich <em>member variables<\/em> statt Methoden, zum Beispiel ist <code>int.denominator<\/code> eine Zahl und keine Funktion. Technisch sind <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\">Funktionen Objekte<\/a> in Python, so sind member-Funktionen ein Spezialfall von member-Variablen.<\/p>\n<p>Du kannst Introspektion auch an Modulen betreiben. Falls du <code>import math<\/code> durchf\u00fchrst und dann <code>dir(math)<\/code> aufrufst, bekommst du eine Liste von allem im <code>math<\/code>-Modul, die Zahl <code>pi<\/code> und die Funktion <code>sqrt<\/code> inklusive.<\/p>\n<h3>Warum Objekte?<\/h3>\n<p>Warum haben wir Methoden wie <code>S.index(T)<\/code> anstatt eines einfachen Funktionsaufrufs wie <code>index(S, T)<\/code>? Warum haben wir eigentlich \u00fcberhaupt <em>object<\/em> <code>S<\/code> und <em>method<\/em> <code>str.index()<\/code>?<\/p>\n<p>Die wesentlichen Vorteile der Objekte werden klarer, wenn du anf\u00e4ngst mit komplizierteren und<br \/>\nunterschiedlicheren Typen von Daten zu programmieren. Jeder Typ vom Objekt (z.B. <code>str<\/code> <em>class<\/em>)<br \/>\nstellt die untergebrachten Basisdaten (z.B. eine Folge von Zeichen und ihre L\u00e4nge)<br \/>\nund die Typen der Operationen dar, welche daran ausgef\u00fchrt werden k\u00f6nnen (z.B. konvertieren zum Gro\u00dfbuchstaben oder einen substring erstellen).<br \/>\nEin komplexeres Beispiel sind <em>file objects<\/em>:<br \/>\nsie repr\u00e4sentieren den Namen eines zu \u00f6ffnenden Files, deine aktuelle Position im File und Methoden zum Lesen und Schreiben.<br \/>\nDu kannst sogar deine eigenen Datentypen definieren!<\/p>\n<p>Dieser allgemeine Zugang wird \"objektorientierte Programmierung\" (OOP) genannt. Einige seiner Leistungen sind:<\/p>\n<ul>\n<li><strong>organization<\/strong>: Auf alles vom <code>math<\/code>-Modul kann mit der <code>math.\u00abname\u00bb<\/code>-Syntax zugegriffen werden; du sparst die M\u00f6glichkeit, existierende Variablennamen in deinem Programm zu \u00fcberschreiben.<\/li>\n<li><strong><strong>encapsulation<\/strong>: <\/strong><br \/>\nSo wie ein Programm mit mehreren strings oder mehreren Files zur gleichen Zeit arbeiten kann, kannst du mit vielen verschiedenen Kopien (<em>instances<\/em>) des durch irgendeine andere Klasse definierten Datentypen arbeiten.<\/li>\n<li><strong>re-use<\/strong>: Sobald du einen Datentypen (wie <code>str<\/code>) oder eine Library von Methoden (wie <code>math<\/code>) definiert hast, kannst du ihn wieder und wieder benutzen (re-use) oder ihn anderen Leuten vom benutzen geben.<\/li>\n<li><strong>debugging<\/strong>:<br \/>\nWir sahen von fr\u00fcher, wie das Schreiben einer Funktion den Gebrauch vieler Kopien gleichen Codes vermeidet,<br \/>\nwas debugging erleichtert. Alle Funktionen verkn\u00fcpft mit einem Datentypen an einer einzigen Stelle (die Klassendefinition) zu schreiben hat den gleichen Effekt.<\/li>\n<li><strong>relations between classes<\/strong>: Python wei\u00df, dass die <code>index<\/code>-Methode eine Sache f\u00fcr einen string und was anderes f\u00fcr eine Liste bedeuten kann. Ebenso kann Python nicht nur Files auf deinem Computer lesen und schreiben, sondern auch auf dem Internet. In beiden F\u00e4llen (Zeichen oder Listenfolgen und lokale oder ferne Files) k\u00f6nnen die verwandten Klassen durch das Konzept der Vererbung (<em>inheritance<\/em>) in einer gleichf\u00f6rmigen Weise behandelt werden.<\/li>\n<\/ul>\n<p>Im Rest der CS Kreise werden wir nur Objekte und Methoden <em>benutzen<\/em>; du kannst sp\u00e4ter mehr \u00fcber<br \/>\ndas Erstellen eigener Klassen lernen (siehe Ressourcen-Seite).<\/p>\n<p>Die n\u00e4chsten drei Lektionen k\u00f6nnen in beliebiger Reihenfolge durchgearbeitet werden und sie geben eine Vielfalt von Herausforderungen, die teilweise Themen von fr\u00fcheren Lektionen beinhalten.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bislang haben wir eine Reihe von Datenstrukturen in Python gesehen: strings und Listen. Jede von ihnen unterst\u00fctzt mehrere Methoden, die Varianten von Funktionen sind. Zum Beispiel ist eine Methode von Listen die reverse() Methode. Wie der Name schon andeutet, kehrt &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/14-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-5528","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5528","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=5528"}],"version-history":[{"count":27,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5528\/revisions"}],"predecessor-version":[{"id":15944,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5528\/revisions\/15944"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=5528"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}