<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 <img src='http
Step1:  Moduły
Architektura programu w Pythonie
<img src='./static/moduly.png' style="margin-left
Step2:  Co można zaimportować?
Plik z kodem źródłowym o nazwie b.py
Plik z kodem bajtowym o nazwie b.pyc
Katalog o nazwie b w przypadku importowania pakietów
Skompilowany moduł rozszerzenia, zazwyczaj napisany w jezykach C lub C++ i dynamiczne dołaczany w momencie importowania (np. b.so w systemie Linux, b.dll lub b.pyd dla Cygwin i Windows)
Skompliowany moduł wbudowany napisany w C i statycznie dołączony do Pythona
Komponent pliku ZIP rozpakowywany automatycznie po zaimportowaniu
Klase z Javy w Jython’ie
Komponent z .NET w IronPython’ie
Jak nazywać?
Moduły powinny być nazywane zgodnie z normalnymi regułami dotyczącymi nazw zmiennych. <br>
Jeśli nazwiemy moduł if.py, nie bedziemy mogli go zaimportowac.
Importowanie
Step3:  from module import (
    name1, 
    name2,
)
jest odpowiednikiem
Step4:  Uwagi
Step5:  Zakresy
1
Step6:  Co zwróci odpalanie modb.py, a co zaimportowanie X z moda?
Step7:  2
Step8:  Co zwróci uruchmienie mod1.py ?
Step9:  __init__.py
Step10:  Importy względne
from . import spam
from .. import spam
Nie jest to jednak dobrą praktyką - lepiej pisać importy absolutne - python3 je wymusza 
Step11:  Stąd
Step12:  Referencje
Step13:  Co się stanie jak odpalimy sec.py?
Step14:  Zadanie
Stwórz bibliotekę do rysowania w konsoli kształtów różnych figur. <br>
Wymagania
<ASSISTANT_TASK:>
Python Code:
range(2), xrange(2)
def gen(r):
    for i in xrange(r):
        yield i ** 2
generator = gen(5)
generator
list(generator)
generator = (i ** 2 for i in xrange(5))
generator
list(generator)
def gen_squares(up_to=100000):
    s = 0
    for sq in (i**2 for i in xrange(up_to)):
        s += sq
    return s
def squares(up_to=100000):
    s = 0
    for sq in [i**2 for i in xrange(up_to)]:
        s += sq
    return s
%memit gen_squares()
%memit squares()
Explanation: <img src='http://pycircle.org/static/pycircle_big.png' style="margin-left:auto; margin-right:auto; height:70%; width:70%">
Wprowadzenie część 3
Generatory
range vs xrange
End of explanation
import sys
sys.path[-2:]
Explanation: Moduły
Architektura programu w Pythonie
<img src='./static/moduly.png' style="margin-left:auto; margin-right:auto; height:70%; width:70%">
a.py - plik najwyższego poziomu <br>
b.py, c.py - moduły
Trochę teorii
instrukcje modułów wykonywane są przy pierwszej operacji importowania
przypisania na najwyższym poziomie pliku tworzą atrybuty modułu
dostęp do przestrzeni nazw modułu odbywa się za pomoca atrybutu __dict__ lub dir(M), oznacza to ze przestrzenie nazw modułów są słownikami.
moduły są jedynym zakresem (lokalne jest w nich globalnym) 
Zakres pliku modułu staję się przestrzenią nazw atrybutów obiektu modułu i istnieje po zaimportowaniu.
Co robi python importując?
Odnalezienie pliku modułu
Skompilowanie go do kodu bajtowego (jeśli to konieczne).
(sprawdzane po datach)
Wykonanie kodu moduły w celu utworzenia definiowanych przez niego obiektów.
Wyszukiwanie modułu
Katalog główny programu.
Katalogi PYTHONPATH (jesli ustawione)
Katalogi biblioteki standardowej.
Zawartosc plików .pth (jeśli obecne)
End of explanation
# %load mod.py
def printer(x):
    print x
