{"id":9987,"date":"2017-05-18T02:09:59","date_gmt":"2017-05-18T06:09:59","guid":{"rendered":"https:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=9987"},"modified":"2017-07-28T13:09:36","modified_gmt":"2017-07-28T17:09:36","slug":"14-pl","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/14-pl\/","title":{"rendered":"14: Metody"},"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<p>Do tej pory widzieli\u015bmy par\u0119 struktur danych w Pythonie: \u0142a\u0144cuchy i listy. Ka\u017cd\u0105 z nich obs\u0142uguje kilka <em>metod<\/em>, kt\u00f3re s\u0105 rodzajami funkcji. <\/p>\n<p>Na przyk\u0142ad jedn\u0105  z <em>metod<\/em> <code>list<\/code> jest metoda <code>reverse()<\/code>. Jak sama nazwa wskazuje, odwraca list\u0119 (na przyk\u0142ad, pierwsza pozycja staje si\u0119 ostatni\u0105 i vice versa). Metod\u0119 mo\u017cna wywo\u0142a\u0107 u\u017cywaj\u0105c kropki (<code>.<\/code>) i struktury jak poni\u017cej:<\/p>\n<p style=\"text-align: center;\"><code>\u00abobjectName\u00bb.\u00abmethodName\u00bb(\u00ablist of arguments, if any\u00bb)<\/code><\/p>\n<p>Dla por\u00f3wnania, sk\u0142adnia, kt\u00f3r\u0105 widzieli\u015bmy ju\u017c w przypadku wywo\u0142ania funkcji by\u0142a nast\u0119puj\u0105ca<\/p>\n<p style=\"text-align: center;\"><code>\u00abfunctionName\u00bb(\u00ablist of arguments, if any\u00bb)<\/code><\/p>\n<p>Oto przyk\u0142ad wywo\u0142ania dla listy  <code>reverse<\/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>Odwracanie listy.<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>Przyk\u0142adem metody, kt\u00f3ra ma argument jest <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>Niekt\u00f3re metody \u0142a\u0144cucha.<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>Wiele Metod<\/h2>\n<p>Poni\u017cej wymieniono najcz\u0119stsze metody klas \u0142a\u0144cuch\u00f3w i list. S\u0105 to g\u0142\u00f3wnie zadania, kt\u00f3re powiniene\u015b by\u0107 w stanie napisa\u0107 samodzielnie; u\u017cycie standardowych metod ma t\u0119 zalet\u0119, \u017ce  u\u0142atwia innym osobom czytanie i edycj\u0119 kodu.<\/p>\n<h3>Listy<\/h3>\n<p>Metody te nie zmieniaj\u0105 listy:<\/p>\n<ul>\n<li><code>list.index(X)<\/code>: znajd\u017a X na li\u015bcie. Konkretnie, przeszukuj\u0105c wszystkie elementy zwraca takie <code>i<\/code>, \u017ce <code>list[i]==X<\/code> . Zwracane jest najmniejsze <code>i<\/code> . Je\u015bli <code>X<\/code> nie istnieje na li\u015bcie, wtedy <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\">swoduje to <code>ValueError<\/code><\/a>.\n<ul>\n<li><code>X in list<\/code>\u00a0zwr\u00f3ci <code>True<\/code>\u00a0je\u015bli <code>X<\/code> jest elementem listy, w przeciwnym wypadku zwr\u00f3ci <code>False<\/code>. Dzi\u0119ki temu mo\u017cna unikn\u0105\u0107 wyst\u0105pienia b\u0142\u0119du <code>ValueError<\/code>. (Uwaga,<code>in<\/code> jest operatorem, nie  metod\u0105.)<\/li>\n<\/ul>\n<\/li>\n<li><code>list.count(X)<\/code>: zwraca liczb\u0119, ile razy <code>X<\/code> pojawisi\u0119 na li\u015bcie.<\/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>Metody list.<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>Metody te zmieniaj\u0105 list\u0119:<\/p>\n<ul>\n<li><code>list.append(X)<\/code> dodaje <code>X<\/code> na ko\u0144cu listy <code>list<\/code><\/li>\n<li><code>list.insert(i, X)<\/code> dodaje <code>X<\/code> na <code>i<\/code>-tej pozycji<\/li>\n<li><code>list.extend(L)<\/code> dodaje list\u0119 <code>L<\/code> na ko\u0144cu<\/li>\n<li><code>list.remove(X)<\/code> usuwa pierwsze wyst\u0105pieni <code>X<\/code> z listy<\/li>\n<li><code>list.pop(i)<\/code> zwraca &amp; usuwa element  <code>list[i]<\/code>, natomiast <code>list.pop()<\/code>zwraca &amp; usuwa ostatni element<\/li>\n<li><code>del list[i]<\/code> zwraca <code>i<\/code>-ty element z <code>list <\/code> i usuwa go (Uwaga, wyra\u017cenie \"<code>del<\/code> statement\", nie jest metod\u0105)<\/li>\n<li><code>list.reverse()<\/code>\u00a0odwraca list\u0119<\/li>\n<li><code>list.sort()<\/code>\u00a0sortuje list\u0119<\/li>\n<\/ul>\n<p>Wszystkie powy\u017csze metody z wyj\u0105tkiem <code>pop<\/code> zwracaj\u0105 None. Niekt\u00f3re z tych funkcji mog\u0105 by\u0107  r\u00f3wnie\u017c wywo\u0142ane z nieco innymi argumentami; szczeg\u00f3\u0142owe informacje znajduj\u0105 si\u0119 w sekcji dotycz\u0105cej <a href=\"http:\/\/docs.python.org\/py3k\/library\/stdtypes.html#mutable-sequence-types\">metod list <\/a>  w dokumentacji Python. Listy obs\u0142uguj\u0105 tak\u017ce z\u0142o\u017cone podzakresy zwane \"plastrami\", kt\u00f3re umo\u017cliwiaj\u0105 wstawianie i usuwanie ca\u0142ych podlist, podobnie jak z<code>string[x:y:z]<\/code> wykonany w <a href=\"\/7a-pl\/\">wykonany<\/a> <a href=\"\/12-tips\/\"> lekcjach<\/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'>Wymiana<\/span><\/div>U\u017cywaj\u0105c <code>index<\/code>  i inne metody list, zapisz funkcj\u0119 <code>replace(list, X, Y)<\/code>, kt\u00f3ra wszystkie wyst\u0105pienia <code>X<\/code> w <code>lista<\/code> zast\u0119puje <code>Y<\/code> . Na przyk\u0142ad, je\u015bli <code>L = [3, 1, 4, 1, 5, 9]<\/code> zmieni\u0142oby zawarto\u015b\u0107 L na <code>[3, 7, 4, 7, 5, 9]<\/code>. Aby wykona\u0107 to \u0107wiczenie, <em><strong>nie<\/strong> wolno u\u017cywa\u0107<\/em> <code>[]<\/code>.\u00a0<br\/>Uwaga: nie musisz uzywa\u0107\u00a0<code>return<\/code>. <a class=\"hintlink\"  id=\"hintlink4\">Wskaz\u00f3wka<\/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=\"ad2f42c7eaf46fc1dfe6d5c54c624394\"\/>\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>\u0141a\u0144cuchy<\/h2>\n<p>Podobnie jak dla list, mo\u017cesz u\u017cywa\u0107 <code>in<\/code>, <code>index<\/code> i <code>count<\/code> dla \u0142a\u0144cuch\u00f3w. Daj\u0105 one wi\u0119cej mo\u017cliwo\u015bci, poniewa\u017c dzia\u0142aj\u0105 na podciagach, a nie tylko na pojedynczych znakach:<\/p>\n<ul>\n<li><code>S in T<\/code> jest boolowskim wska\u017anikiem, czy \u0142a\u0144cuch <code>S<\/code> jest pod\u0142a\u0144cuchem \u0142a\u0144cucha <code>T<\/code><\/li>\n<li><code>S.index(T)<\/code> znajduje pierwszy indeks <code>S<\/code>,  gdzie <code>T<\/code> jest pod\u0142a\u0144cuchem<\/li>\n<li><code>S.count(T)<\/code> podaje liczb\u0119 wyst\u0105pie\u0144 nieprzerwanych <code>T<\/code> jako pod\u0142a\u0144cucha <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>Wywo\u0142anie <code>index<\/code> i <code>count<\/code> na \u0142a\u0144cuchach.<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>Oto niekt\u00f3re z najpopularniejszych metod <code>str<\/code>:<\/p>\n<ul>\n<li>Letter case: <code>capitalize, lower, upper, islower, isupper<\/code><\/li>\n<li>Characters: <code>isalpha, isdigit<\/code><\/li>\n<li>Padding: <code>center, ljust, rjust<\/code>; <code>strip<\/code> usuwa padding<\/li>\n<li>Substrings:\u00a0<code>endswith, startswith, find, replace<\/code><\/li>\n<li>Parsing: <code>split, splitlines<\/code><\/li>\n<\/ul>\n<p>W razie potrzeby przedstawimy je bardziej szczeg\u00f3\u0142owo. Pe\u0142n\u0105 szczeg\u00f3\u0142ow\u0105 list\u0119 <a href=\"http:\/\/docs.python.org\/py3k\/library\/stdtypes.html#string-methods\">metody \u0142a\u0144cucha<\/a>  podano w dokumentacji Python.<\/p>\n<p><strong>\u0141a\u0144cuchy s\u0105 niezmienne<\/strong>. Wspomn\u0119li\u015bmy <code>list.reverse()<\/code>, kt\u00f3ra zmienia list\u0119, odwracaj\u0105c j\u0105, ale tutaj nie ma tej metody <code>str.reverse()<\/code>. Dzieje si\u0119 tak, poniewa\u017c obiekty \u0142a\u0144cuchowe nie mog\u0105 by\u0107 modyfikowane po ich utworzeniu. W lekcji 17 wyja\u015bnimy nieco wi\u0119cej na ten temat.<\/p>\n<p>Oto przyk\u0142ad metody \u0142a\u0144cucha: <code>S.replace(old, new)<\/code> zwraca zmodyfikowan\u0105 wersj\u0119 <code>S<\/code>, gdzie ka\u017cde wyst\u0105pienie <code>starego<\/code> pod\u0142a\u0144cucha zosta\u0142o zast\u0105pione <code>nowym<\/code>. Powoduje to utworzenie nowego \u0142a\u0144cucha bez zmiany starego:<\/p>\n<p><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>Przyk\u0142ad: <code>replace<\/code> zwraca nowy \u0142a\u0144cuch i nie modyfikuje oryginalnej wersji.<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>W nast\u0119pnym \u0107wiczeniu przydatne b\u0119d\u0105 nast\u0119puj\u0105ce metody:<\/p>\n<p>\u2022 str.replace, kt\u00f3r\u0105 w\u0142a\u015bnie opisali\u015bmy<br \/>\n\u2022 metoda typu boolowskiego str.isalpha (), kt\u00f3ra zwraca True, je\u015bli str jest \u0142a\u0144cuchem (lub znakiem) sk\u0142adaj\u0105cym si\u0119 wy\u0142\u0105cznie z liter<br \/>\n\u2022 metoda typu boolean str.isdigit (), kt\u00f3ra zwraca warto\u015b\u0107 True, je\u015bli str jest \u0142a\u0144cuchem (lub znakiem) sk\u0142adaj\u0105cym si\u0119 wy\u0142\u0105cznie z cyfr<br \/>\n\u2022 str.upper (), kt\u00f3ra zwraca wersj\u0119 \u0142a\u0144cucha str konwertowan\u0105 na wielk\u0105 liter\u0119.<\/p>\n<ul>\n<li><code>str.replace<\/code>, kt\u00f3r\u0105 w\u0142a\u015bnie opisali\u015bmy<\/li>\n<li>metoda boolowska\u00a0<code>str.isalpha()<\/code>, kt\u00f3ra zwraca <code>True<\/code>, je\u015bli <code>str<\/code> jest \u0142a\u0144cuchem (lub znakiem) sk\u0142adaj\u0105cym si\u0119 wy\u0142\u0105cznie z liter<\/li>\n<li>metoda boolowska <code>str.isdigit()<\/code>, kt\u00f3ra zwraca warto\u015b\u0107\u00a0<code>True<\/code>,\u00a0je\u015bli <code>str<\/code> jest \u0142a\u0144cuchem (lub znakiem) sk\u0142adaj\u0105cym si\u0119 wy\u0142\u0105cznie z cyfr<\/li>\n<li><code>str.upper()<\/code> kt\u00f3ra zwraca wersj\u0119 \u0142a\u0144cucha <code>str<\/code> konwertowan\u0105 do wielkich liter<\/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'>Kod Pocztowy<\/span><\/div>Zdefiniuj funkcj\u0119 <code>postalValidate(S)<\/code>, kt\u00f3ra najpierw sprawdza, czy <code>S<\/code> <em>prawid\u0142owo<\/em> reprezentuje kod pocztowy (w Kanadzie, np. kod pocztowy Toronto\tM5H 2N2 ): <\/p>\n<ul> \t<\/p>\n<li>najpierw, usu\u0144 wszystkie spacje;<\/li>\n<p> \t<\/p>\n<li>otrzymane powinno mie\u0107 posta\u0107 <code>L#L#L#<\/code> gdzie <code>L<\/code> s\u0105 literami (ma\u0142ymi lub du\u017cymi) i <code>#<\/code> s\u0105 cyframi.<\/li>\n<p> <\/ul>\n<p> Je\u015bli <code>S<\/code> nie jest poprawnym kodem pocztowym, niech funkcja zwr\u00f3ci warto\u015b\u0107 logiczn\u0105 <code>False<\/code>. Je\u015bli S jest poprawne, niech zwr\u00f3ci wersj\u0119 tego samego kodu pocztowego w \u0142adnym formacie <code>L#L#L#<\/code>, gdzie ka\u017cde L jest du\u017c\u0105 liter\u0105.<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=\"223431446a0127b58864f1042882c4f7\"\/>\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<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> Reszta tej lekcji ma techniczny charakter i jej tre\u015b\u0107 nie jest wymagana do realizacji pozosta\u0142ych lekcji. <\/span><\/td><\/table><\/p>\n<h3>Wi\u0119cej o obiektach<\/h3>\n<p>Poznaj\u0105c Pythona, napotkasz wi\u0119cej klas ni\u017c tylko ci\u0105gi i listy. Inne, kt\u00f3re prawdopodobnie oka\u017c\u0105 si\u0119 przydatne, to <em>file objects<\/em>, <em>sets<\/em> i <em>dictionaries<\/em>. Wszystkie maj\u0105 wiele przydatnych metod. Mo\u017cesz poleceniem poprosi\u0107 Pythona o wszystkie metody danego obiektu u\u017cywaj\u0105c funkcji <code>dir<\/code>:<\/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>Metody<code>str<\/code>. Note that <code>startswith<\/code> is one of the outputs.<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>Patrzenie na w\u0142a\u015bciwo\u015bci obiektu nazywa si\u0119 <em>introspekcj\u0105<\/em>. Wszystko w Pythonie mo\u017ce mie\u0107 metody:<\/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>Liczby\u00a0<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>Niekt\u00f3re wpisy w <code>dir<\/code> s\u0105 w zasadzie <em>member variables<\/em> (zmiennymi sk\u0142adowymi) a nie metodami, na przyk\u0142ad <code>int.denominator<\/code> jest liczb\u0105, a nie funkcj\u0105. Technicznie, w Pythonie <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\">funkcje s\u0105 obiektami<\/a> wi\u0119c funkcje sk\u0142adowe s\u0105 szczeg\u00f3lnym przypadkiem zmiennych sk\u0142adowych.<\/p>\n<p>Mo\u017cesz r\u00f3wnie\u017c przeprowadzi\u0107 introspekcj\u0119 modu\u0142\u00f3w. Je\u015bli zaimportujesz <code>import math<\/code>, a nast\u0119pnie wywo\u0142asz <code>dir(math)<\/code>, otrzymasz list\u0119 wszystkich element\u00f3w modu\u0142u <code>math<\/code>, w tym liczb\u0119 <code>pi<\/code> i funkcj\u0119 <code>sqrt<\/code>. <\/p>\n<h3>Dlaczego obiekty?<\/h3>\n<p>Dlaczego mamy metody takie jak <code>S.index(T)<\/code>, a nie tylko proste wywo\u0142anie funkcji, takie jak <code>index(S, T)<\/code>? To znaczy, dlaczego w og\u00f3le mamy <em>obiekt<\/em> <code>S<\/code> i <em>metod\u0119<\/em> <code>str.index()<\/code>?<\/p>\n<p>G\u0142\u00f3wne zalety obiekt\u00f3w staj\u0105 si\u0119 wyra\u017aniejsze gdy rozpoczynasz programowanie  przy u\u017cyciu bardziej z\u0142o\u017conych i r\u00f3\u017cnorodnych typ\u00f3w danych. Ka\u017cdy typ obiektu (tzn. <code>str<\/code> <em>class<\/em>) reprezentuje zar\u00f3wno podstawowe dane, kt\u00f3re s\u0105 przechowywane (na przyk\u0142ad sekwencja znak\u00f3w i jej d\u0142ugo\u015b\u0107) oraz typy operacji, kt\u00f3re mo\u017cna wykona\u0107 na nim (np. Konwersja na wielkie litery lub wytwarzanie Podci\u0105g). Bardziej z\u0142o\u017conym przyk\u0142adem s\u0105 <em>obiekty plik\u00f3w<\/em>: reprezentuj\u0105 nazw\u0119 otwieranego pliku, bie\u017c\u0105c\u0105 pozycj\u0119 w pliku i sposoby ich odczytu i zapisu. Mo\u017cesz nawet zdefiniowa\u0107 w\u0142asne typy danych!<\/p>\n<p>To og\u00f3lne podej\u015bcie nazywa si\u0119 \"programowaniem obiektowym\" (OOP). Niekt\u00f3re z jego zalet to:<\/p>\n<ul>\n<li><strong>organizacja<\/strong>: Wszystko z modu\u0142u <code>math<\/code> jest dost\u0119pne poprzez wywo\u0142anie ze sk\u0142adni\u0105 <code>math.\u00abname\u00bb<\/code>,  z unikni\u0119ciem mo\u017cliwo\u015bci nadpisania istniej\u0105cych nazw zmiennych w programie.<\/li>\n<li><strong>kapsu\u0142kowanie<\/strong>: Podobnie jak program mo\u017ce pracowa\u0107 z kilkoma \u0142a\u0144cuchami lub kilkoma plikami jednocze\u015bnie, mo\u017cna pracowa\u0107 z wieloma odr\u0119bnymi kopiami (<em>instancjami<\/em>) typ\u00f3w danych zdefiniowanymi przez jak\u0105kolwiek inn\u0105 klas\u0119.<\/li>\n<li><strong>powt\u00f3rne wykorzystanie<\/strong>: Po zdefiniowaniu typu danych (np. <code>str<\/code>) lub metod w bibliotece (np. <code>math<\/code>) mo\u017cesz wielokrotnie u\u017cywa\u0107 je lub przekazywa\u0107 innym osobom do u\u017cycia.<\/li>\n<li><strong>debugowanie<\/strong>: Widzieli\u015bmy wcze\u015bniej, jak pisanie funkcji eliminuje konieczno\u015b\u0107 stosowania wielu kopii tego samego kodu, a to sprawia, \u017ce debugowanie jest  \u0142atwiejsze. Mo\u017cemy uzyska\u0107 ten sam efekt, gdy zdefiniujemy wszystkie funkcje zwi\u0105zane z typem danych w jednym miejscu (definicja klasy).<\/li>\n<li><strong>relacje mi\u0119dzy klasami<\/strong>: Python wie, ze metoda <code>index<\/code>oznacza jedno dla \u0142a\u0144cucha i co\u015b innego dla listy.Podobnie nie tylko Python potrafi czyta\u0107 i pisa\u0107 pliki na Twoim komputerze, ale tak\u017ce odczytywa\u0107 i zapisywa\u0107 dane w internecie. W obydwu przypadkach (sekwencji znak\u00f3w lub list oraz plik\u00f3w lokalnych lub zdalnych) powi\u0105zane klasy mog\u0105 by\u0107 <em>jednorodnie<\/em> przetwarzane, u\u017cywaj\u0105c poj\u0119cia dziedziczenia.<\/li>\n<\/ul>\n<p>W pozosta\u0142ych cz\u0119\u015bci CS Circles b\u0119dziemy <em>u\u017cywa\u0107 <\/em>tylko obiekt\u00f3w i metod; Mo\u017cesz dowiedzie\u0107 si\u0119 wi\u0119cej o tworzeniu w\u0142asnych klas p\u00f3\u017aniej (zobacz stron\u0119 Zasoby).<\/p>\n<p>Kolejne trzy lekcje mo\u017cna wykona\u0107 w dowolnej kolejno\u015bci i daj\u0105 wiele wyzwa\u0144 \u0142\u0105cz\u0105cych tematy z wcze\u015bniejszych lekcji.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Do tej pory widzieli\u015bmy par\u0119 struktur danych w Pythonie: \u0142a\u0144cuchy i listy. Ka\u017cd\u0105 z nich obs\u0142uguje kilka metod, kt\u00f3re s\u0105 rodzajami funkcji. Na przyk\u0142ad jedn\u0105 z metod list jest metoda reverse(). Jak sama nazwa wskazuje, odwraca list\u0119 (na przyk\u0142ad, pierwsza &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/14-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-9987","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/9987","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=9987"}],"version-history":[{"count":13,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/9987\/revisions"}],"predecessor-version":[{"id":10376,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/9987\/revisions\/10376"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=9987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}