{"id":4715,"date":"2020-01-17T17:48:09","date_gmt":"2020-01-17T16:48:09","guid":{"rendered":"https:\/\/infoshareacademy.com\/?p=4715"},"modified":"2021-01-12T09:12:06","modified_gmt":"2021-01-12T08:12:06","slug":"wielki-test-wiedzy-o-pythonie-cz-ii","status":"publish","type":"post","link":"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/","title":{"rendered":"Wielki Test Wiedzy o Pythonie cz. II"},"content":{"rendered":"<p><strong> W tym j\u0119zyku mo\u017cesz: automatyzowa\u0107 testy, tworzy\u0107 aplikacje webowe, czy wreszcie korzysta\u0107 z przebogatych mo\u017cliwo\u015bci wykorzystania bibliotek do Machine Learningu i Deep Learningu (Data Science). Znasz Pythona? Programujesz na co dzie\u0144 w tym j\u0119zyku? Pora sprawdzi\u0107 swoje umiej\u0119tno\u015bci. Przed Tob\u0105 test wiedzy o Pythonie!<br \/>\n<\/strong><\/p>\n<p>Zgodnie z zapowiedzi\u0105 &#8211; przed Tob\u0105 Wielki Test Wiedzy o Pythonie &#8211; cz\u0119\u015b\u0107 druga. Tym razem masz okazj\u0119 zmierzy\u0107 si\u0119 z trudniejszymi zagadnieniami. Publikujemy 15 pyta\u0144 z puli od \u0142atwej &#8211; a\u017c po trudne &#8211; w kolejno\u015bci &#8211; wed\u0142ug poziomu trudno\u015bci. Zapoznaj si\u0119 z zagadnieniami, kt\u00f3re przygotowa\u0142 i szczeg\u00f3\u0142owo wyja\u015bni\u0142 nasz trener, a gdy b\u0119dziesz got\u00f3w &#8211; sprawd\u017a si\u0119 w te\u015bcie z Miko\u0142ajem Lewandowskim.<\/p>\n<p><iframe loading=\"lazy\" id=\"desktop_player\" src=\"https:\/\/www.youtube.com\/embed\/KWf09s8ONZs?start=2221\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p><iframe loading=\"lazy\" id=\"mobile_player\" src=\"https:\/\/www.youtube.com\/embed\/KWf09s8ONZs?start=2221\" width=\"335\" height=\"188\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<div class=\"blog_box_highlight\" style=\"background-color: rgba(11,168,174,0.1); margin: 40px 0 40px 0; padding: 35px 0 35px 45px; border-left: 10px solid #0ba8ae;\"><span style=\"font-weight: 400; color: #13a8ae; font-size: 1.4em;\">Je\u015bli chcesz wr\u00f3ci\u0107 do pierwszej cz\u0119\u015bci Testu, kliknij:<br \/>\n<a href=\"https:\/\/infoshareacademy.com\/artykul\/wielki-test-wiedzy-o-pythonie-cz-i\/#utm_source=blog&amp;utm_medium=artykul&amp;utm_campaign=Python-test\">by sprawdzi\u0107 si\u0119 w pierwszej cz\u0119\u015bci testu<\/a><\/span><\/div>\n<h2 class=\"blog-h2\">1. Jak zwyczajowo nazywa si\u0119 pierwszy argument metody (funkcji w klasie)?<\/h2>\n<p>Poprawna odpowied\u017a to: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">self<\/code>.<\/p>\n<p>Pierwszym argumentem, kt\u00f3ry otrzyma metoda jest referencja wskazuj\u0105ca na instancj\u0119 danej klasy (obiekt), na kt\u00f3rym zosta\u0142a wywo\u0142ana ta metoda. Argument ten przekazywany jest niejawnie (wywo\u0142uj\u0105c metod\u0119, nie przekazujemy go, Python sam \u201cdoda go\u201d uruchamiaj\u0105c wywo\u0142anie funkcji).<\/p>\n<p>Przyk\u0142adowa metoda:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">class Contract:\n  def generate(self, law_policy):\n    pass\n\n<\/pre>\n<p>Oraz jej wywo\u0142anie:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from law_policy import polish_law\n\nemployee_contract = Contract()\nemployee_contract.generate(polish_law)<\/pre>\n<p>W powy\u017cszym przyk\u0142adzie, w ciele metody <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">generate<\/code> za pomoc\u0105 argumentu <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">self<\/code> mo\u017cna dosta\u0107 si\u0119 do obiektu zapisanego w zmiennej <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">employee_contract<\/code>, za\u015b w argumencie <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">law_policy<\/code> znajdzie si\u0119 warto\u015b\u0107 przekazana jako <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">polish_law<\/code>.<\/p>\n<p>Nazwanie pierwszego argumentu metody w inny spos\u00f3b (np. <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">object_reference<\/code>) by\u0142oby poprawne sk\u0142adniowo (zadzia\u0142a\u0142oby) jednak jest niezgodne z konwencj\u0105 i zasadami stylistycznymi dotycz\u0105cymi Pythonowego kodu, zdefiniowanymi przez PEP 8:<br \/>\n<a href=\"https:\/\/www.python.org\/dev\/peps\/pep-0008\/#function-and-method-arguments\">https:\/\/www.python.org\/dev\/peps\/pep-0008\/#function-and-method-arguments<\/a><\/p>\n<h2 class=\"blog-h2\">2. Jaki jest wynik dzia\u0142ania <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">1_2 + 3_4<\/code> ?<\/h2>\n<p>Poprawna odpowied\u017a to 46.<\/p>\n<p>Zapis <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">1_2<\/code> jest r\u00f3wnowa\u017cny zapisowi <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">12<\/code> &#8211; to po prostu liczba <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">12<\/code>. Podkre\u015blenia zostan\u0105 zignorowane przez interpreter. Analogicznie w przypadku <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">3_4<\/code>. Notacja z podkre\u015bleniem zosta\u0142a wprowadzona w Pythonie 3.6 dla u\u0142atwienia zapisu zw\u0142aszcza du\u017cych liczb, np. zamiast<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">money = 10000000<\/code><\/p>\n<p>mo\u017cliwe jest teraz zapisanie:<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">money = 10_000_000<\/code><\/p>\n<p>co zdecydowanie poprawia czytelno\u015b\u0107.<br \/>\nPomys\u0142 ten zosta\u0142 wprowadzony przez PEP 515:<br \/>\n<a href=\"https:\/\/www.python.org\/dev\/peps\/pep-0515\/\">https:\/\/www.python.org\/dev\/peps\/pep-0515\/<\/a><\/p>\n<h2 class=\"blog-h2\">3. Za pomoc\u0105 jakiego s\u0142owa kluczowego mo\u017cemy zastosowa\u0107 context manager\u2019a?<\/h2>\n<p>Poprawna odpowied\u017a to: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">with<\/code>.<\/p>\n<p>Context manager pozwala stworzy\u0107 czyteln\u0105 i re-u\u017cywaln\u0105 implementacj\u0119 sytuacji, w kt\u00f3rej pewne instrukcje powinny zawsze wykona\u0107 si\u0119 przed oraz po, innej dynamicznej cz\u0119\u015bci. Cz\u0119sto spotykanym przyk\u0142adem jest praca z plikami:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">with open(\"path\/to\/file\") as data_file:\n  for line in data_file:\n    print(line)\n\n<\/pre>\n<p>Pracuj\u0105c z r\u00f3\u017cnymi plikami zawsze chcemy:<\/p>\n<ul>\n<li class=\"blog_li\">otworzy\u0107 wskazany plik<\/li>\n<li class=\"blog_li\">wykona\u0107 na nim pewne operacje<\/li>\n<li class=\"blog_li\">zamkn\u0105\u0107 plik<\/li>\n<\/ul>\n<p>Co wa\u017cne, zamkni\u0119cie pliku powinno nast\u0105pi\u0107 zawsze, niezale\u017cnie od tego, czy wykonywane na nim operacje zako\u0144czy\u0142y si\u0119 powodzeniem czy te\u017c zosta\u0142y przerwane wyj\u0105tkiem. Zastosowanie context manager\u2019a gwarantuje powy\u017csze. Alternatywn\u0105 sk\u0142adni\u0105 by\u0142oby zastosowanie bloku <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">try\u2026except\u2026finally<\/code> jednak np. w przypadku pracy na plikach by\u0142oby to rozwi\u0105zanie mniej czytelne i powielaj\u0105ce logik\u0119 obs\u0142ugi b\u0142\u0119d\u00f3w oraz zamykania plik\u00f3w.<\/p>\n<p>Wi\u0119cej szczeg\u00f3\u0142\u00f3w o koncepcji context manager\u2019a mo\u017cna znale\u017a\u0107 w dokumentacji: <a href=\"https:\/\/docs.python.org\/3\/reference\/compound_stmts.html#with\">https:\/\/docs.python.org\/3\/reference\/compound_stmts.html#with<\/a><\/p>\n<h2 class=\"blog-h2\">4. Jaka instrukcja umo\u017cliwi nam wykorzystanie w naszym kodzie modu\u0142u csv?<\/h2>\n<p>Poprawna odpowied\u017a to: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">import csv<\/code>.<\/p>\n<p>W Pythonie modu\u0142 to plik zawieraj\u0105cy Pythonowy kod. Aby w implementowanym rozwi\u0105zaniu wykorzysta\u0107 inny modu\u0142 (oraz dost\u0119pne w nim funkcje, klasy, zmienne, itp.) nale\u017cy go zaimportowa\u0107. Jest to informacja dla interpretera, \u017ce w poni\u017cszym kodzie najpewniej pojawi si\u0119 odwo\u0142anie do tego modu\u0142u wi\u0119c powinien go odszuka\u0107. R\u00f3wnocze\u015bnie w ten spos\u00f3b przekazywana jest informacja, gdzie znajduje si\u0119 dany modu\u0142 oraz pod jakim symbolem b\u0119dzie dost\u0119pny. System importowania nale\u017cy zastosowa\u0107 aby u\u017cy\u0107:<\/p>\n<ul>\n<li class=\"blog_li\">modu\u0142u z biblioteki standardowej<\/li>\n<li class=\"blog_li\">modu\u0142u z zewn\u0119trznej, zainstalowanej wcze\u015bniej biblioteki<\/li>\n<li class=\"blog_li\">innego modu\u0142u, zaimplementowanego w ramach tej samej aplikacji (np. klasy albo funkcji z innego pliku)<\/li>\n<\/ul>\n<p>Modu\u0142y s\u0105 zorganizowane w hierarchiczne struktury &#8211; podobnie jak pliki na dysku. Taka struktura sk\u0142ada si\u0119 z modu\u0142\u00f3w nazywanych pakietami (b\u0119d\u0105cych odpowiednikiem katalogu na dysku komputera), kt\u00f3re mog\u0105 zawiera\u0107 inne pakiety (podkatalogi) albo modu\u0142y nie b\u0119d\u0105ce pakietami (pliki). Importuj\u0105c konkretny modu\u0142, jego lokalizacj\u0119 nale\u017cy wskaza\u0107 stosuj\u0105c notacj\u0119 z kropkami, dla rozdzielenia kolejnych poziom\u00f3w zag\u0142\u0119bienia:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">&gt;&gt;&gt; import os.path\n&gt;&gt;&gt; print(os.path.join(\"directory\", \"file\"))\n\"directory\/file\"<\/pre>\n<p>Aby m\u00f3c odwo\u0142a\u0107 si\u0119 do importowanego modu\u0142u, funkcji, itp. bez notacji kropkowej nale\u017cy zastosowa\u0107 konstrukcj\u0119 <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">from \u2026 import \u2026<\/code><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">&gt;&gt;&gt; from os import path\n&gt;&gt;&gt; print(path.join(\"directory\", \"file\"))\n\"directory\/file\"<\/pre>\n<p>Mo\u017cliwe jest r\u00f3wnie\u017c nadanie aliasu importowanemu modu\u0142owi i odwo\u0142ywanie si\u0119 do niego poprzez ten w\u0142a\u015bnie alias:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">&gt;&gt;&gt; from os import path as system_path\n&gt;&gt;&gt; print(system_path.join(\"directory\", \"file\"))\n\"directory\/file\"<\/pre>\n<p>\u015acie\u017ck\u0119 do modu\u0142u mo\u017cna podawa\u0107 zar\u00f3wno w spos\u00f3b bezwzgl\u0119dny (preferowany w wi\u0119kszo\u015bci przypadk\u00f3w) jak i relatywny.<\/p>\n<p>Wi\u0119cej szczeg\u00f3\u0142\u00f3w dotycz\u0105cych tematu importowania modu\u0142\u00f3w w Pythonie mo\u017cna znale\u017a\u0107 w dokumentacji:<br \/>\n<a href=\"https:\/\/docs.python.org\/3\/reference\/import.html\">https:\/\/docs.python.org\/3\/reference\/import.html<\/a><\/p>\n<p>PEP 8 (importowanie):<br \/>\n<a href=\"https:\/\/www.python.org\/dev\/peps\/pep-0008\/#imports\">https:\/\/www.python.org\/dev\/peps\/pep-0008\/#imports<\/a><\/p>\n<p>Artyku\u0142y:<br \/>\n<a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-import-modules-in-python-3\">https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-import-modules-in-python-3<\/a><br \/>\n<a href=\"https:\/\/realpython.com\/absolute-vs-relative-python-imports\/\">https:\/\/realpython.com\/absolute-vs-relative-python-imports\/<\/a><\/p>\n<h2 class=\"blog-h2\">5. Jaka instrukcja zwr\u00f3ci d\u0142ugo\u015b\u0107 ci\u0105gu znak\u00f3w <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\"abc\"<\/code> (liczb\u0119 liter\/znak\u00f3w)?<\/h2>\n<p>Poprawna odpowied\u017a to: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">len(\"abc\")<\/code>.<\/p>\n<p>Wbudowana funkcja <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">len<\/code> zwraca liczb\u0119 element\u00f3w (d\u0142ugo\u015b\u0107) w danym obiekcie. Typ <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">str<\/code> jest sekwencj\u0105 znak\u00f3w i w tym przypadku funkcja <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">len<\/code> zwraca d\u0142ugo\u015b\u0107 tej sekwencji (liczb\u0119 znak\u00f3w\/liter). Dla listy zwr\u00f3cona zostanie liczba element\u00f3w, dla s\u0142ownika liczba par <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">klucz: warto\u015b\u0107<\/code>. Aby umo\u017cliwi\u0107 dzia\u0142anie funkcji <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">len<\/code> dla w\u0142asnej klasy, nale\u017cy spe\u0142ni\u0107 oczekiwany protok\u00f3\u0142. W tym przypadku zaimplementowa\u0107 metod\u0119 <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">__len__<\/code>. Gdy na obiekcie tej klasy kto\u015b u\u017cyje funkcji <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">len<\/code>, metoda <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">__len__<\/code> zostanie wywo\u0142ana, a warto\u015b\u0107 przez ni\u0105 zwr\u00f3cona, b\u0119dzie wynikiem wywo\u0142ania funkcji <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">len<\/code>.<\/p>\n<p>Informacje o funkcji <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">len<\/code> w dokumentacji:<br \/>\n<a href=\"https:\/\/docs.python.org\/3\/library\/functions.html#len\">https:\/\/docs.python.org\/3\/library\/functions.html#len<\/a><\/p>\n<p>Podstawowe informacje o <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">__len__<\/code>:<br \/>\n<a href=\"https:\/\/stackoverflow.com\/questions\/2481421\/difference-between-len-and-len\">https:\/\/stackoverflow.com\/questions\/2481421\/difference-between-len-and-len<\/a><\/p>\n<h2 class=\"blog-h2\">6. Nast\u0119puj\u0105cy fragment kodu: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">some_variable = [number for number in range(10)]<\/code> to przyk\u0142ad u\u017cycia&#8230;?<\/h2>\n<p>Poprawna odpowied\u017a to: List comprehension<\/p>\n<p>List comprehension to skr\u00f3cona forma zapisu umo\u017cliwiaj\u0105ca stworzenie nowej listy na podstawie ju\u017c istniej\u0105cej (listy lub innej sekwencji). Jest to alternatywa dla wykorzystania standardowej p\u0119tli for.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">some_variable = [number for number in range(10)]<\/pre>\n<p>Mo\u017cna zapisa\u0107 r\u00f3wnie\u017c jako:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">some_variable = []\nfor number in range(10):\n  some_variable.append(number)<\/pre>\n<p>W tym przypadku zastosowanie list comprehension pozwala uzyska\u0107 zwi\u0119z\u0142\u0105 i czyteln\u0105 form\u0119. Rol\u0119 istniej\u0105cej sekwencji pe\u0142ni w przyk\u0142adzie <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">range(10)<\/code>, kt\u00f3ry jest sekwencj\u0105 liczb od 0 do 9 w\u0142\u0105cznie. List comprehension mo\u017ce posiada\u0107 r\u00f3wnie\u017c warunek, kt\u00f3ry pozwoli na przefiltrowanie element\u00f3w:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">some_variable = [number for number in range(10) if number &gt; 5]<\/pre>\n<p>W nieco bardziej rozbudowanym przyk\u0142adzie:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">class Student:\n  def __init__(self, final_grade):\n    self.final_grade = final_grade\n\nstudents = [Student(3), Student(5), Student(6), Student(5)]\nbest_students = [student for student in students if student.final_grade &gt; 4]<\/pre>\n<p>Analogicznie do tworzenia p\u0119tli zagnie\u017cd\u017conych, mo\u017cliwe jest r\u00f3wnie\u017c zagnie\u017cd\u017canie list comprehension. Nale\u017cy mie\u0107 jednak na uwadze, \u017ce w przypadku bardziej skomplikowanych wyra\u017ce\u0144 lepiej jest pos\u0142u\u017cy\u0107 si\u0119 podej\u015bciem wykorzystuj\u0105cym p\u0119tle, gdy\u017c z\u0142o\u017cone list comprehensions staj\u0105 si\u0119 bardzo szybko nieczytelne.<br \/>\nW Pythonie wyst\u0119puj\u0105 r\u00f3wnie\u017c dict comprehensions, set comprehensions (dzia\u0142aj\u0105ce analogicznie do list comprehensions, tyle \u017ce na innych typach danych) oraz generator expressions (dzia\u0142aj\u0105ce w podobny spos\u00f3b).<\/p>\n<p>Wi\u0119cej szczeg\u00f3\u0142\u00f3w mo\u017cna znale\u017a\u0107 w dokumentacji:<br \/>\n<a href=\"https:\/\/docs.python.org\/3\/tutorial\/datastructures.html#list-comprehensions\">https:\/\/docs.python.org\/3\/tutorial\/datastructures.html#list-comprehensions<\/a><\/p>\n<p>Oraz poni\u017cszym artykule:<br \/>\n<a href=\"https:\/\/djangostars.com\/blog\/list-comprehensions-and-generator-expressions\/\">https:\/\/djangostars.com\/blog\/list-comprehensions-and-generator-expressions\/<\/a><\/p>\n<p>Informacje o typie range:<br \/>\n<a href=\"https:\/\/docs.python.org\/3.7\/library\/stdtypes.html#ranges\">https:\/\/docs.python.org\/3.7\/library\/stdtypes.html#ranges<\/a><\/p>\n<h2 class=\"blog-h2\">7. Kt\u00f3ry z typ\u00f3w jest mutable?<\/h2>\n<p>Poprawna odpowied\u017a to: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">list<\/code>.<\/p>\n<p>W Pythonie, tak jak i w wi\u0119kszo\u015bci j\u0119zyk\u00f3w programowania, typy danych mog\u0105 by\u0107 mutable albo immutable. Obiekty typu immutable nie mog\u0105 zosta\u0107 zmienione. Przyk\u0142adem mo\u017ce by\u0107 typ <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">str<\/code> oraz operacja konkatenacji (\u0142\u0105czenia, zobacz: \u201cKt\u00f3ra z poni\u017cszych komend przypisze do zmiennej <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">result<\/code> ci\u0105g znak\u00f3w <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\"Python\"<\/code>?\u201d). Aby uzupe\u0142ni\u0107 imi\u0119 o brakuj\u0105c\u0105 cz\u0119\u015b\u0107 mo\u017cna zastosowa\u0107 operator <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">+=<\/code>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">name = \"Mik\"\nname += \"o\u0142aj\"<\/pre>\n<p>Jednak w tym przypadku oryginalny obiekt, reprezentuj\u0105cy ci\u0105g znak\u00f3w \u201cMik\u201d nie zostanie zmodyfikowany, za\u015b do zmiennej name przypisany zostanie nowy obiekt, utworzony z po\u0142\u0105czenia \u201cMik\u201d oraz \u201co\u0142aj\u201d. Obrazuje to dok\u0142adniej poni\u017cszy przyk\u0142ad:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">&gt;&gt;&gt; part_name = \"Mik\"\n&gt;&gt;&gt; name = part_name\n&gt;&gt;&gt; name is part_name\nTrue\n&gt;&gt;&gt; name += \"o\u0142aj\"\n&gt;&gt;&gt; name is part_name\nFalse\n&gt;&gt;&gt; print(name)\nMiko\u0142aj\n&gt;&gt;&gt; print(part_name)\nMik<\/pre>\n<p>Tak wi\u0119c modyfikacja typu immutable jest niemo\u017cliwa. Za ka\u017cdym razem utworzony zostanie nowy obiekt, a \u201cstary\u201d pozostanie nienaruszony. W\u015br\u00f3d wbudowanych w Pythona typ\u00f3w immutable s\u0105 r\u00f3wnie\u017c:<\/p>\n<ul>\n<li class=\"blog_li\">bool<\/li>\n<li class=\"blog_li\">int<\/li>\n<li class=\"blog_li\">float<\/li>\n<li class=\"blog_li\">tuple<\/li>\n<li class=\"blog_li\">frozenset<\/li>\n<li class=\"blog_li\">oraz wspominany ju\u017c str<\/li>\n<\/ul>\n<p>Natomiast obiekt typu mutable mo\u017ce zosta\u0107 zmodyfikowany. Przyk\u0142adem typ\u00f3w mutable jest:<\/p>\n<ul>\n<li class=\"blog_li\">list<\/li>\n<li class=\"blog_li\">set<\/li>\n<li class=\"blog_li\">dict<\/li>\n<\/ul>\n<p>Analogiczny do wcze\u015bniejszego przyk\u0142ad dla listy wygl\u0105da\u0142by w ten spos\u00f3b:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">&gt;&gt;&gt; numbers = [1, 2, 3]\n&gt;&gt;&gt; new_numbers = numbers\n&gt;&gt;&gt; new_numbers is numbers\nTrue\n&gt;&gt;&gt; new_numbers.append(4)\n&gt;&gt;&gt; new_numbers is numbers\nTrue\n&gt;&gt;&gt; print(new_numbers)\n[1, 2, 3, 4]\n&gt;&gt;&gt; print(numbers)\n[1, 2, 3, 4]<\/pre>\n<p>W powy\u017cszym przyk\u0142adzie nast\u0119puje modyfikacja obiektu listy, a zmiana widoczna jest zar\u00f3wno w \u201cnowej\u201d jak i \u201cstarej\u201d zmiennej, gdy\u017c obie wskazuj\u0105 nadal na ten sam obiekt (nie powsta\u0142 \u017caden nowy obiekt, jak w przypadku typu <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">str<\/code>). Ta w\u0142a\u015bciwo\u015b\u0107 ma implikacje widoczne np. podczas definiowania funkcji z argumentem typu mutable o domy\u015blnej warto\u015bci.<\/p>\n<p>Wi\u0119cej szczeg\u00f3\u0142\u00f3w mo\u017cna znale\u017a\u0107 w dokumentacji:<br \/>\n<a href=\"https:\/\/docs.python.org\/3\/library\/stdtypes.html#immutable-sequence-types\">https:\/\/docs.python.org\/3\/library\/stdtypes.html#immutable-sequence-types<\/a><br \/>\n<a href=\"https:\/\/docs.python.org\/3\/glossary.html#term-immutable\">https:\/\/docs.python.org\/3\/glossary.html#term-immutable<\/a><br \/>\n<a href=\"https:\/\/docs.python.org\/3\/glossary.html#term-mutable\">https:\/\/docs.python.org\/3\/glossary.html#term-mutable<\/a><\/p>\n<p>Oraz w artykule:<br \/>\n<a href=\"https:\/\/medium.com\/@meghamohan\/mutable-and-immutable-side-of-python-c2145cf72747\">https:\/\/medium.com\/@meghamohan\/mutable-and-immutable-side-of-python-c2145cf72747<\/a><\/p>\n<h2 class=\"blog-h2\">8. Jak zwr\u00f3ci\u0107 ostatni element z listy <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">grades = [5, 3, 2, 5]<\/code>?<\/h2>\n<p>Poprawna odpowied\u017a to: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">grades[-1]<\/code>.<\/p>\n<p>Do poszczeg\u00f3lnych element\u00f3w listy w Pythonie mo\u017cna odwo\u0142ywa\u0107 si\u0119 za pomoc\u0105 indeksu, podaj\u0105c numer elementu w kwadratowych nawiasach. Pierwszy element na li\u015bcie posiada indeks r\u00f3wny 0. Tak wi\u0119c wywo\u0142anie:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">print(grades[1])<\/pre>\n<p>Wypisze warto\u015b\u0107 <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">3<\/code>.<br \/>\nAby rozpocz\u0105\u0107 indeksowanie od ko\u0144ca listy, nale\u017cy zastosowa\u0107 warto\u015bci ujemne. I tak <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">-1<\/code> jest indeksem ostatniego elementu w li\u015bcie, <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">-2<\/code> przedostatniego itd.<\/p>\n<p>Operacje na sekwencjach:<br \/>\n<a href=\"https:\/\/docs.python.org\/3\/library\/stdtypes.html#common-sequence-operations\">https:\/\/docs.python.org\/3\/library\/stdtypes.html#common-sequence-operations<\/a><\/p>\n<p>Informacje o listach:<br \/>\n<a href=\"https:\/\/www.programiz.com\/python-programming\/list\">https:\/\/www.programiz.com\/python-programming\/list<\/a><\/p>\n<h2 class=\"blog-h2\">9. Jakie s\u0142owo kluczowe NIE jest elementem bloku obs\u0142ugi wyj\u0105tk\u00f3w (<code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">try\u2026<\/code>)?<\/h2>\n<p>Poprawna odpowied\u017a to: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">catch<\/code>.<\/p>\n<p>W Pythonie blok obs\u0142ugi wyj\u0105tk\u00f3w rozpoczyna si\u0119 s\u0142owem kluczowym <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">try:<\/code> po kt\u00f3rym umieszczony jest kod wykonywany w ramach tego bloku. Dalej znajduje si\u0119 sekcja obs\u0142ugi wyj\u0105tk\u00f3w (<code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">except<\/code>, mo\u017ce wyst\u0105pi\u0107 kilkukrotnie) lub sekcja <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">finally<\/code>, kt\u00f3ra zostanie wykonana zawsze, niezale\u017cnie od tego czy wyst\u0105pi\u0142 wyj\u0105tek. Po s\u0142owie kluczowym <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">except<\/code> mo\u017cna poda\u0107 typ wyj\u0105tku jaki ma zosta\u0107 \u201cz\u0142apany\u201d i obs\u0142u\u017cony w danym bloku. Je\u017celi rzucony wyj\u0105tek nie b\u0119dzie pasowa\u0142 do podanego typu, interpreter b\u0119dzie poszukiwa\u0142 kolejnej sekcji <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">except<\/code> z pasuj\u0105cym typem. Nie podanie \u017cadnego typu powoduje przechwytywanie wszystkich rodzaj\u00f3w wyj\u0105tk\u00f3w. Takie podej\u015bcie jest niezalecane, gdy\u017c ogranicza elastyczno\u015b\u0107 implementacji. Dobrym wzorcem jest podawanie jak najdok\u0142adniejszego typu \u0142apanych wyj\u0105tk\u00f3w. Aby obs\u0142u\u017cy\u0107 kilka r\u00f3\u017cnych typ\u00f3w wyj\u0105tk\u00f3w w r\u00f3\u017cny spos\u00f3b nale\u017cy dla ka\u017cdego z nich przygotowa\u0107 oddzieln\u0105 sekcj\u0119 <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">except<\/code>.<br \/>\nW bloku obs\u0142ugi wyj\u0105tk\u00f3w dopuszczone jest pomini\u0119cie sekcji <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">except<\/code> albo <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">finally<\/code> jednak jedna z nich musi wyst\u0105pi\u0107 (je\u017celi obydwie, to w kolejno\u015bci: najpierw <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">except<\/code> potem <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">finally<\/code>). Na ko\u0144cu mo\u017ce znale\u017a\u0107 si\u0119 opcjonalna sekcja <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">else<\/code> wykonywana w sytuacji, gdy nie zaszed\u0142 wyj\u0105tek.<\/p>\n<p>Przyk\u0142ad bloku obs\u0142ugi wyj\u0105tk\u00f3w mo\u017ce wygl\u0105da\u0107 nast\u0119puj\u0105co:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">data_file = open(\"path\/to\/file\")\ntry:\n  for line in data_file:\n    print(line)\nexcept IOError:\n  print(\"Something went wrong...\")\nfinally:\n  data_file.close()\nelse:\n  print(\"No problem :)\")<\/pre>\n<p>Nale\u017cy mie\u0107 na uwadze, \u017ce powy\u017cszy przyk\u0142ad jest mocno uproszczony, dla cel\u00f3w zaprezentowania mo\u017cliwo\u015bci samej konstrukcji <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">try\u2026<\/code>. Dotyczy to przede wszystkim obs\u0142ugi b\u0142\u0119du w bloku <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">except<\/code>. Wypisanie wiadomo\u015bci na ekran nie jest dobrym sposobem obs\u0142u\u017cenia sytuacji wyj\u0105tkowej. Je\u017celi wszystko co powinni\u015bmy zrobi\u0107 z danym wyj\u0105tkiem to zapisa\u0107 informacje o jego wyst\u0105pieniu, nale\u017ca\u0142oby skorzysta\u0107 np. z modu\u0142u logging i od\u0142o\u017cy\u0107 bardziej szczeg\u00f3\u0142owe dane w logu programu. W kwestii samego obs\u0142ugiwania plik\u00f3w preferowanym rozwi\u0105zaniem jest skorzystanie z dost\u0119pnego context manager\u2019a (zobacz \u201cZa pomoc\u0105 jakiego s\u0142owa kluczowego mo\u017cemy zastosowa\u0107 context manager\u2019a?\u201d).<\/p>\n<p>Informacje o wyj\u0105tkach i ich obs\u0142udze:<br \/>\n<a href=\"https:\/\/docs.python.org\/3.7\/tutorial\/errors.html\">https:\/\/docs.python.org\/3.7\/tutorial\/errors.html<\/a><\/p>\n<h2 class=\"blog-h2\">10. W jaki spos\u00f3b zadeklarowa\u0107 klas\u0119 <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">FullTimeContract<\/code>, kt\u00f3ra dziedziczy po klasie <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Contract<\/code>?<\/h2>\n<p>Poprawna odpowied\u017a to: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">class FullTimeContract(Contract):<\/code>.<\/p>\n<p>Dziedziczenie oznacza, \u017ce dany typ (dziedzicz\u0105cy, dziecko) jest bardziej szczeg\u00f3\u0142ow\u0105 wersj\u0105 typu og\u00f3lnego (typ bazowy, rodzic). W przyk\u0142adzie z kontraktem, <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">FullTimeContract<\/code> to pewien szczeg\u00f3lny rodzaj og\u00f3lnego <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Contract<\/code>. Pozwala to traktowa\u0107 obiekty r\u00f3\u017cnych typ\u00f3w dziedzicz\u0105cych po tym samym rodzicu, w ten sam spos\u00f3b i okre\u015bli\u0107, z kt\u00f3rej klasy ma pochodzi\u0107 wywo\u0142ywana metoda w momencie jej wywo\u0142ywania. Koncepcja ta nazywana jest polimorfizmem.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">class Contract:\n  def calculate_value(self, salary_per_hour):\n    return salary_per_hour\n\nclass FullTimeContract(Contract):\n  def calculate_value(self, salary_per_hour):\n    return 160 * salary_per_hour\n\nclass PartTimeContract(Contract):\n  def calculate_value(self, salary_per_hour):\n    return 80 * salary_per_hour\n\ncontracts = [FullTimeContract(), PartTimeContract()\ntotal_amount = 0\nfor contract in contracts:\n  total_amount += contract.calculate_value(salary_per_hour=100)<\/pre>\n<p>W implementacji klasy potomnej mo\u017cna odwo\u0142ywa\u0107 si\u0119 do w\u0142a\u015bciwo\u015bci i metod zdefiniowanych w klasie bazowej za pomoc\u0105 konstrukcji <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">super()<\/code>. Klasa potomna mo\u017ce r\u00f3wnie\u017c rozszerza\u0107 klas\u0119 bazow\u0105 poprzez do\u0142o\u017cenie nowych p\u00f3l oraz metod, jak r\u00f3wnie\u017c nadpisa\u0107 implementacj\u0119 metody zdefiniowanej ju\u017c w klasie bazowej. Klasy s\u0105 zwi\u0105zane z paradygmatem programowania obiektowego, kt\u00f3re jest tematem bardzo szerokim, ale jednocze\u015bnie wa\u017cnym elementem warsztatu programistycznego.<\/p>\n<p>Informacje o klasach w Pythonie:<br \/>\n<a href=\"https:\/\/docs.python.org\/3\/tutorial\/classes.html\">https:\/\/docs.python.org\/3\/ttorial\/classes.html<\/a><\/p>\n<h2 class=\"blog-h2\">11. Deklaracja <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">def get_distance() \u2192 Optional[int]:<\/code> oznacza, \u017ce funkcja <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">get_distance<\/code> powinna:<\/h2>\n<p>Poprawna odpowied\u017a to: Zawsze zwr\u00f3ci\u0107 warto\u015b\u0107 typu <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">int<\/code> albo warto\u015b\u0107 <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">None<\/code>.<\/p>\n<p>Zastosowana powy\u017cej notacja to type hints. Umo\u017cliwia ona deklaracj\u0119 oczekiwanych typ\u00f3w dla argument\u00f3w funkcji, zwracanych warto\u015bci, zmiennych. Python jest i pozostaje j\u0119zykiem dynamicznie typowanym, jednak wprowadzenie coraz szerszego wsparcia dla type hints w nowych wersjach j\u0119zyka, umo\u017cliwia zastosowanie dodatkowych mechanizm\u00f3w u\u0142atwiaj\u0105cych czytanie ju\u017c istniej\u0105cego kodu i redukcj\u0119 liczby b\u0142\u0119d\u00f3w. Powy\u017cszy zapis nie uniemo\u017cliwi implementacji funkcji w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">def get_distance() -&gt; Optional[int]:\n  return \"This is wrong\"<\/pre>\n<p>Jednak pozwoli \u0142atwiej wykry\u0107 tego typu pomy\u0142k\u0119:<\/p>\n<ul>\n<li class=\"blog_li\">\u015arodowiska programistyczne (np. PyCharm) wska\u017c\u0105 tak\u0105 implementacj\u0119 jako potencjalny b\u0142\u0105d<\/li>\n<li class=\"blog_li\">Informacja o oczekiwanych typach pozwala uzyska\u0107 lepsze podpowiadanie sk\u0142adni<\/li>\n<li class=\"blog_li\">Stosuj\u0105c tzw. type checker (np. narz\u0119dzie mypy) b\u0142\u0105d zostanie zwr\u00f3cony w momencie wykonania sprawdzenia kodu (np. przed do\u0142\u0105czeniem zmian do wsp\u00f3lnego repozytorium), a nie w momencie jego wykonania w \u015brodowisku testowym lub produkcyjnym<\/li>\n<\/ul>\n<p>Zapis <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\u2192 int<\/code> oznacza, \u017ce dana funkcja zawsze powinna zwr\u00f3ci\u0107 warto\u015b\u0107 typu <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">int<\/code>. \u201cOpakowanie\u201d w <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Optional<\/code> dopuszcza zwr\u00f3cenie r\u00f3wnie\u017c warto\u015bci <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">None<\/code>.<\/p>\n<p>Szczeg\u00f3\u0142owe informacje dotycz\u0105ce mo\u017cliwo\u015bci type hints mo\u017cna znale\u017a\u0107 w dokumentacji:<br \/>\n<a href=\"https:\/\/docs.python.org\/3\/library\/typing.html\">https:\/\/docs.python.org\/3\/library\/typing.html<\/a><\/p>\n<p>Narz\u0119dzie mypy:<br \/>\n<a href=\"https:\/\/github.com\/python\/mypy\">https:\/\/github.com\/python\/mypy<\/a><\/p>\n<p>Prezentacja Carl\u2019a Meyer\u2019a na temat type hints:<br \/>\n<a href=\"https:\/\/youtu.be\/pMgmKJyWKn8\">https:\/\/youtu.be\/pMgmKJyWKn8<\/a><\/p>\n<h2 class=\"blog-h2\">12. Jaki typ NIE mo\u017ce by\u0107 kluczem w s\u0142owniku?<\/h2>\n<p>Poprawna odpowied\u017a to: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">list<\/code>.<\/p>\n<p>Kluczem w s\u0142owniku mo\u017ce by\u0107 ka\u017cdy obiekt, kt\u00f3ry jest \u201chashable\u201d. Oznacza to obiekty, dla kt\u00f3rych warto\u015b\u0107 hash-a nie ulega zmianie i mog\u0105 by\u0107 por\u00f3wnywane z innymi na podstawie posiadanej to\u017csamo\u015bci, a nie warto\u015bci. Zar\u00f3wno <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">int<\/code>, <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">str<\/code> jak i <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">bool<\/code> s\u0105 poprawnymi kluczami dla s\u0142ownika. Lista, podobnie jak inne wbudowane typy mutable nie jest hashable, w zwi\u0105zku z czym nie mo\u017ce by\u0107 pe\u0142ni\u0107 roli klucza w s\u0142owniku.<\/p>\n<p>Informacje o s\u0142owniku oraz hashable:<br \/>\n<a href=\"https:\/\/docs.python.org\/3\/library\/stdtypes.html#typesmapping\">https:\/\/docs.python.org\/3\/library\/stdtypes.html#typesmapping<\/a><br \/>\n<a href=\"https:\/\/docs.python.org\/3\/glossary.html#term-hashable\">https:\/\/docs.python.org\/3\/glossary.html#term-hashable<\/a><\/p>\n<h2 class=\"blog-h2\">13. Jak poprawnie u\u017cy\u0107 pustej listy jako domy\u015blnego argumentu dla funkcji?<\/h2>\n<p>Poprawna odpowied\u017a to:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">def calculate(numbers=None):\n  if numbers is None:\n    numbers = []<\/pre>\n<p>Potrzeba zastosowania tej konstrukcji wynika z faktu, i\u017c lista jest typem mutable oraz ze sposobu w jaki Python przetwarza definicj\u0119 funkcji i domy\u015blne argumenty. Warto\u015bci domy\u015blne s\u0105 przypisywane do argument\u00f3w funkcji gdy interpreter po raz pierwszy \u201cczyta\u201d jej definicj\u0119, nie za\u015b za ka\u017cdym wywo\u0142aniem funkcji. Tak wi\u0119c dzieje si\u0119 to tylko jeden raz, podczas ca\u0142ego wykonania programu. Podanie pustej listy bezpo\u015brednio jako argument domy\u015blny spowoduje, \u017ce dla ka\u017cdego wywo\u0142ania b\u0119dzie to jedna i ta sama lista. Poniewa\u017c jest to typ mutable, wszystkie zmiany wykonane w ramach pierwszego wywo\u0142ania b\u0119d\u0105 widoczne w drugim. Dobrze obrazuje to poni\u017cszy przyk\u0142ad:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">def more_numbers(numbers=[]):\n  print(numbers)\n  numbers.append(1)\n\n&gt;&gt;&gt; more_numbers()\n[]\n&gt;&gt;&gt; more_numbers()\n[1]\n&gt;&gt;&gt; more_numbers()\n[1, 1]<\/pre>\n<p>W ka\u017cdym kolejnym wywo\u0142aniu funkcja korzysta z tej samej listy, kt\u00f3ra zosta\u0142a ju\u017c wcze\u015bniej zmodyfikowana przez poprzednie wykonania. Zastosowanie konstrukcji z wykorzystaniem <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">None<\/code> jako domy\u015blnej warto\u015bci i przypisanie listy do zmiennej dopiero w ciele funkcji jest przyj\u0119tym sposobem na rozwi\u0105zanie tego problemu. Analogiczna sytuacja dotyczy wykorzystywania wszystkich typ\u00f3w mutable jako domy\u015blnych argument\u00f3w funkcji.<\/p>\n<p>Argumenty domy\u015blne &#8211; dokumentacja:<br \/>\n<a href=\"https:\/\/docs.python.org\/3\/tutorial\/controlflow.html#default-argument-values\">https:\/\/docs.python.org\/3\/tutorial\/controlflow.html#default-argument-values<\/a><\/p>\n<p>Artyku\u0142 o wykorzystaniu warto\u015bci mutable jako domy\u015blnych argument\u00f3w funkcji:<br \/>\n<a href=\"https:\/\/nikos7am.com\/posts\/mutable-default-arguments\/\">https:\/\/nikos7am.com\/posts\/mutable-default-arguments\/<\/a><\/p>\n<h2 class=\"blog-h2\">14. Kt\u00f3re z wywo\u0142a\u0144 funkcji <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">def download(url, timeout=5)<\/code>: NIE jest poprawne?<\/h2>\n<p>Poprawna odpowied\u017a to: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">download(url=\"infoshareacademy.com\", 10)<\/code><\/p>\n<p>Takie wywo\u0142anie spowoduje b\u0142\u0105d (SyntaxError) wynikaj\u0105cy z przekazania argumentu pozycyjnego po argumencie nazwanym.<\/p>\n<p>Argumenty przekazywane do funkcji lub metody mog\u0105 by\u0107 argumentami pozycyjnymi (bez nazwy argumentu i znaku <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">=<\/code>) albo argumentami nazwanymi (keyword). Dla funkcji zdefiniowanej tak jak w przyk\u0142adzie mo\u017cliwe jest przekazanie:<\/p>\n<ul>\n<li class=\"blog_li\">obydwu argument\u00f3w jako argumenty pozycyjne <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">download(\"www.infoshareacademy.com\", 10)<\/code><\/li>\n<li class=\"blog_li\">tylko pierwszego argumentu jako argument pozycyjny (timeout przyjmie warto\u015b\u0107 domy\u015bln\u0105)<code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">download(\"www.infoshareacademy.com\")<\/code><\/li>\n<li class=\"blog_li\">tylko pierwszego argumentu jako keyword argument (timeout przyjmie warto\u015b\u0107 domy\u015bln\u0105) <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">download(url=\"infoshareacademy.com\")<\/code><\/li>\n<li class=\"blog_li\">obu argument\u00f3w jako keyword arguments <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">download(url=\"infoshareacademy.com\", timeout=10)<\/code> albo <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">download(timeout=10, url=\"infoshareacademy.com\")<\/code><\/li>\n<\/ul>\n<p>Kolejno\u015b\u0107 keyword arguments nie jest wa\u017cna (interpreter wie, jakiemu argumentowi przypisa\u0107 jak\u0105 warto\u015b\u0107). Kolejno\u015b\u0107 argument\u00f3w pozycyjnych jest wa\u017cna, gdy\u017c odpowiada ich przypisaniu do poszczeg\u00f3lnych zmiennych. Nie jest dozwolone przekazanie argumentu pozycyjnego po keyword arguments, jak r\u00f3wnie\u017c nie jest dozwolone pomini\u0119cie argumentu, kt\u00f3ry nie posiada warto\u015bci domy\u015blnej.<\/p>\n<p>Wprowadzona w PEP 3102 koncepcja Keyword-Only Arguments pozwala wymusi\u0107 podanie niekt\u00f3rych (albo wszystkich) argument\u00f3w w postaci keyword arguments. Ma to na celu zwi\u0119kszenie czytelno\u015bci, w sytuacjach gdy warto\u015b\u0107 przekazywanego argumentu nie jest oczywista, w kontek\u015bcie wywo\u0142ywanej funkcji. Aby zastosowa\u0107 t\u0119 konwencj\u0119, nale\u017cy przy deklarowaniu argument\u00f3w funkcji u\u017cy\u0107 gwiazdki. Spowoduje to, \u017ce wszystkie nast\u0119pne argumenty b\u0119d\u0105 musia\u0142y by\u0107 przekazane jako keywords arguments:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">def something(could_be_positional, *, only_keyword):\n  pass<\/pre>\n<p>Informacje o argumentach funkcji:<br \/>\n<a href=\"https:\/\/docs.python.org\/3\/tutorial\/controlflow.html#more-on-defining-functions\">https:\/\/docs.python.org\/3\/tutorial\/controlflow.html#more-on-defining-functions<\/a><\/p>\n<p>PEP 3102:<br \/>\n<a href=\"https:\/\/www.python.org\/dev\/peps\/pep-3102\/\">https:\/\/www.python.org\/dev\/peps\/pep-3102\/<\/a><\/p>\n<h2 class=\" blog-h2\">15. Jak zwr\u00f3ci\u0107 list\u0119 zawieraj\u0105c\u0105 elementy o indeksach 1, 2 i 3 z listy <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">grades = [5, 3, 2, 5, 6]<\/code>?<\/h2>\n<p>Poprawna odpowied\u017a to: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">grades[1:4]<\/code><\/p>\n<p>Odwo\u0142anie si\u0119 do listy (lub innej sekwencji) za pomoc\u0105 indeksu oraz dwukropka umo\u017cliwia realizacj\u0119 operacji slice. Operacja ta pozwala otrzyma\u0107 list\u0119 element\u00f3w:<\/p>\n<ul>\n<li class=\"blog_li\">od pocz\u0105tku do podanego indeksu <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">[:index]<\/code> (bez elementu o indeksie <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">index<\/code>)<\/li>\n<li class=\"blog_li\">od podanego indeksu do ko\u0144ca <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">[index:]<\/code> (z elementem o indeksie <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">index<\/code>)<\/li>\n<li class=\"blog_li\">pomi\u0119dzy dwoma indeksami <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">[start:end]<\/code> (z elementem o indeksie <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">start<\/code>, bez elementu o indeksie <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">end<\/code>)<\/li>\n<li class=\"blog_li\">pomi\u0119dzy dwoma indeksami, zawieraj\u0105c\u0105 co n-ty element <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">[start:end:n]<\/code> (z elementem o indeksie <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">start<\/code>, nast\u0119pnie element o indeksie <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">start + n<\/code> itd., bez elementu o indeksie <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">end<\/code>)<\/li>\n<\/ul>\n<p>Operacje slice s\u0105 wygodnym sposobem na uzyskanie wybranego podzbioru element\u00f3w z d\u0142u\u017cszej sekwencji. Przy stosowaniu slice\u2019a warto pami\u0119ta\u0107:<\/p>\n<ul>\n<li class=\"blog_li\">pierwszy element list ma indeks 0<\/li>\n<li class=\"blog_li\">ostatni element listy przypisanej do zmiennej <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">numbers<\/code> ma indeks<code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"> -1<\/code> albo <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">len(numbers) - 1<\/code><\/li>\n<li class=\"blog_li\">stosowanie skomplikowanych slice-\u00f3w (np. wykorzystuj\u0105cych ujemne indeksy oraz wybieraj\u0105cych co n-ty element) mocno obni\u017ca czytelno\u015b\u0107 kodu. W takiej sytuacji warto planowan\u0105 operacj\u0119 przeprowadzi\u0107 np. w kilku krokach<\/li>\n<\/ul>\n<p>Listy i operacje na listach:<br \/>\n<a href=\"https:\/\/docs.python.org\/3\/tutorial\/introduction.html#lists\">https:\/\/docs.python.org\/3\/tutorial\/introduction.html#lists<\/a><br \/>\n<a href=\"https:\/\/docs.python.org\/3\/library\/stdtypes.html#common-sequence-operations\">https:\/\/docs.python.org\/3\/library\/stdtypes.html#common-sequence-operations<\/a><\/p>\n<div class=\"blog_box_highlight\" style=\"background-color: rgba(11,168,174,0.1); margin: 40px 0 40px 0; padding: 35px 0 35px 45px; border-left: 10px solid #0ba8ae;\"><span style=\"font-weight: 400; color: #10a8ae; font-size: 1.4em;\">My\u015blisz o rozpocz\u0119ciu nauki?<br \/>\n<a href=\"https:\/\/www.pythonpoczatek.pl\/?utm_source=www&amp;utm_medium=blog&amp;utm_campaign=pythonpoczatek\" rel=\"noopener noreferrer\">Kup w przedsprzeda\u017cy kurs online PythON: Pocz\u0105tek<\/a><\/span><\/div>\n<p>Autor:<\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" class=\"wp-image-3000\" src=\"https:\/\/infoshareacademy.com\/wp-content\/uploads\/2019\/11\/mikolaj-e1573068111763.jpg\" alt=\"Miko\u0142aj Lewandowski - wielki test wiedzy o Pythonie\"><\/figure>\n<p><strong><a href=\"https:\/\/www.linkedin.com\/in\/lewandowski-mikolaj\/\">Miko\u0142aj Lewandowski<\/a><\/strong><br \/>\n<i>Senior Python Developer<\/i><\/p>\n<p>Programista, team leader i trener programowania. Entuzjasta Software Craftsmanship i pragmatycznego podej\u015bcia do rozwijania system\u00f3w. Wierzy w ide\u0119 Civic Tech i to, \u017ce technologia mo\u017ce zmieni\u0107 \u015bwiat. Biegacz, rowerzysta, czasami podr\u00f3\u017cnik.<br \/>\n<script type=\"text\/javascript\" src=\"https:\/\/app.getresponse.com\/view_webform_v2.js?u=SAZgM&amp;webforms_id=BecDY\" data-webform-id=\"BecDY\"><\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W tym j\u0119zyku mo\u017cesz: automatyzowa\u0107 testy, tworzy\u0107 aplikacje webowe, czy wreszcie korzysta\u0107 z przebogatych mo\u017cliwo\u015bci wykorzystania bibliotek do Machine Learningu i Deep Learningu (Data Science). Znasz Pythona? Programujesz na co dzie\u0144 w tym j\u0119zyku? Pora sprawdzi\u0107 swoje umiej\u0119tno\u015bci. Przed Tob\u0105 test wiedzy o Pythonie! Zgodnie z zapowiedzi\u0105 &#8211; przed Tob\u0105 Wielki Test Wiedzy o Pythonie &hellip;<\/p>\n","protected":false},"author":3,"featured_media":9827,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,29,41],"tags":[],"class_list":["post-4715","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artykul","category-back-end","category-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Wielki Test Wiedzy o Pythonie cz. II - infoShare Academy<\/title>\n<meta name=\"description\" content=\"Sprawd\u017a swoj\u0105 wiedz\u0119 i wykonaj test wiedzy o Pythonie! | Zosta\u0144 programist\u0105! Sprawd\u017a zdalne kursy programowania z infoShare Academy!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Wielki Test Wiedzy o Pythonie cz. II - infoShare Academy\" \/>\n<meta property=\"og:description\" content=\"Sprawd\u017a swoj\u0105 wiedz\u0119 i wykonaj test wiedzy o Pythonie! | Zosta\u0144 programist\u0105! Sprawd\u017a zdalne kursy programowania z infoShare Academy!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/\" \/>\n<meta property=\"og:site_name\" content=\"infoShare Academy Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/infoshareacademy\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-17T16:48:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-01-12T08:12:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2020\/01\/szablon_blog-2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"900\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"stokarska\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"stokarska\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/\"},\"author\":{\"name\":\"stokarska\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/90eefec70f6918e70294f2aa5ed2f1cb\"},\"headline\":\"Wielki Test Wiedzy o Pythonie cz. II\",\"datePublished\":\"2020-01-17T16:48:09+00:00\",\"dateModified\":\"2021-01-12T08:12:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/\"},\"wordCount\":3141,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#organization\"},\"articleSection\":[\"Artyku\u0142\",\"Back-end\",\"Python\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/\",\"url\":\"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/\",\"name\":\"Wielki Test Wiedzy o Pythonie cz. II - infoShare Academy\",\"isPartOf\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#website\"},\"datePublished\":\"2020-01-17T16:48:09+00:00\",\"dateModified\":\"2021-01-12T08:12:06+00:00\",\"description\":\"Sprawd\u017a swoj\u0105 wiedz\u0119 i wykonaj test wiedzy o Pythonie! | Zosta\u0144 programist\u0105! Sprawd\u017a zdalne kursy programowania z infoShare Academy!\",\"breadcrumb\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/infoshareacademy.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Wielki Test Wiedzy o Pythonie cz. II\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#website\",\"url\":\"https:\/\/infoshareacademy.com\/blog\/\",\"name\":\"infoShare Academy Blog\",\"description\":\"Strona o szkoleniach w IT\",\"publisher\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/infoshareacademy.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#organization\",\"name\":\"infoShare Academy\",\"url\":\"https:\/\/infoshareacademy.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2022\/11\/infoShare-Academy-ver-white-with-background-1000x1000px.jpg\",\"contentUrl\":\"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2022\/11\/infoShare-Academy-ver-white-with-background-1000x1000px.jpg\",\"width\":1000,\"height\":1000,\"caption\":\"infoShare Academy\"},\"image\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/infoshareacademy\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/90eefec70f6918e70294f2aa5ed2f1cb\",\"name\":\"stokarska\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g\",\"caption\":\"stokarska\"},\"url\":\"https:\/\/infoshareacademy.com\/blog\/author\/stokarska\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Wielki Test Wiedzy o Pythonie cz. II - infoShare Academy","description":"Sprawd\u017a swoj\u0105 wiedz\u0119 i wykonaj test wiedzy o Pythonie! | Zosta\u0144 programist\u0105! Sprawd\u017a zdalne kursy programowania z infoShare Academy!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/","og_locale":"pl_PL","og_type":"article","og_title":"Wielki Test Wiedzy o Pythonie cz. II - infoShare Academy","og_description":"Sprawd\u017a swoj\u0105 wiedz\u0119 i wykonaj test wiedzy o Pythonie! | Zosta\u0144 programist\u0105! Sprawd\u017a zdalne kursy programowania z infoShare Academy!","og_url":"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/","og_site_name":"infoShare Academy Blog","article_publisher":"https:\/\/www.facebook.com\/infoshareacademy","article_published_time":"2020-01-17T16:48:09+00:00","article_modified_time":"2021-01-12T08:12:06+00:00","og_image":[{"width":900,"height":300,"url":"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2020\/01\/szablon_blog-2.png","type":"image\/png"}],"author":"stokarska","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"stokarska","Szacowany czas czytania":"18 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/#article","isPartOf":{"@id":"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/"},"author":{"name":"stokarska","@id":"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/90eefec70f6918e70294f2aa5ed2f1cb"},"headline":"Wielki Test Wiedzy o Pythonie cz. II","datePublished":"2020-01-17T16:48:09+00:00","dateModified":"2021-01-12T08:12:06+00:00","mainEntityOfPage":{"@id":"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/"},"wordCount":3141,"commentCount":0,"publisher":{"@id":"https:\/\/infoshareacademy.com\/blog\/#organization"},"articleSection":["Artyku\u0142","Back-end","Python"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/","url":"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/","name":"Wielki Test Wiedzy o Pythonie cz. II - infoShare Academy","isPartOf":{"@id":"https:\/\/infoshareacademy.com\/blog\/#website"},"datePublished":"2020-01-17T16:48:09+00:00","dateModified":"2021-01-12T08:12:06+00:00","description":"Sprawd\u017a swoj\u0105 wiedz\u0119 i wykonaj test wiedzy o Pythonie! | Zosta\u0144 programist\u0105! Sprawd\u017a zdalne kursy programowania z infoShare Academy!","breadcrumb":{"@id":"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/infoshareacademy.com\/blog\/wielki-test-wiedzy-o-pythonie-cz-ii\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/infoshareacademy.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Wielki Test Wiedzy o Pythonie cz. II"}]},{"@type":"WebSite","@id":"https:\/\/infoshareacademy.com\/blog\/#website","url":"https:\/\/infoshareacademy.com\/blog\/","name":"infoShare Academy Blog","description":"Strona o szkoleniach w IT","publisher":{"@id":"https:\/\/infoshareacademy.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/infoshareacademy.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/infoshareacademy.com\/blog\/#organization","name":"infoShare Academy","url":"https:\/\/infoshareacademy.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/infoshareacademy.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2022\/11\/infoShare-Academy-ver-white-with-background-1000x1000px.jpg","contentUrl":"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2022\/11\/infoShare-Academy-ver-white-with-background-1000x1000px.jpg","width":1000,"height":1000,"caption":"infoShare Academy"},"image":{"@id":"https:\/\/infoshareacademy.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/infoshareacademy"]},{"@type":"Person","@id":"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/90eefec70f6918e70294f2aa5ed2f1cb","name":"stokarska","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g","caption":"stokarska"},"url":"https:\/\/infoshareacademy.com\/blog\/author\/stokarska\/"}]}},"_links":{"self":[{"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/posts\/4715","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/comments?post=4715"}],"version-history":[{"count":1,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/posts\/4715\/revisions"}],"predecessor-version":[{"id":9828,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/posts\/4715\/revisions\/9828"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/media\/9827"}],"wp:attachment":[{"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/media?parent=4715"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/categories?post=4715"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/tags?post=4715"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}