{"id":9973,"date":"2017-05-18T02:08:20","date_gmt":"2017-05-18T06:08:20","guid":{"rendered":"https:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=9973"},"modified":"2017-07-01T14:07:07","modified_gmt":"2017-07-01T18:07:07","slug":"10-pl","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/10-pl\/","title":{"rendered":"10: def"},"content":{"rendered":"<!-- Please retain this notice and add more notes if you create a new version.<br \/>\nOriginal lesson author: David Pritchard, daveagp@gmail.com, http:\/\/cscircles.ca<br \/>\nLicense: http:\/\/creativecommons.org\/licenses\/by-nc-sa\/3.0\/-->\n<h1>Definicja funkcji<\/h1>\n<p>W tej lekcji poka\u017cemy najwa\u017cniejsz\u0105 ide\u0119 programowania: definiowanie w\u0142asnych funkcji! Funkcje pozwalaj\u0105 uczyni\u0107 program kr\u00f3tszym, lepiej zorganizowanym, \u0142atwiejszym do odczytania, debugowania i co te\u017c jest wa\u017cne, funkcje s\u0105 wielokrotnego u\u017cytku. W p\u00f3\u017aniejszych lekcjach zobaczymy inne korzy\u015bci, takie jak <em>rekurencja<\/em> (rekursja).<\/p>\n<p>Zaczniemy od przyk\u0142adu. Pami\u0119tasz funkcj\u0119 <code>abs<\/code>? Pobiera jeden argument (liczb\u0119 <em>x<\/em>) i zwraca warto\u015b\u0107 bezwzgl\u0119dn\u0105 (czyli <em>x<\/em>, gdy <em>x<\/em> \u2265 0, i -<em>x<\/em>, gdy  <em>x<\/em> &lt; 0). Spos\u00f3b definiowania tej funkcji w Pythonie jest nast\u0119puj\u0105cy:<\/p>\n<pre>def abs(x):     # definicja funkcji o nazwie 'abs' z jednym argumentem o nazwie 'x'\r\n  if x &gt;= 0:    # tu si\u0119 zaczyna cia\u0142o funkcji\r\n    return x\r\n  else:\r\n    return -x   # tu si\u0119 ko\u0144czy cia\u0142o funkcji<\/pre>(Kliknij <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/console\/?consolecode=def%20abs%28x%29%3A%20%23Function%20definition%0A%20%20if%20x%20%26gt%3B%3D%200%3A%0A%20%20%20%20return%20x%0A%20%20else%3A%20%20%0A%20%20%20%20return%20-x%0A%0A%23%20Main%20program%20begins%20here%0Aprint%28abs%28-5%29%29%0Aprint%28abs%2810%29%29\" target=\"_blank\">tutaj<\/a> aby zobaczy\u0107 ten kod w konsoli.)<\/p>\n<h2>Dwie Cz\u0119\u015bci Definicji Funkcji<\/h2>\n<p>Pierwsza linia w definicji funkcji okre\u015bla nazw\u0119 funkcji i jej <em>argumenty<\/em>. To powinno wygl\u0105da\u0107 tak<\/p>\n<p style=\"text-align: center;\"><code>def \u00abfunction-name\u00bb(\u00abargument-list\u00bb):<\/code><\/p>\n<p>W powy\u017cszym przyk\u0142adzie <code>abs<\/code> by\u0142 nazw\u0105 funkcji, a <code>x<\/code> list\u0105 argument\u00f3w. Jest to <em>lista argument\u00f3w<\/em>, poniewa\u017c mo\u017ce istnie\u0107 wiele argument\u00f3w, takich jak <code>x, y, z<\/code>; Mo\u017cliwe jest r\u00f3wnie\u017c zero argument\u00f3w, tzn. pusta lista. <strong>Argumenty s\u0105 wej\u015bciami funkcji<\/strong>.<\/p>\n<p>Wszystko po pierwszej linijce definicji funkcji jest <em>cia\u0142em<\/em> funkcji. Cia\u0142o jest wci\u0119tym blokiem kodu. Kiedy wywo\u0142ana jest funkcja, cia\u0142o jest wykonywane na tych argumentach \/ wej\u015bciach. Wreszcie, kiedy docieramy do tej linii w ciele funkcyjnym,<\/p>\n<p style=\"text-align: center;\"><code>return \u00abvalue\u00bb<\/code><\/p>\n<p>funkcja przestaje dzia\u0142a\u0107 i zwraca <code>\u00abvalue\u00bb<\/code> jako wyj\u015bcie. Oznacza to, \u017ce <strong>warto\u015b\u0107 zwracana jest wynikiem funkcji<\/strong>. Jak pokazuje przyk\u0142ad <code>abs<\/code>, cia\u0142o mo\u017ce zawiera\u0107 kilka <code>wyj\u015b\u0107<\/code>; Ale tylko pierwszy wykonany ma sw\u00f3j efekt, poniewa\u017c funkcja przestaje dzia\u0142a\u0107.<\/p>\n<h2>Przyk\u0142ad: Definiowanie i Wywo\u0142anie Funkcji<\/h2>\n<p>Poni\u017cszy program zawiera definicj\u0119 funkcji i niekt\u00f3re inne instrukcje, kt\u00f3re s\u0105 wykonywane po zdefiniowaniu funkcji. Czy mo\u017cesz odgadn\u0105\u0107, jakie b\u0119dzie wyj\u015bcie?<\/p>\n<p><iframe width='100%' height='480' frameborder='0' scrolling='no' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/OnlinePythonTutor3-cemc\/iframe-embed.html#code=def+square%28x%29%3A+++++%23+function+definition%0A++++return+x%2Ax+++++%23+body+only+has+one+line%0A%0A%23+use+the+function%2C+now+that+it%27s+defined%0Aprint%28square%2810%29%29++++++++%0Aprint%28square%28square%282%29%29%29&cumulative=false&heapPrimitives=false&drawParentPointers=false&textReferences=false&showOnlyOutputs=false&py=3&curInstr=0&resizeContainer=true&highlightLines&width=460&rightStdout=1'><\/iframe><\/p>\n<p>Widzimy, \u017ce funkcja nazywa si\u0119 <code>kwadrat<\/code> i ma tylko jeden argument <code>x<\/code>, a cia\u0142o funkcji sk\u0142ada si\u0119 z jednej linii <code>return x*x<\/code>. Nast\u0119pnie, poza funkcj\u0105 mamy dwa polecenia, kt\u00f3re wywo\u0142uj\u0105 t\u0119 funkcj\u0119 \u0142\u0105cznie trzy razy.<\/p>\n<p>Jak pokazuje wizualizator, ka\u017cdorazowo przydzielany jest funkcji oddzielny fragmentu przestrzeni roboczej (a <strong>frame<\/strong>, ramka). Po zwr\u00f3ceniu funkcji ta przestrze\u0144 robocza nie jest ju\u017c potrzebna i jest wymazywana.<\/p>\n<p>Tutaj s\u0142ownie wyja\u015bnione s\u0105 kolejne krok programu:<\/p>\n<ol>\n<li>Kiedy wykonywane jest pierwsze polecenie, Python musi obliczy\u0107 <code>kwadrat(10)<\/code>.\n<ul>\n<li>Python por\u00f3wnuje list\u0119 na wej\u015bciu <code>(10)<\/code> z list\u0105 argument\u00f3w <code>(x)<\/code>. Wykonuje cia\u0142o funkcji <code>x * x<\/code>, pami\u0119taj\u0105c, \u017ce <code>x<\/code> r\u00f3wna si\u0119 <code>10<\/code>. Dlatego <code>x * x<\/code> daje <code>100<\/code>, kt\u00f3re jest drukowane.<\/li>\n<\/ul>\n<\/li>\n<li>Gdy wykonywane jest drugie polecenie, Python musi obliczy\u0107 <code>kwadrat(kwadrat(2))<\/code>.\n<ul>\n<li>Najpierw rozwa\u017cana jest wewn\u0119trzna cz\u0119\u015b\u0107 <code>kwadrat(2)<\/code>. Tymczasowo x jest r\u00f3wne 2 i realizowane jest cia\u0142o funkcji, kt\u00f3re zwraca <code>4<\/code>.<\/li>\n<li>Nast\u0119pnie brana jest pod uwag\u0119 zewn\u0119trzna cz\u0119\u015b\u0107; poniewa\u017c <code>kwadrat(2)<\/code> da\u0142 <code>4<\/code>, teraz mamy <code>kwadrat(4)<\/code>. To zwraca <code>16<\/code>, kt\u00f3re jest drukowane. <\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h2>Cztery Najcz\u0119stsze B\u0142\u0119dy<\/h2>\n<p>Jednym z b\u0142\u0119d\u00f3w pope\u0142nionym podczas definiowania funkcji jest zapominanie o instrukcji \u00a0<code>return<\/code>.<\/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>B\u0142\u0105d 1: zapomnienie <code>return<\/code><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'>\ndef square(x):\n  x*x\nprint(square(10))<\/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=\"d401a99df9d67e64488be6a811464442\"\/>\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>Jak wida\u0107, je\u015bli w ciele nie ma <code>return<\/code>, funkcja domy\u015blnie zwraca <code>None<\/code> . Tak wi\u0119c, je\u015bli s\u0105 jakiekolwiek braki  w zadaniu, funkcja zwraca <code>None<\/code>; cz\u0119sto problem ten wyst\u0119puje w zwi\u0105zku z  faktem, \u017ce niekt\u00f3re wej\u015bcia funkcji nie powoduj\u0105 wykonania instrukcji <code>return<\/code>.<\/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> Mo\u017cesz te\u017c celowo pomin\u0105\u0107 instrukcje <code>return<\/code>. Ma to sens tylko wtedy, gdy Twoja funkcja ma jaki\u015b efekt uboczny inny ni\u017c jego warto\u015b\u0107 zwracana, na przyk\u0142ad drukowanie niekt\u00f3rych danych wyj\u015bciowych:<form class=\"pbform\" action=\"#\" id=\"pbform1\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox1'>\n<div class=\"heading\"><span class='type'>Example: <\/span><span class='title'>Efekt uboczny i brak instrukcji return<\/span><\/div> <div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 136px;'><textarea wrap='off' name='usercode1' id='usercode1'  cols=10 rows=5 readonly='readonly'  style = 'height : 136px;'  class='pyboxCode RO'>\ndef repeatedPrint(string, repetitions):   # brak w funkcji return\n  for i in range(0, repetitions):\n    print(string)\n\nrepeatedPrint('Hello, world!', 3)<\/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=\"bd032fccb8b97fa03233636379d4efb5\"\/>\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  <\/span><\/td><\/table><\/p>\n<p>Innym cz\u0119stym b\u0142\u0119dem jest zapominanie o wci\u0119ciu kodu, co powoduje <code>IndentationError<\/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>B\u0142\u0105d 2: zapomnienie wci\u0119cia<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 84px;'><textarea wrap='off' name='usercode2' id='usercode2'  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='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=\"76a9707ae41952893106ccb9765ef1ba\"\/>\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>Jak widzieli\u015bmy w lekcji 2, wywo\u0142anie za ma\u0142o lub zbyt wiele argument\u00f3w powoduje b\u0142\u0105d.<\/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>B\u0142\u0105d 3: wywo\u0142anie zbyt wielu argument\u00f3w<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):\n  return x*x\nprint(square(7, 11))<\/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=\"f5b2120c0fc6ad7f25132dea204179c4\"\/>\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>Na koniec, je\u015bli podczas definiowania lub wywo\u0142ywania funkcji pope\u0142nisz typowy b\u0142\u0105d, otrzymasz informacj\u0119 o b\u0142\u0119dzie, \u017ce funkcja jest niezdefiniowana.<\/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>B\u0142\u0105d 4: b\u0142\u0105d nazwy<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(skware(10))<\/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=\"5155fcb74e9e404c28b06beff82cd471\"\/>\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<h2>Spr\u00f3buj Sam<\/h2>\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> Nie musisz u\u017cywa\u0107 <code>input()<\/code>, czy <code>print()<\/code>  w tym, ani w kolejnych \u0107wiczeniach, w kt\u00f3rych zostaniesz poproszony o \"zdefiniowanie funkcji\". Nasz tester automatycznie <em>wywo\u0142a<\/em> Twoj\u0105 funkcj\u0119 z argumentami, sprawdzi wynik i bezpo\u015brednio <em>zwr\u00f3ci<\/em> . <\/p>\n<p>Prawid\u0142owym rozwi\u0105zaniem tego szczeg\u00f3lnego \u0107wiczenia b\u0119d\u0105 2 wiersze  (zobacz na g\u00f3rze tej lekcji 'Dwie Cz\u0119\u015bci Definicji Funkcji'). <\/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'>Sze\u015bcian<\/span><\/div>Zdefiniuj funkcj\u0119  <code>cube(n)<\/code>, kt\u00f3ra pobiera na wej\u015bciu jedn\u0105 liczb\u0119 <code>n<\/code> a wy\u015bwietla na wyj\u015bciu jego sze\u015bcian <code>n<\/code> \u00d7 <code>n<\/code> \u00d7 <code>n<\/code>.<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 name=\"pyinput\" id=\"pyinput5\">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='submit5' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch5\" value=\"Input Switch\" onclick=\"pbInputSwitch(5,'Y')\" ><\/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<\/tr><\/table><select id='pbSelect5' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(5,'10.cube')\" >History<\/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=\"2e16ec52f96587d06f2328458141d232\"\/>\n<div id='pbresults5' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>jQuery(function(){pbToggleCodeMirror(5);});pbInputSwitch(5,\"Y\");<\/script>\n<\/p>\n<h2>Dwa Argumenty lub Wi\u0119cej<img decoding=\"async\" class=\"alignright\" src=\"..\/wp-content\/lesson_files\/img\/10\/area-triangle-pl.png\" alt=\"\" \/><\/h2>\n<p>Powy\u017csze funkcje pobieraj\u0105 tylko jeden argument, ale funkcja mo\u017ce zosta\u0107 zaprojektowana do pobierania dowolnej liczby argument\u00f3w. Na przyk\u0142ad, chcesz wywo\u0142a\u0107 <code>input()<\/code>  z 0 argumentami (zdefiniujesz funkcj\u0119 z zerowymi argumentami w lekcji 15A).<\/p>\n<p>Oto przyk\u0142ad z geometrii z <strong>dwoma argumentami<\/strong>. Za\u0142\u00f3\u017cmy, \u017ce potrzebujemy funkcj\u0119 do obliczania pola tr\u00f3jk\u0105ta dysponuj\u0105c d\u0142ugo\u015bci\u0105 podstawy i jego wysoko\u015bci\u0105. Wz\u00f3r na pole:<\/p>\n<p style=\"text-align: center;\">pole = podstawa \u00d7 wysoko\u015b\u0107 \/ 2<\/p>\n<p>W kodzie wygl\u0105da to tak: wymieniamy\u00a0<code>def \u00abfunction-name\u00bb(\u00abargument1\u00bb)<\/code>\u00a0z\u00a0<code>def \u00abfunction-name\u00bb(\u00abargument1\u00bb, \u00abargument2\u00bb)<\/code>.<\/p>\n<p><iframe width='100%' height='480' frameborder='0' scrolling='no' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/OnlinePythonTutor3-cemc\/iframe-embed.html#code=def+triangleArea%28base%2C+height%29%3A%0A++return+base%2Aheight%2F2%0Aprint%28triangleArea%283%2C+5%29%29%0Aprint%28triangleArea%284%2C+2%29%29&cumulative=false&heapPrimitives=false&drawParentPointers=false&textReferences=false&showOnlyOutputs=false&py=3&curInstr=0&resizeContainer=true&highlightLines&width=345&rightStdout=1'><\/iframe><\/p>\n<p>Inn\u0105 wa\u017cn\u0105 rzecz\u0105 na kt\u00f3r\u0105 trzeba zwr\u00f3ci\u0107 jest to, \u017ce gdy funkcja jest <em>definiowana<\/em>, to r\u00f3\u017cni si\u0119 od funkcji kiedy jest <em>wykonywana<\/em>. Cia\u0142o nie dzia\u0142a, dop\u00f3ki funkcja nie zostanie faktycznie wywo\u0142ana. Aby to sprawdzi\u0107, wykonaj poni\u017csze \u0107wiczenie:<\/p>\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'>Multiple Choice Exercise: <\/span><span class='title'>In-n-Out<\/span><\/div><div> Co otrzymamy na wyj\u015bciu tego programu? <\/p>\n<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=\"pyselect6\"><option value=\"d\" selected>Select one<\/option><option value=\"r\">2 lines: 'not in f', then 'in f'<\/option><option value=\"w\">2 lines: 'in f', then 'not in f'<\/option><option value=\"w\">3 lines: 'in f', then 'not in f', then '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(6)'\/><\/div><div class=\"pbresults\" id=\"pyMultiResults6\"><\/div><div class=\"epilogue\">Poprawnie! Funkcja <code>f<\/code> jest zdefiniowana jako pierwsza, ale cia\u0142o nie jest od razu wykonywane. Po funkcji, drukujemy wyj\u015bcie <code>not in f<\/code>. Dopiero po tym, wywo\u0142ywana jest funkcja, cia\u0142o jest realizowane i drukowane <code>in f<\/code>.<\/div><\/div>\n<p><img decoding=\"async\" class=\"alignright\" style=\"color: #333333; font-style: normal; line-height: 24px; margin-top: 0.4em;\" src=\"..\/wp-content\/lesson_files\/img\/10\/peri-rect-pl.png\" alt=\"\" \/><\/p>\n<p>W ostatnim \u0107wiczeniu poprosimy ci\u0119, aby\u015b napisa\u0142 w\u0142asn\u0105 funkcj\u0119 z dwoma argumentami obliczaj\u0105c\u0105 obw\u00f3d prostok\u0105ta. (Obw\u00f3d jest sum\u0105 d\u0142ugo\u015bci wszystkich bok\u00f3w). W prostok\u0105cie o danej szeroko\u015bci i wysoko\u015bci obw\u00f3d jest podany nast\u0119puj\u0105co:<\/p>\n<p style=\"text-align: center;\"><img src='https:\/\/s0.wp.com\/latex.php?latex=%5Ctextrm%7Bperimeter+%3D+width+%2B+height+%2B+width+%2B+height%7D&#038;bg=T&#038;fg=000000&#038;s=2' alt='\\textrm{perimeter = width + height + width + height}' title='\\textrm{perimeter = width + height + width + height}' class='latex' \/><\/p>\n<p style=\"text-align: left;\">Zobacz przyk\u0142adowy schemat.<\/p>\n<p style=\"text-align: left;\"><br\/> <br\/><\/p>\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'>Prostok\u0105t<\/span><\/div>Definiowanie funkcji\u00a0<code>rectanglePerimeter(width, height)<\/code>,\u00a0kt\u00f3ra oblicza pole prostok\u0105ta. <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,'10.rectangle')\" >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=\"2d4d8e82ce88cdea08b089749c4d4125\"\/>\n<div id='pbresults7' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>jQuery(function(){pbToggleCodeMirror(7);});pbInputSwitch(7,\"Y\");<\/script>\n<\/p>\n<h3>Funkcje Wywo\u0142ywanych Funkcji<\/h3>\n<p>Funkcje s\u0105 elementami konstrukcyjnymi du\u017cych program\u00f3w: mo\u017cesz wykona\u0107 to samo zadanie dwukrotnie, bez dwukrotnego pisania tego samego kodu i mo\u017cna ponownie zastosowa\u0107 rozwi\u0105zania typowych zada\u0144. Oto przyk\u0142ad budowy jednej funkcji i u\u017cywania jej w innej.<\/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> <em>Czy mo\u017cesz odgadn\u0105\u0107, zanim program uruchomisz, jaki program da efekt?\u00a0<\/em>Pami\u0119tasz z lekcji 4, \u017ce mno\u017cenie \u0142a\u0144cucha przez liczb\u0119 ca\u0142kowit\u0105 oznacza wielokrotne powt\u00f3rzenie \u0142a\u0144cucha, np.\u00a0<code>\"tar\"*2<\/code>\u00a0daje\u00a0<code>\"tartar\"<\/code>. <\/span><\/td><\/table><\/p>\n<p><em id=\"funcfunc\">Przeci\u0105gnij pionow\u0105, szar\u0105 lini\u0119 w lewo i w prawo, aby wybra\u0107 kod &amp; wizualizacj\u0119.<\/em><\/p>\n<p><iframe width='100%' height='480' frameborder='0' scrolling='no' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/OnlinePythonTutor3-cemc\/iframe-embed.html#code=def+inner%28string%2C+width%29%3A%0A++return+string+%2B+%22+%22+%2A+%28width+-+len%28string%29%29%0A%0Adef+outer%28string1%2C+string2%29%3A%0A++w+%3D+max%28len%28string1%29%2C+len%28string2%29%29%0A++print%28%22%2A%22+%2A+%28w+%2B+4%29%29%0A++print%28%22%2A+%22+%2B+inner%28string1%2C+w%29+%2B+%22+%2A%22%29%0A++print%28%22%2A+%22+%2B+inner%28string2%2C+w%29+%2B+%22+%2A%22%29%0A++print%28%22%2A%22+%2A+%28w+%2B+4%29%29%0A%0Aouter%28%22Box+number+one%22%2C+%22is+very+fun%22%29%0Aouter%28%22Box+%232%22%2C+%22%28not+False%29+is+%22+%2B+str%28not+False%29%29&cumulative=false&heapPrimitives=false&drawParentPointers=false&textReferences=false&showOnlyOutputs=false&py=3&curInstr=0&resizeContainer=true&highlightLines&width=400&rightStdout=1'><\/iframe><\/p>\n<p>Mo\u017cesz zobaczy\u0107 nowe zjawisko w wizualizacji: w kolumnie \"Frames\" (ramki), gdy jeste\u015bmy mi\u0119dzy krokiem 8 z 30, istniej\u0105 nie tylko zmienne globalne, ale dwie ramki (jedna <code>outer<\/code> i druga <code>inner<\/code>, kt\u00f3ra w\u0142a\u015bnie zosta\u0142a stworzona). <code>outer<\/code> czeka, a\u017c <code>inner<\/code> zostanie ca\u0142kowicie sko\u0144czona, a nast\u0119pnie <code>outer<\/code> jest kontynuowana. Zdarza si\u0119, \u017ce nast\u0119puje kolejne wezwanie do <code>inner<\/code> i <code>outer<\/code> znowu czeka; a kiedy <code>inner<\/code> jest gotowa, <code>outer<\/code> jest kontynuowana. Wreszcie, my wywo\u0142ujemy <code>outer<\/code> i ca\u0142y proces jest powtarzany.<\/p>\n<p>Jeste\u015b gotowy na nast\u0119pn\u0105 lekcj\u0119!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Definicja funkcji W tej lekcji poka\u017cemy najwa\u017cniejsz\u0105 ide\u0119 programowania: definiowanie w\u0142asnych funkcji! Funkcje pozwalaj\u0105 uczyni\u0107 program kr\u00f3tszym, lepiej zorganizowanym, \u0142atwiejszym do odczytania, debugowania i co te\u017c jest wa\u017cne, funkcje s\u0105 wielokrotnego u\u017cytku. W p\u00f3\u017aniejszych lekcjach zobaczymy inne korzy\u015bci, takie jak &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/10-pl\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-9973","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/9973","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=9973"}],"version-history":[{"count":24,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/9973\/revisions"}],"predecessor-version":[{"id":10288,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/9973\/revisions\/10288"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=9973"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}