{"id":5510,"date":"2012-09-12T20:17:33","date_gmt":"2012-09-13T00:17:33","guid":{"rendered":"http:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=5510"},"modified":"2024-07-11T05:28:03","modified_gmt":"2024-07-11T09:28:03","slug":"10-de","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/10-de\/","title":{"rendered":"10: def"},"content":{"rendered":"\n<p>In dieser Lektion zeigen wir dir die wichtigste Idee beim Programmieren: definiere deine eigenen Funktionen! Funktionen erlauben es dir, deine Programme k\u00fcrzer zu machen, besser zu organisieren, leichter zu lesen und zu debuggen und besser wiederzuverwenden. In sp\u00e4teren Lektionen werden wir andere Vorteile sehen wie zum Beispiel <em>Rekursion<\/em>.<\/p>\n<h1>Eine Funktion definieren<\/h1>\n<p>Wir beginnen mit einem Beispiel. Erinnerst du dich an die Funktion <code>abs<\/code>? Sie nimmt ein Argument, n\u00e4mlich eine Zahl <em>x<\/em>, und gibt deren \"Absolutbetrag\" zur\u00fcck (der <em>x<\/em> ist, wenn <em>x<\/em> &gt; 0 ist und -<em>x<\/em> wenn <em>x<\/em> &lt; 0 ist).<\/p>\n<p>Die Art und Weise, diese Funktion in Python zu definieren, sieht so aus:<\/p>\n<pre>def abs(x):     # definiere eine Funktion 'abs' mit einem Argument 'x'\n  if x &gt;= 0:    # Funktionsk\u00f6rper beginnt hier\n    return x\n  else:\n    return -x   # Funktionsk\u00f6rper endet hier<\/pre>(Klicke <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/console\/?consolecode=def%20abs%28x%29%3A%20%23%20definiere%20eine%20Funktion%20%27abs%27%20mit%20einem%20Argument%20%27x%27%0A%20if%20x%20%26gt%3B%3D%200%3A%20%23%20Funktionsk%C3%B6rper%20beginnt%20hier%0A%20%20return%20x%0A%20else%3A%0A%20%20return%20-x%20%23%20Funktionsk%C3%B6rper%20endet%20hier%0A%0A%23%20Programm%20beginnt%20hier%0Aprint%28abs%28-5%29%29%0Aprint%28abs%2810%29%29\" target=\"_blank\">hier<\/a> um diesen Code in der Konsole zu testen.)<\/p>\n<h2>Die zwei Teile einer Funktionsdefinition<\/h2>\n<p>Die erste Zeile in einer Funktionsdefinition spezifiziert den <em>Namen<\/em> der Funktion und die <em>Argumente<\/em> der Funktion. Sie sieht folgenderma\u00dfen aus:<\/p>\n<p style=\"text-align: center;\"><code>def \u00abfunction-name\u00bb(\u00abargument-list\u00bb):<\/code><\/p>\n<p>In dem obigen Beispiel ist <code>abs<\/code> der Name der Funktion und die Argumentliste enth\u00e4lt ein Argument <code>x<\/code>. Sie wird <em>Argumentliste<\/em> genannt, weil es mehrere Argumente geben kann, wie zum Beispiel <code>x, y, z<\/code>; es ist au\u00dferdem m\u00f6glich, null Argumente zu haben, also eine leere Argumentliste. <strong>Die Argumente sind der Input der Funktion.<\/strong><\/p>\n<p>Alles nach der ersten Zeile einer Funktionsdefinition ist der <em>K\u00f6rper<\/em> der Funktion. Der K\u00f6rper ist ein einger\u00fcckter Codeblock. Wann immer die Funktion aufgerufen wird, wird der K\u00f6rper ausgef\u00fchrt mit Bezug auf diese Argumente\/Inputs. Und schlie\u00dflich, wenn wir diese Zeile im K\u00f6rper der Funktion erreichen,<\/p>\n<p style=\"text-align: center;\"><code>return \u00abvalue\u00bb<\/code><\/p>\n<p>h\u00f6rt die Funktion auf und gibt <code>\u00abvalue\u00bb<\/code> als <strong>output<\/strong> aus. Das bedeutet, dass <strong>der ausgegebene Wert der Output der Funktion ist<\/strong>. Wie das <code>abs<\/code> Beispiel zeigt, kann der K\u00f6rper mehrere <code>return<\/code> Statements beinhalten; aber nur das erste ausgef\u00fchrte hat einen Effekt, da die Funktion danach aufh\u00f6rt, auszuf\u00fchren.<\/p>\n<h2>Beispiel: Definition und Aufrufen einer Funktion<\/h2>\n<p>Das folgende Programm enth\u00e4lt eine Funktionsdefinition und einige andere Statements, die ausgef\u00fchrt werden, nachdem die Funktion definiert wird.<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>Squaring function<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 162px;'><textarea wrap='off' name='usercode0' id='usercode0'  cols=10 rows=6 readonly='readonly'  style = 'height : 162px;'  class='pyboxCode RO'>\ndef square(x):     # function definition\n    return x*x     # body only has one line\n\n# use the function, now that it's defined\nprint(square(10))        \nprint(square(square(2)))<\/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=\"cf1690c85d493f0af0ea53c0ee59be8c\"\/>\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>Wir sehen, dass der Name der Funktion <code>square<\/code> ist, es gibt nur ein Argument <code>x<\/code>, und dass der K\u00f6rper der Funktion nur aus einer Ausgabezeile <code>x*x<\/code> besteht. Weiterhin, au\u00dferhalb der Funktion, haben wir zwei Befehle, die die Funktion insgesamt dreimal aufrufen.<\/p>\n<ol>\n<li>Wenn der erste Befehl ausgef\u00fchrt wird, muss Python <code>square(10)<\/code> evaluieren.\n<ul>\n<li>Python vergleicht die Liste von Inputs <code>(10)<\/code> mit der Argumentliste <code>(x)<\/code>. Also f\u00fchrt es den K\u00f6rper der Funktion <code>return x*x<\/code> aus, w\u00e4hrend es sich erinnert, dass <code>x<\/code> gleich <code>10<\/code> ist. So ergibt <code>x*x<\/code> das Ergebnis <code>100<\/code>, das auch ausgegeben wird.<\/li>\n<\/ul>\n<\/li>\n<li>Wenn der zweite Befehl ausgef\u00fchrt wird, muss Python <code>square(square(2))<\/code> ermitteln.\n<ul>\n<li>Der innere Teil <code>square(2)<\/code> wird zuerst bestimmt. Wir setzen zwischenzeitlich <code>x<\/code> gleich <code>2<\/code> und f\u00fchren den Funktionsk\u00f6rper aus, der <code>4<\/code> ausgibt.<\/li>\n<li>Dann wird der \u00e4u\u00dfere Ausdruck evaluiert; da <code>square(2)<\/code> n\u00e4mlich <code>4<\/code> ergibt, rufen wir nun <code>square(4)<\/code> auf. Dies ergibt <code>16<\/code>, was ausgegeben wird.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Wie \u00fcblich, kannst du versuchen, herauszufinden, wie dies im <a href=\"http:\/\/cscircles.cemc.uwaterloo.ca\/visualize\">Python3 Visualizer<\/a> aussieht.<\/p>\n<h2>Vier h\u00e4ufige Fehler<\/h2>\n<p>Ein h\u00e4ufiger Fehler, den du beim Definieren einer Funktion machen kannst, ist es, das <code>return<\/code> Statement zu vergessen.<\/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>Fehler 1: <code>return<\/code> vergessen<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'>\ndef square(x):\n x*x\nprint(square(10))<\/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=\"f83127780e17d71297a9c8bd7ec2e56b\"\/>\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>Wie du sehen kannst, wenn kein <code>return<\/code> Statement im K\u00f6rper angetroffen wird, ergibt die Funktion automatisch <code>None<\/code>. Also, wenn du bei einer \u00dcbung erfolglos bleibst, weil eine Funktion <code>None<\/code> ausgibt, ist das Problem oft, dass irgendein Funktionsinput nicht dazu f\u00fchrt, dass ein <code>return<\/code> Statement ausgef\u00fchrt wird.<\/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> Es kann sein, dass du bewusst ein <code>return<\/code> Statement wegl\u00e4sst. Dies macht nur dann Sinn, wenn deine Funktion einen Nebeneffekt hat, der sich von seinem Ausgabewert unterscheidet, zum Beispiel die Ausgabe eines Outputs:<form class=\"pbform\" action=\"#\" id=\"pbform2\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox2'>\n<div class=\"heading\"><span class='type'>Example: <\/span><span class='title'>Ein Nebeneffekt und kein <code>return<\/code> Statement<\/span><\/div> <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'>\ndef repeatedPrint(string, repetitions): # no returns in this function\n for i in range(0, repetitions):\n  print(string)\n\nrepeatedPrint('Hello, world!', 3)<\/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=\"cd7f2c410ee4c5113604fd147498e4f9\"\/>\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  <\/span><\/td><\/table><\/p>\n<p>Ein anderer h\u00e4ufiger Fehler ist es, zu vergessen, den Code einzur\u00fccken, was einen <code>IndentationError<\/code> zum Ergebnis hat.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform3\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox3'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Fehler 2: Vergessen, den Code einzur\u00fccken<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 84px;'><textarea wrap='off' name='usercode3' id='usercode3'  cols=10 rows=3 readonly='readonly'  style = 'height : 84px;'  class='pyboxCode RO'>\ndef square(x):\nreturn x*x\nprint(square(10))<\/textarea><\/div>\n<div id='pbhistory3' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit3' value=' '\/><\/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,'N')\" ><\/td>\n<\/tr><\/table><\/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=\"76a9707ae41952893106ccb9765ef1ba\"\/>\n<div id='pbresults3' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit3\").value = \"Run program\";document.getElementById(\"inputInUse3\").value = \"N\";<\/script>\n<\/p>\n<p>Wie wir in Lektion 2 gesehen haben, f\u00fchrt das Aufrufen von zu wenigen oder zu vielen Argumenten zu einem Fehler.<\/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>Fehler 3: Zu viele Argumente aufgerufen<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 84px;'><textarea wrap='off' name='usercode4' id='usercode4'  cols=10 rows=3 readonly='readonly'  style = 'height : 84px;'  class='pyboxCode RO'>\ndef square(x):\n return x*x\nprint(square(7, 11))<\/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=\"3008c56ca0d4a577a1d75980a06b95d2\"\/>\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>Schlussendlich, wenn du einen Tippfehler machst, wenn du die Funktion definierst oder sie aufrufst, wirst du einen Fehler erhalten, der dir sagt, dass die Funktion undefiniert ist.<\/p>\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>Fehler 4: Falscher Name<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'>\ndef square(x):\n return x*x\nprint(skware(10))<\/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=\"cff9a35789a20c570f787dab4917ddf5\"\/>\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<h2>Probiere es selbst aus<\/h2>\n<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> <p>F\u00fcr diese und zuk\u00fcnftige \u00dcbungen braucht kein <code>input()<\/code>&nbsp;oder&nbsp;<code>print()<\/code> verwendet zu werden, wenn du aufgefordert wirst, \"eine Funktion zu programmieren\". Wir werden f\u00fcr Dich die Funktion mit bestimmten Argumenten automatisch <i>aufrufen<\/i> und die Ergebnisse direkt bewerten, die die Funktion <em>zur\u00fcckgibt<\/em>.<\/p> <p><\/p> <p>Eine richtige L\u00f6sung f\u00fcr diese \u00dcbung wird aus zwei Zeilen bestehen (siehe \"Die zwei Teile einer Funktionsdefinition\" am Anfang dieser Lektion).<\/p> <\/span><\/td><\/table>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform6\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox6'>\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'>Cubism<\/span><\/div>Schreibe eine Funktion <code>cube(n)<\/code>, die eine Zahl <code>n<\/code> als Eingabe nimmt und <code>n<\/code> * <code>n<\/code> * <code>n<\/code> zur\u00fcckgibt.<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='usercode6' id='usercode6'  cols=10 rows=20   class='pyboxCode RW'>\n# delete this comment and enter your code here\n<\/textarea><\/div>\n<div id='pbhistory6' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput6\">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='submit6' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch6\" value=\"Input Switch\" onclick=\"pbInputSwitch(6,'Y')\" ><\/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,'Y')\" ><\/td>\n<\/tr><\/table><select id='pbSelect6' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(6,'10.cube')\" >History<\/option>\n<option name='help' data-pbonclick=\"helpClick(6);\" >Help<\/option>\n<\/select><\/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=\"72d514655d307489b0eb30eec6d6852e\"\/>\n<div id='pbresults6' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>jQuery(function(){pbToggleCodeMirror(6);});pbInputSwitch(6,\"Y\");<\/script>\n<\/p>\n<h2>Zwei oder mehr Argumente<img loading=\"lazy\" decoding=\"async\" class=\"alignright\" src=\"..\/wp-content\/lesson_files\/img\/10\/area-triangle.png\" alt=\"\" width=\"176\" height=\"219\"><\/h2>\n<p>Die Funktionen oben nahmen nur ein Argument, aber eine Funktion kann so konstruiert sein, dass sie jedwede Zahl an Argumenten akzeptiert. Zum Beispiel hast du bereits <code>input()<\/code> mit 0 Argumenten verwendet (und in Lektion 15A wirst du selbst eine Funktion mit null Argumenten definieren).<\/p>\n<p>Hier ist ein Beispiel mit zwei Argumenten aus der Geometrie. Stellen wir uns vor, wir brauchen eine Funktion, um die Fl\u00e4che (engl.: area) eines Dreiecks zu berechnen, mit gegebener L\u00e4nge der Grundlinie (engl.: base) und seiner H\u00f6he (engl.: height).<br>Die Formel f\u00fcr die Fl\u00e4che ist<\/p>\n<p style=\"text-align: center;\">area = base \u00d7 height \/ 2<\/p>\n<p>Dann k\u00f6nnen wir in Python eine Funktion <code>triangleArea<\/code> folgenderma\u00dfen definieren:<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform7\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox7'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Eine Funkion mit zwei Argumenten<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 110px;'><textarea wrap='off' name='usercode7' id='usercode7'  cols=10 rows=4 readonly='readonly'  style = 'height : 110px;'  class='pyboxCode RO'>\ndef triangleArea(base, height):\n return base*height\/2\nprint(triangleArea(3, 5))\nprint(triangleArea(4, 2))<\/textarea><\/div>\n<div id='pbhistory7' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit7' value=' '\/><\/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,'N')\" ><\/td>\n<\/tr><\/table><\/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=\"96014db0de84b6e3139624dd300611be\"\/>\n<div id='pbresults7' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit7\").value = \"Run program\";document.getElementById(\"inputInUse7\").value = \"N\";<\/script>\n<\/p>\n<p>Eine andere wichtige zu beachtende Sache ist, dass es einen Unterschied macht,<br>wann eine Funktion <em>definiert<\/em> wird und wann sie <em>ausgef\u00fchrt<\/em> wird.<br>Der K\u00f6rper l\u00e4uft nicht bis die Funktion tats\u00e4chlich aufgerufen wird.<br>Mach die folgende \u00dcbung um dies zu testen:<\/p>\n<div class='pybox modeNeutral' id='pybox8'>\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'>In-n-Out<\/span><\/div><div> Was ist die Ausgabe des folgenden Programms?<\/p> <pre>def f():          # function of 0 arguments<br\/>   print(\"in f\")<br\/>print(\"not in f\")<br\/>f()               # call f now<\/pre><\/div><label>Your choice: <\/label><select id=\"pyselect8\"><option value=\"d\" selected>Select one<\/option><option value=\"r\">2 lines: 'not in f', then 'in f'<\/option><option value=\"w\">3 lines: 'in f', then 'not in f', then 'in f'<\/option><option value=\"w\">2 lines: 'in f', then 'not in f'<\/option><\/select><div class='pyboxbuttons'><input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" name=\"slug\" value=\"10.order\"\/><input type='submit' style='margin:5px;' value='Check answer' onClick='pbMultiCheck(8)'\/><\/div><div class=\"pbresults\" id=\"pyMultiResults8\"><\/div><div class=\"epilogue\">Richtig! Die Funktion <code>f<\/code> wird vor allem als erstes definiert, aber ihr K\u00f6rper nicht sofort ausgef\u00fchrt. Nachdem die Funktion definiert ist, geben wir <code>not in f<\/code> aus. Dann wird die Funktion aufgerufen und ihr K\u00f6rper ausgef\u00fchrt, der <code>in f<\/code> ausgibt.<\/div><\/div>\n<p><img decoding=\"async\" class=\"alignright\" src=\"..\/wp-content\/lesson_files\/img\/10\/peri-rect.png\" alt=\"\">Wie du sehen kannst, ist die einzige \u00c4nderung die, dass wir <code>def \u00abfunction-name\u00bb(\u00abargument1\u00bb)<\/code> ersetzt haben durch <code>def \u00abfunction-name\u00bb(\u00abargument1\u00bb, \u00abargument2\u00bb)<\/code>.<\/p>\n<p>In der letzten \u00dcbung bitten wir dich, deine eigene Funktion mit zwei Argumenten zu schreiben, um den Umfang eines Rechtecks zu berechnen (der Umfang ist die Gesamtl\u00e4nge aller Seiten). In einem Rechteck mit vorgegebener Breite (engl.: width) und H\u00f6he (engl.: height), wird sein Umfang von der folgenden Formel berechnet:<\/p>\n<p style=\"text-align: center;\">perimeter = width + height + width + height<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform9\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox9'>\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'>Rectangle<\/span><\/div>Schreibe eine Funktion <code>rectanglePerimeter(width, height)<\/code>, die den Umfang eines Rechtecks bestimmt. <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='usercode9' id='usercode9'  cols=10 rows=20   class='pyboxCode RW'>\n# delete this comment and enter your code here\n<\/textarea><\/div>\n<div id='pbhistory9' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput9\">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='submit9' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch9\" value=\"Input Switch\" onclick=\"pbInputSwitch(9,'Y')\" ><\/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,'Y')\" ><\/td>\n<\/tr><\/table><select id='pbSelect9' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(9,'10.rectangle')\" >History<\/option>\n<option name='help' data-pbonclick=\"helpClick(9);\" >Help<\/option>\n<\/select><\/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=\"e8f7d1054e7d5bc2c173b9a13270ec81\"\/>\n<div id='pbresults9' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>jQuery(function(){pbToggleCodeMirror(9);});pbInputSwitch(9,\"Y\");<\/script>\n<\/p>\n<h3>Rekursive Funktionsaufrufe<\/h3>\n<p>Funktionen sind die Basiskomponenten von gut konstruierten gro\u00dfen Programmen: du kannst die selbe Aufgabe zweimal machen, ohne den selben Code zweimal zu schreiben, und du kannst L\u00f6sungen f\u00fcr h\u00e4ufige Aufgaben wiederverwenden. Hier ist ein Beispiel daf\u00fcr, eine Funktion zu schreiben und sie in einer anderen zu verwenden.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform10\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox10'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div><em>Kannst du erraten, was dieses Programm macht, bevor du es ausf\u00fchrst?<\/em> <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> Erinnere dich an Lektion 4 daran, dass eine Multiplikation von Strings und ganzen Zahlen bedeutet, den String um diese Zahl zu wiederholen. So ist zum Beispiel <code>\"tar\"*2<\/code> gleich <code>\"tartar\"<\/code>. <\/span><\/td><\/table><div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 318px;'><textarea wrap='off' name='usercode10' id='usercode10'  cols=10 rows=12 readonly='readonly'  style = 'height : 318px;'  class='pyboxCode RO'>\ndef inner(string, width):\n  return string + \" \" * (width - len(string))\n\ndef outer(string1, string2):\n  w = max(len(string1), len(string2))\n  print(\"*\" * (w + 4))\n  print(\"* \" + inner(string1, w) + \" *\")\n  print(\"* \" + inner(string2, w) + \" *\")\n  print(\"*\" * (w + 4))\n\nouter(\"Box number one\", \"is very fun\")\nouter(\"Box #2\", \"(not False) is \" + str(not False))<\/textarea><\/div>\n<div id='pbhistory10' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit10' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(10)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(10,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse10\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"10\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"b3f1e99d867c3a8e50987a740ff5d87b\"\/>\n<div id='pbresults10' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit10\").value = \"Run program\";document.getElementById(\"inputInUse10\").value = \"N\";<\/script>\n<\/p>\n<p>Du bist jetzt bereit f\u00fcr die n\u00e4chste Lektion!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In dieser Lektion zeigen wir dir die wichtigste Idee beim Programmieren: definiere deine eigenen Funktionen! Funktionen erlauben es dir, deine Programme k\u00fcrzer zu machen, besser zu organisieren, leichter zu lesen und zu debuggen und besser wiederzuverwenden. In sp\u00e4teren Lektionen werden &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/10-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-5510","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5510","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=5510"}],"version-history":[{"count":39,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5510\/revisions"}],"predecessor-version":[{"id":15941,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5510\/revisions\/15941"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=5510"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}