ATTR = 1
MUTABLE = [1, 2, 3]
import mod
mod.printer("bla bla")
from mod import printer
printer("bla bla")
Explanation: Co można zaimportować?
Plik z kodem źródłowym o nazwie b.py
Plik z kodem bajtowym o nazwie b.pyc
Katalog o nazwie b w przypadku importowania pakietów
Skompilowany moduł rozszerzenia, zazwyczaj napisany w jezykach C lub C++ i dynamiczne dołaczany w momencie importowania (np. b.so w systemie Linux, b.dll lub b.pyd dla Cygwin i Windows)
Skompliowany moduł wbudowany napisany w C i statycznie dołączony do Pythona
Komponent pliku ZIP rozpakowywany automatycznie po zaimportowaniu
Klase z Javy w Jython’ie
Komponent z .NET w IronPython’ie
Jak nazywać?
Moduły powinny być nazywane zgodnie z normalnymi regułami dotyczącymi nazw zmiennych. <br>
Jeśli nazwiemy moduł if.py, nie bedziemy mogli go zaimportowac.
Importowanie
End of explanation
import mod
mod.ATTR
mod.ATTR = 231
mod.ATTR
import mod
mod.ATTR
%%javascript 
IPython.notebook.kernel.restart();
Explanation: from module import (
    name1, 
    name2,
)
jest odpowiednikiem:
import module
name1 = module.name1
name2 = module.name2
del module
Importowanie odbywa się tylko raz!
End of explanation
# %load mod.py
def printer(x):
    print x
ATTR = 1
MUTABLE = [1, 2, 3]
from mod import ATTR, MUTABLE
ATTR = 1
MUTABLE[2] = 12
import mod
mod.ATTR, mod.MUTABLE
# %load a.py
def fun():
    print "jestem w a"
# %load b.py
def fun():
    print "jestem w b"
from a import fun
from b import fun
fun()
import a
import b
a.fun()
b.fun()
Explanation: Uwagi
End of explanation
# %load moda.py
X = 88
def f():
    global X
    X = 99
# %load modb.py
X = 11
import moda
moda.f()
print(X, moda.X)
Explanation: Zakresy
1
End of explanation
%run modb.py
%%javascript 
IPython.notebook.kernel.restart();
from moda import X
X
Explanation: Co zwróci odpalanie modb.py, a co zaimportowanie X z moda?
End of explanation
# %load mod1.py
x = 1
import mod2
print(x, mod2.x, mod2.mod3.x)
# %load mod2.py
x = 2
import mod3
print(x, mod3.x)
# %load mod3.py
x = 3
Explanation: 2
End of explanation
%run mod1.py
Explanation: Co zwróci uruchmienie mod1.py ?
End of explanation
!tree module/
# %load module/__init__.py
print "module"
x = 1
# %load module/dir1/__init__.py
print "dir1"
y = 2
# %load module/dir1/mod.py
print "mod.py"
z = 3
import module.dir1.mod
import module.dir1.mod
module.x
module.dir1.y
module.dir1.mod.z
Explanation: __init__.py
End of explanation
# %load name.py
print __name__
import name
%run name
Explanation: Importy względne
from . import spam
from .. import spam
Nie jest to jednak dobrą praktyką - lepiej pisać importy absolutne - python3 je wymusza :)
__name__
End of explanation
# %load kolejnosc.py
func1()
def func1():
    print(func2())
func1()
def func2():
    return("No witam")
func1()
%run kolejnosc.py
# %load kolejnosc.py
# func1()
def func1():
    print(func2())
func1()
def func2():
    return("No witam")
func1()
%run kolejnosc.py
# %load kolejnosc.py
# func1()
def func1():
    print(func2())
# func1()
def func2():
    return("No witam")
func1()
%run kolejnosc.py
Explanation: Stąd:
if __name__ == '__main__':
   main()
Kolejność funkcji w modułach
End of explanation
# %load first.py
x = 1
def printer():
    print(x)
# %load sec.py
from first import x, printer
x = 88
printer()
Explanation: Referencje
End of explanation
%run sec.py
Explanation: Co się stanie jak odpalimy sec.py?
End of explanation
from rozwiazania import *
prostokat(4, 10)
kwadrat(5)
trojkat(4)
wiatraczek(10)
Explanation: Zadanie
Stwórz bibliotekę do rysowania w konsoli kształtów różnych figur. <br>
Wymagania:
1. zawiera katalog z modułem/ami w środku
2. zawiera skrypt wykonawczy który będzie coś wyświetał tylko jeżeli odpali się go bezpośrednio
3. można narysować o zadanych wymiarach kwadrat, prostokąt, trójkąt, wiatraczek
End of explanation
<END_TASK>