<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FModu%C5%82y</id>
	<title>TI/Moduły - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FModu%C5%82y"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Modu%C5%82y&amp;action=history"/>
	<updated>2026-04-19T17:14:46Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Modu%C5%82y&amp;diff=1595&amp;oldid=prev</id>
		<title>Jarekz: /* Liczby Fibonacciego */</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Modu%C5%82y&amp;diff=1595&amp;oldid=prev"/>
		<updated>2015-05-22T19:50:24Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Liczby Fibonacciego&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pl&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← poprzednia wersja&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Wersja z 19:50, 22 maj 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l280&quot; &gt;Linia 280:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 280:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Zadania==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Zadania==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Liczby Fibonacciego===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Liczby Fibonacciego===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Stwórz moduł &amp;lt;tt&amp;gt;fib3&amp;lt;/tt&amp;gt; zawierający trzy funkcje zwracające &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-tą liczbę Fibonacciego &amp;amp;mdash; obliczoną rekurencyjnie z definicji, w pętli, oraz ze [[&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;wikipl&lt;/del&gt;:Liczby Fibonacciego#Wzór Bineta|wzoru Bineta]]. Sam moduł oraz funkcje muszą mieć ''docstringi''.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Stwórz moduł &amp;lt;tt&amp;gt;fib3&amp;lt;/tt&amp;gt; zawierający trzy funkcje zwracające &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-tą liczbę Fibonacciego &amp;amp;mdash; obliczoną rekurencyjnie z definicji, w pętli, oraz ze [[&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;wikipedia&lt;/ins&gt;:Liczby Fibonacciego#Wzór Bineta|wzoru Bineta]]. Sam moduł oraz funkcje muszą mieć ''docstringi''.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Moduł ma też zawierać bezargumentową funkcję &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt;, której zadaniem jest sprawdzenie poprawności działania wszystkich trzech funkcji i wypisanie odpowiedniego komunikatu. Test powinien być wykonany dla pewnych ustalonych wartości, w szczególności tych granicznych, czyli 0, 1, 2 i innych. Przydatna może być ich lista na http://pl.wikisource.org/wiki/Ciąg_Fibonacciego.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Moduł ma też zawierać bezargumentową funkcję &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt;, której zadaniem jest sprawdzenie poprawności działania wszystkich trzech funkcji i wypisanie odpowiedniego komunikatu. Test powinien być wykonany dla pewnych ustalonych wartości, w szczególności tych granicznych, czyli 0, 1, 2 i innych. Przydatna może być ich lista na http://pl.wikisource.org/wiki/Ciąg_Fibonacciego.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Modu%C5%82y&amp;diff=1593&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot;===Wprowadzenie=== Dowiedziałeś się, jak używać wielokrotnie fragmentu kodu programu dzieląc go na funkcje. A w jaki sposób można używać funkcji zdefiniowanych...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Modu%C5%82y&amp;diff=1593&amp;oldid=prev"/>
		<updated>2015-05-22T19:49:45Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;===Wprowadzenie=== Dowiedziałeś się, jak używać wielokrotnie fragmentu kodu programu dzieląc go na funkcje. A w jaki sposób można używać funkcji zdefiniowanych...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;===Wprowadzenie===&lt;br /&gt;
Dowiedziałeś się, jak używać wielokrotnie fragmentu kodu programu dzieląc go na funkcje. A w jaki sposób można używać funkcji zdefiniowanych w innym miejscu?&lt;br /&gt;
Jak pewnie zgadłeś, odpowiedzią są moduły.&lt;br /&gt;
&lt;br /&gt;
Są różne metody pisania modułów, ale najprościej jest stworzyć plik z rozszerzeniem &amp;lt;tt&amp;gt;.py&amp;lt;/tt&amp;gt;, który będzie zawierał funkcje i zmienne.&lt;br /&gt;
&lt;br /&gt;
Moduły do Pythona można pisać nie tylko w Pythonie. Można, na przykład, napisać moduł do wydajnych obliczeń numerycznych w bardziej wydajnym języku [http://pl.wikipedia.org/wiki/C_(Język_programowania) C]&lt;br /&gt;
i po skompilowaniu używać go w swoim pythonowym kodzie.&lt;br /&gt;
&lt;br /&gt;
Aby użyć zawartości modułu, należy go ''zaimportować''. Dotyczy to również modułów ze standardowej biblioteki Pythona, od czego właśnie zaczniemy.&lt;br /&gt;
&lt;br /&gt;
;Przykład&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
# Nazwa pliku: uzycie_sys.py&lt;br /&gt;
&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
print 'Polecenia linii komend to:'&lt;br /&gt;
for i in sys.argv:&lt;br /&gt;
    print i&lt;br /&gt;
&lt;br /&gt;
print '\n\nPYTHONPATH to:',sys.path,'\n'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Rezultat&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ python uzycie_sys.py my jestesmy argumentami&lt;br /&gt;
Polecenia linii komend to:&lt;br /&gt;
uzycie_sys.py&lt;br /&gt;
my&lt;br /&gt;
jestesmy&lt;br /&gt;
argumentami&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PYTHONPATH to: ['/home/Swaroop', '/usr/lib/python25.zip', '/usr/lib/python2.5', &lt;br /&gt;
'/usr/lib/python2.5/plat-linux2', '/usr/lib/python2.5/lib-tk', '/usr/lib/python2&lt;br /&gt;
.5/lib-dynload', '/usr/local/lib/python2.5/site-packages', '/usr/lib/python2.5/s&lt;br /&gt;
ite-packages', '/usr/lib/python2.5/site-packages/Numeric', '/usr/lib/python2.5/s&lt;br /&gt;
ite-packages/PIL', '/usr/lib/python2.5/site-packages/gst-0.10', '/var/lib/python&lt;br /&gt;
-support/python2.5', '/usr/lib/python2.5/site-packages/gtk-2.0', '/var/lib/pytho&lt;br /&gt;
n-support/python2.5/gtk-2.0']&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PYTHONPATH to lista katalogów, w których Python poszukuje modułów.&lt;br /&gt;
W IDLE listę taką można obejrzeć klikając: &amp;lt;tt&amp;gt;File-&amp;gt;Path Browser&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Jak to działa?====&lt;br /&gt;
Najpierw ''importujemy'' moduł &amp;lt;tt&amp;gt;sys&amp;lt;/tt&amp;gt; używając polecenia &amp;lt;tt&amp;gt;import sys&amp;lt;/tt&amp;gt;, czyli mówimy Pythonowi, że chcemy go używać. Moduł &amp;lt;tt&amp;gt;sys&amp;lt;/tt&amp;gt; zawiera polecenia związane z Pythonem i jego środowiskiem, czyli ''sys''temem.&lt;br /&gt;
&lt;br /&gt;
Podczas wykonywania polecenia &amp;lt;tt&amp;gt;import sys&amp;lt;/tt&amp;gt; Python szuka pliku lub katalogu o odpowiedniej nazwie (m.in. zaczynającej się od &amp;lt;tt&amp;gt;sys&amp;lt;/tt&amp;gt;). Aby operacja się powiodła, moduł musi być w jednym z katalogów wymienionych w zmiennej &amp;lt;tt&amp;gt;sys.path&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Po znalezieniu modułu treść jego głównego bloku zostaje wykonana, a funkcjonalność dostarczana przez moduł staje się dostępna w programie. Opisana ''inicjalizacja'' modułu następuje tylko raz, podczas jego pierwszego importu w danym programie.&lt;br /&gt;
&lt;br /&gt;
Do zmiennych i funkcji zdefiniowanych w module dostajemy się korzystając z notacji ''z kropką''. Na przykład,  zmienna &amp;lt;tt&amp;gt;argv&amp;lt;/tt&amp;gt; w module &amp;lt;tt&amp;gt;sys&amp;lt;/tt&amp;gt; jest dostępna jako (&amp;lt;tt&amp;gt;sys.argv&amp;lt;/tt&amp;gt;), dzięki czemu wiadomo, że ta nazwa jest częścią modułu &amp;lt;tt&amp;gt;sys&amp;lt;/tt&amp;gt;. Zaletą tej notacji jest możliwość zdefiniowania zmiennych o tej samej nazwie w różnych modułach bez utraty jednoznaczności. Możemy mieć wiele zmiennych &amp;lt;tt&amp;gt;argv&amp;lt;/tt&amp;gt; w różnych modułach, i jednoznacznie się do niech odwoływać. &lt;br /&gt;
&lt;br /&gt;
Zmienna &amp;lt;tt&amp;gt;sys.argv&amp;lt;/tt&amp;gt; jest ''listą'' ciągów znaków. (Listy poznamy dokładniej w [[TI:Struktury danych#Lista|następnym rozdziale]].) Dokładniej mówiąc, zawiera listę ''argumentów, z którymi program został wywołany'', czyli nazwę pliku zawierającego program oraz to, co użytkownik programu wpisał po nazwie w wywołaniu z wiersza poleceń.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--- Jeżeli używasz IDE do pisania i uruchamiania tych programów, poszukaj w menu sposobu wpisywania argumentów linii komend. W używanej przez nas wersji IDLE tegosie nie da http://bugs.python.org/issue5680 ---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gdy wpisujemy &amp;lt;tt&amp;gt;python uzycie_sys.py my jestesmy argumentami&amp;lt;/tt&amp;gt;, uruchamiamy moduł &amp;lt;tt&amp;gt;uzycie_sys.py&amp;lt;/tt&amp;gt; za pomocą aplikacji &amp;lt;tt&amp;gt;python&amp;lt;/tt&amp;gt; wraz z argumentami &amp;lt;tt&amp;gt;my jestesmy argumentami&amp;lt;/tt&amp;gt;. Python przechowuje dla nas treść linii komend w zmiennej &amp;lt;tt&amp;gt;sys.argv&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pamiętaj, że nazwa uruchamianego skryptu jest zawsze na początku listy &amp;lt;tt&amp;gt;sys.argv&amp;lt;/tt&amp;gt;. Dlatego w omawianym przykładzie mamy następujące przypisania:&lt;br /&gt;
*  &amp;lt;tt&amp;gt;uzycie_sys.py&amp;lt;/tt&amp;gt; jako &amp;lt;tt&amp;gt;sys.argv[0]&amp;lt;/tt&amp;gt;, &lt;br /&gt;
* &amp;lt;tt&amp;gt;my&amp;lt;/tt&amp;gt; jako &amp;lt;tt&amp;gt;sys.argv[1]&amp;lt;/tt&amp;gt;, &lt;br /&gt;
* &amp;lt;tt&amp;gt;jestesmy&amp;lt;/tt&amp;gt; jako &amp;lt;tt&amp;gt;sys.argv[2]&amp;lt;/tt&amp;gt; &lt;br /&gt;
* &amp;lt;tt&amp;gt;argumentami&amp;lt;/tt&amp;gt; jako &amp;lt;tt&amp;gt;sys.argv[3]&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Zauważ, że Python numeruje od 0, nie od 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sys.path&amp;lt;/tt&amp;gt; zawiera listę katalogów, z których są importowane moduły. Zobacz, że pierwsza pozycja to folder, w którym został uruchomiony program. Folder, w którym został uruchomiony program zostaje automatycznie wstawiony na początek listy, natomiast pozostałe jej elementy są takie same niezależnie od miejsca wywołania.&lt;br /&gt;
Oznacza to, że możesz łatwo importować moduły znajdujące się w katalogu bieżącym. Inne moduły są dostępne tylko w wypadku gdy znajdują się w którymś z katalogów wymienionych w ścieżce.&lt;br /&gt;
&lt;br /&gt;
Przy okazji, możesz w każdej chwili podejrzeć katalog, w którym jesteś wpisując w Pythonie &amp;lt;tt&amp;gt;print os.getcwd()&amp;lt;/tt&amp;gt; (oczywiście najpierw musisz zaimportować moduł &amp;lt;tt&amp;gt;os&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Pliki pośrednie .pyc===&lt;br /&gt;
Importowanie modułu to dosyć czasochłonna operacja, więc Python używa pewnych sztuczek, aby ją przyspieszyć. Jedną z nich jest tworzenie plików skompilowanych do ''kodu bajtowego'' &amp;amp;mdash; pewnej formy pośredniej z rozszerzeniem &amp;lt;tt&amp;gt;.pyc&amp;lt;/tt&amp;gt;. Pliki &amp;lt;tt&amp;gt;.pyc&amp;lt;/tt&amp;gt; są niezależne od platformy. Plik &amp;lt;tt&amp;gt;.pyc&amp;lt;/tt&amp;gt; jest przydatny, gdy masz zamiar zaimportować dany moduł po raz kolejny, używając innego programu - o wiele szybciej, gdyż część pracy potrzebnej do zaimportowania została już wykonana. &lt;br /&gt;
&lt;br /&gt;
;Uwaga&lt;br /&gt;
:Pliki &amp;lt;tt&amp;gt;.pyc&amp;lt;/tt&amp;gt; są zazwyczaj tworzone w tym samym folderze, co odpowiednie pliki &amp;lt;tt&amp;gt;.py&amp;lt;/tt&amp;gt;. Jeżeli Python nie ma pozwolenia na zapis w tym folderze, pliki &amp;lt;tt&amp;gt;.pyc&amp;lt;/tt&amp;gt; nie zostaną utworzone.&lt;br /&gt;
&lt;br /&gt;
===Konstrukcja from ... import ...===&lt;br /&gt;
Jeżeli chcesz bezpośrednio zaimportować zmienną &amp;lt;tt&amp;gt;argv&amp;lt;/tt&amp;gt; do swojego programu (aby nie pisać ciągle &amp;lt;tt&amp;gt;sys.&amp;lt;/tt&amp;gt;), możesz użyć wyrażenia &amp;lt;tt&amp;gt;from sys import argv&amp;lt;/tt&amp;gt;. Jeżeli chcesz zaimportować wszystko, co znajduje się w module &amp;lt;tt&amp;gt;sys&amp;lt;/tt&amp;gt;, możesz użyć wyrażenia &amp;lt;tt&amp;gt;from sys import *&amp;lt;/tt&amp;gt;. To działa z każdym modułem.&lt;br /&gt;
&lt;br /&gt;
Tak naprawdę, powinieneś normalnie używać formy &amp;lt;tt&amp;gt;import ...&amp;lt;/tt&amp;gt;,&lt;br /&gt;
i odwoływać się do zmiennych z innych modułów przez nazwę ich modułu.&lt;br /&gt;
Formy &amp;lt;tt&amp;gt;from...import...&amp;lt;/tt&amp;gt; powinieneś używać wtedy, gdy dana nazwa będzie używana bardzo często i kłopotliwe byłoby używanie pełnej ścieżki. Formy z gwiazdką&lt;br /&gt;
nie powinieneś używać w programach, bo powoduje zaśmiecenie przestrzeni nazw.&lt;br /&gt;
Niemniej jest ona użyteczna w trybie interaktywnym, gdzie naprawdę nie chcemy pisać długich nazw.&lt;br /&gt;
&lt;br /&gt;
===Konstrukcja import ... as ... ===&lt;br /&gt;
Istnieje też możliwość zaimportowania modułu pod inną nazwę. Konstrukcja &amp;lt;tt&amp;gt;import&amp;lt;/tt&amp;gt; ''nazwa_modulu'' &amp;lt;tt&amp;gt;as&amp;lt;/tt&amp;gt; ''inna_nazwa'' spowoduje zaimportowanie modułu, z tym, że dostęp do jego zmiennych i funkcji będzie się odbywał przez &amp;lt;tt&amp;gt;inna_nazwa.&amp;lt;/tt&amp;gt; . Może to być przydatne jeśli chcemy sobie oszczędzić pisania (na ogół ''inna_nazwa'' wybierana jest jako znacznie krótsza niż oryginalna ''nazwa_modulu'')&lt;br /&gt;
&lt;br /&gt;
===Samoidentyfikacja modułu===&lt;br /&gt;
Każdy moduł posiada zmienną zawierającą jego nazwę (zazwyczaj). Najczęściej używa się tej zmiennej wtedy,&lt;br /&gt;
gdy chcemy się dowiedzieć, czy moduł został zaimportowany, czy uruchomiony jako program. Jak już wcześniej wspomniano, gdy moduł zostaje zaimportowany po raz pierwszy, jego kod zostaje wykonany. W przypadku definicji funkcji i klas ich wykonanie oznacza po prostu zdefiniowanie tych funkcji i klas. Polecenia zapisane w treści funkcji nie zostają wykonane w momencie ''definicji'' funkcji, lecz dopiero później, w momencie ''wywołania'' funkcji. Podobnie jest dla klas, czyli definicja klasy nie powoduje stworzenia obiektu.&lt;br /&gt;
Natomiast wyrażenia znajdujące się poza definicjami funkcji i klasy zostają wykonane od razu.&lt;br /&gt;
Często chcemy, by zostałe one wykonane tylko wtedy, gdy uruchamiamy moduł jako program.&lt;br /&gt;
&lt;br /&gt;
Zmienna &amp;lt;tt&amp;gt;__name__&amp;lt;/tt&amp;gt; zawiera nazwę modułu. Wyjątkiem jest sytuacja gdy został on uruchomiony samodzielnie, jako program. Wówczas zawiera napis &amp;lt;tt&amp;gt;'__main__'&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Dzięki temu możemy rozróżnić dwa sposoby wywołania modułu i podjąć odpowiednie decyzje.&lt;br /&gt;
&lt;br /&gt;
;Przykład&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
# Nazwa pliku: nazwa.py&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    print 'Ten program jest uruchomiony samodzielnie.'&lt;br /&gt;
else:&lt;br /&gt;
    print 'Zostałem zaimportowany z innego modułu.'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Rezultat&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='shell_example'&amp;gt;&lt;br /&gt;
$ python nazwa.py&lt;br /&gt;
Ten program jest uruchomiony samodzielnie.&lt;br /&gt;
&lt;br /&gt;
$ python&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import nazwa&lt;br /&gt;
Zostałem zaimportowany z innego modułu.&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Jak to działa?====&lt;br /&gt;
Każdy moduł Pythona ma zdefiniowaną własną nazwę. Jeżeli jest nią &amp;lt;tt&amp;gt;'__main__'&amp;lt;/tt&amp;gt;, oznacza to, że moduł działa samodzielnie, a wtedy możemy podjąć odpowiednie działania.&lt;br /&gt;
&lt;br /&gt;
===Tworzenie własnych modułów===&lt;br /&gt;
Tworzenie własnych modułów jest proste, robisz to cały czas! A to dlatego, że każdy program w Pythonie jest także modułem. Ty musisz tylko zadbać, żeby miał rozszerzenie &amp;lt;tt&amp;gt;.py&amp;lt;/tt&amp;gt;. Ten przykład powinien wszystko wyjaśnić.&lt;br /&gt;
&lt;br /&gt;
Przykład&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
# Nazwa pliku: mojmodul.py&lt;br /&gt;
&lt;br /&gt;
def mowczesc():&lt;br /&gt;
    print 'Cześć, tu mówi mojmodul.'&lt;br /&gt;
&lt;br /&gt;
__version__ = '0.1'&lt;br /&gt;
&lt;br /&gt;
# Koniec modułu mojmodul.py.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oto przykładowy moduł. Jak widać, nie ma tu nic szczególnie różniącego go od zwykłego programu w Pythonie. Następnie zobaczymy, jak go użyć w innych naszych programach.&lt;br /&gt;
&lt;br /&gt;
Pamiętaj, że moduł powinien być umieszczony w tym samym katalogu co program, który z niego korzysta, lub też w jednym z katalogów wpisanych w &amp;lt;tt&amp;gt;sys.path&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
# Nazwa pliku: mojmodul_demo.py&lt;br /&gt;
&lt;br /&gt;
import mojmodul&lt;br /&gt;
&lt;br /&gt;
mojmodul.mowczesc()&lt;br /&gt;
print 'Wersja', mojmodul.__version__&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rezultat&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ python mojmodul_demo.py&lt;br /&gt;
Cześć, tu mówi mojmodul.&lt;br /&gt;
Wersja 0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Jak to działa?====&lt;br /&gt;
Zauważ, że używamy tego samego zapisu z kropkami przy uzyskiwaniu dostępu do elementów modułu. Python robi dobry użytek z tej samej notacji nadając temu swoisty „pythonowy” styl, dzięki czemu nie musimy wciąż poznawać coraz to nowych metod pracy.&lt;br /&gt;
&lt;br /&gt;
Oto wersja z użyciem &amp;lt;tt&amp;gt;from...import...&amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
# Nazwa pliku: mojmodul_demo2.py&lt;br /&gt;
&lt;br /&gt;
from mojmodul import mowczesc, __version__&lt;br /&gt;
&lt;br /&gt;
mowczesc()&lt;br /&gt;
print 'Wersja', __version__&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rezultat &amp;lt;tt&amp;gt;mojmodul_demo2.py&amp;lt;/tt&amp;gt; jest taki sam jak &amp;lt;tt&amp;gt;mojmodul_demo.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ta forma jest przykładem bardzo złego stylu.&lt;br /&gt;
Zauważ, że jeżeli nazwa &amp;lt;tt&amp;gt;__version__&amp;lt;/tt&amp;gt; już istniała wcześniej w module, który importuje &amp;lt;tt&amp;gt;mojmodul&amp;lt;/tt&amp;gt;, powstanie konflikt nazw. Na dodatek jest to bardzo prawdopodobne, ponieważ zmienna o nazwie &amp;lt;tt&amp;gt;__version__&amp;lt;/tt&amp;gt; jest standardowo używana po przechowywania wersji modułu.&lt;br /&gt;
W momencie kiedy plik &amp;lt;tt&amp;gt;mojmodul_demo&amp;lt;/tt&amp;gt; zostanie wydłużony, łatwo o pomyłkę, bo normalnie &amp;lt;tt&amp;gt;__version__&amp;lt;/tt&amp;gt; to wersja bieżącego modułu, a tutaj to wersja modułu &amp;lt;tt&amp;gt;mojmodul&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Stąd zawsze lepiej użyć wyrażenia &amp;lt;tt&amp;gt;import&amp;lt;/tt&amp;gt; w taki sposób, by ograniczyć liczbę importowanych nazw.&lt;br /&gt;
&lt;br /&gt;
Możesz także użyć:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
from mojmodul import *&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To spowoduje zaimportowanie prawie wszystkich nazw, jak na przykład &amp;lt;tt&amp;gt;mowczesc&amp;lt;/tt&amp;gt;, ale ominie &amp;lt;tt&amp;gt;__version__&amp;lt;/tt&amp;gt;, gdyż zaczyna się ona od podwójnego podkreślenia. Ta wersja jest jeszcze brzydsza.&lt;br /&gt;
&lt;br /&gt;
==Funkcja dir==&lt;br /&gt;
Możesz użyć wbudowanej funkcji &amp;lt;tt&amp;gt;dir&amp;lt;/tt&amp;gt;, aby wypisać nazwy zdefiniowane w pewnym obiekcie. Na przykład w module takie nazwy wskazują na funkcje, klasy i zmienne w nim zadeklarowane.&lt;br /&gt;
&lt;br /&gt;
Gdy &amp;lt;tt&amp;gt;dir()&amp;lt;/tt&amp;gt; zostaje wywołane z argumentem, to działa na nim. W wypadku wywołania &amp;lt;tt&amp;gt;dir()&amp;lt;/tt&amp;gt; bez argumentu, działa ono na przestrzeni nazw, z której została wywołana.&lt;br /&gt;
&lt;br /&gt;
Przykład&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
$ python&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import sys # Zdobądź listę atrybutów, w tym wypadku dla modułu sys.&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; dir(sys)&lt;br /&gt;
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__s&lt;br /&gt;
tderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_g&lt;br /&gt;
etframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_trac&lt;br /&gt;
ing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_clear&lt;br /&gt;
', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'f&lt;br /&gt;
lags', 'float_info', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',&lt;br /&gt;
 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'get&lt;br /&gt;
sizeof', 'gettrace', 'hexversion', 'maxint', 'maxsize', 'maxunicode', 'meta_path&lt;br /&gt;
', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix',&lt;br /&gt;
 'ps1', 'ps2', 'py3kwarning', 'pydebug', 'setcheckinterval', 'setdlopenflags', '&lt;br /&gt;
setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subv&lt;br /&gt;
ersion', 'version', 'version_info', 'warnoptions']&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; dir() # Zdobądź listę atrybutów dla aktualnego modułu.&lt;br /&gt;
['__builtins__', '__doc__', '__name__', '__package__', 'sys']&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; a = 5 # Stwórz nową zmienną &amp;quot;a&amp;quot;.&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; dir()&lt;br /&gt;
['__builtins__', '__doc__', '__name__', '__package__', 'a', 'sys']&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; del a # Usuń nazwę.&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; dir()&lt;br /&gt;
['__builtins__', '__doc__', '__name__', '__package__', 'sys']&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Jak to działa?===&lt;br /&gt;
Na początku sprawdzamy działanie &amp;lt;tt&amp;gt;dir&amp;lt;/tt&amp;gt; na zaimportowanym module &amp;lt;tt&amp;gt;sys&amp;lt;/tt&amp;gt;. Widać długą listę jego atrybutów.&lt;br /&gt;
&lt;br /&gt;
Następnie używamy funkcji &amp;lt;tt&amp;gt;dir&amp;lt;/tt&amp;gt; bez parametrów. Domyślnie zwraca ona listę atrybutów aktualnego modułu. Zauważ, że lista zaimportowanych modułów jest też częścią wyniku.&lt;br /&gt;
&lt;br /&gt;
W celu ujrzenia &amp;lt;tt&amp;gt;dir&amp;lt;/tt&amp;gt; w akcji, deklarujmy nową zmienną &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;, przypisujemy jej wartość, a następnie sprawdzamy, że na liście pojawiła nazwa naszej nowej zmiennej. Usuwamy ją poleceniem &amp;lt;tt&amp;gt;del&amp;lt;/tt&amp;gt;, czego efekt widać po kolejnym użyciu &amp;lt;tt&amp;gt;dir&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Uwaga do &amp;lt;tt&amp;gt;del&amp;lt;/tt&amp;gt; — to polecenie ''usuwa'' zmienną/nazwę (w tym wypadku &amp;lt;tt&amp;gt;del a&amp;lt;/tt&amp;gt;), w efekcie później nie da się odnieść do tej nazwy, tak jakby nigdy wcześniej nie istniała.&lt;br /&gt;
&lt;br /&gt;
Pamiętaj, że funkcja &amp;lt;tt&amp;gt;dir()&amp;lt;/tt&amp;gt; działa z ''każdym'' obiektem. Na przykład możesz napisać &amp;lt;tt&amp;gt;dir(max)&amp;lt;/tt&amp;gt;, aby poznać atrybuty funkcji &amp;lt;tt&amp;gt;max&amp;lt;/tt&amp;gt;, albo &amp;lt;tt&amp;gt;dir(str)&amp;lt;/tt&amp;gt;, aby poznać atrybuty klasy &amp;lt;tt&amp;gt;str&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Paczki==&lt;br /&gt;
Właśnie zacząłeś dogłębnie poznawać hierarchię elementów twoich programów. Zmienne zazwyczaj znajdują się w funkcjach. Funkcje oraz zmienne globalne — w modułach. A co gdy chcesz zarządzać modułami? W tym miejscu na scenę wkraczają paczki.&lt;br /&gt;
&lt;br /&gt;
Paczki to katalogi z modułami oraz ze specjalnym plikiem &amp;lt;tt&amp;gt;__init__.py&amp;lt;/tt&amp;gt;, który informuje Pythona, że ten katalog jest specjalnie przeznaczony właśnie do przechowywania modułów.&lt;br /&gt;
&lt;br /&gt;
Powiedzmy, że chcesz stworzyć paczkę o nazwie &amp;lt;tt&amp;gt;swiat&amp;lt;/tt&amp;gt; zawierającą paczki &amp;lt;tt&amp;gt;azja&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;afryka&amp;lt;/tt&amp;gt; itd., zaś w nich na przykład &amp;lt;tt&amp;gt;indie&amp;lt;/tt&amp;gt; czy &amp;lt;tt&amp;gt;madagaskar&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Oto, jak powinna wyglądać twoja struktura katalogów&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  ''jakiś katalog wymieniony w sys.path''&lt;br /&gt;
  └── swiat/&lt;br /&gt;
      ├── __init__.py&lt;br /&gt;
      ├── azja/&lt;br /&gt;
      │   ├── __init__.py&lt;br /&gt;
      │   ├── indie.py&lt;br /&gt;
      │   └── chiny.py&lt;br /&gt;
      └── afryka/&lt;br /&gt;
          ├── __init__.py&lt;br /&gt;
          └── madagaskar.py&lt;br /&gt;
&lt;br /&gt;
Paczki są wygodnym sposobem segregacji modułów. Zobaczysz wiele przykładów ich użycia w [[../Biblioteka standardowa/|bibliotece standardowej]].&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie==&lt;br /&gt;
Tak jak funkcje są częściami programu wielokrotnego użytku, tak moduły to programy wielokrotnego użytku. Paczki są odrębną hierarchią organizacji modułów. Standardowa biblioteka Pythona jest przykładem zestawu paczek i modułów.&lt;br /&gt;
&lt;br /&gt;
Zobaczyliśmy jak użyć tych modułów i utworzyć swoje własne.&lt;br /&gt;
&lt;br /&gt;
Następnie poznamy pewne interesujące koncepty zwane strukturami danych.&lt;br /&gt;
&lt;br /&gt;
==Zadania==&lt;br /&gt;
===Liczby Fibonacciego===&lt;br /&gt;
Stwórz moduł &amp;lt;tt&amp;gt;fib3&amp;lt;/tt&amp;gt; zawierający trzy funkcje zwracające &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-tą liczbę Fibonacciego &amp;amp;mdash; obliczoną rekurencyjnie z definicji, w pętli, oraz ze [[wikipl:Liczby Fibonacciego#Wzór Bineta|wzoru Bineta]]. Sam moduł oraz funkcje muszą mieć ''docstringi''.&lt;br /&gt;
&lt;br /&gt;
Moduł ma też zawierać bezargumentową funkcję &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt;, której zadaniem jest sprawdzenie poprawności działania wszystkich trzech funkcji i wypisanie odpowiedniego komunikatu. Test powinien być wykonany dla pewnych ustalonych wartości, w szczególności tych granicznych, czyli 0, 1, 2 i innych. Przydatna może być ich lista na http://pl.wikisource.org/wiki/Ciąg_Fibonacciego.&lt;br /&gt;
&lt;br /&gt;
Następnie napisz moduł &amp;lt;tt&amp;gt;fib3-czas&amp;lt;/tt&amp;gt;, który wykorzystuje moduł &amp;lt;tt&amp;gt;fib3&amp;lt;/tt&amp;gt; i moduł &amp;lt;tt&amp;gt;time&amp;lt;/tt&amp;gt; aby porównać szybkość wykonywania wszystkich trzech algorytmów. Wynik powienien zostać wypisany w postaci tabelki&lt;br /&gt;
  n    T1/ms    T2/ms    T3/ms&lt;br /&gt;
  1     0.5     0.3      0.7&lt;br /&gt;
  2     0.5     0.5      1.0&lt;br /&gt;
  ...   ...     ...      ...&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>