range vs xrange
In [1]:
range(2), xrange(2)
Out[1]:
In [2]:
def gen(r):
for i in xrange(r):
yield i ** 2
In [3]:
generator = gen(5)
generator
Out[3]:
In [4]:
list(generator)
Out[4]:
In [5]:
generator = (i ** 2 for i in xrange(5))
generator
Out[5]:
In [6]:
list(generator)
Out[6]:
In [1]:
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
In [2]:
%memit gen_squares()
In [3]:
%memit squares()
a.py - plik najwyższego poziomu
b.py, c.py - moduły
__dict__ lub dir(M), oznacza to ze przestrzenie nazw modułów są słownikami.Zakres pliku modułu staję się przestrzenią nazw atrybutów obiektu modułu i istnieje po zaimportowaniu.
In [7]:
import sys
sys.path[-2:]
Out[7]:
In [ ]:
# %load mod.py
def printer(x):
print x
ATTR = 1
MUTABLE = [1, 2, 3]
In [12]:
import mod
mod.printer("bla bla")
In [13]:
from mod import printer
printer("bla bla")
from module import (
name1,
name2,
)
jest odpowiednikiem:
import module
name1 = module.name1
name2 = module.name2
del module
In [14]:
import mod
mod.ATTR
Out[14]:
In [15]:
mod.ATTR = 231
mod.ATTR
Out[15]:
In [16]:
import mod
mod.ATTR
Out[16]:
In [ ]:
%%javascript
IPython.notebook.kernel.restart();
In [ ]:
# %load mod.py
def printer(x):
print x
ATTR = 1
MUTABLE = [1, 2, 3]
In [1]:
from mod import ATTR, MUTABLE
In [2]:
ATTR = 1
MUTABLE[2] = 12
In [3]:
import mod
In [4]:
mod.ATTR, mod.MUTABLE
Out[4]:
In [ ]:
# %load a.py
def fun():
print "jestem w a"
In [ ]:
# %load b.py
def fun():
print "jestem w b"
In [8]:
from a import fun
from b import fun
fun()
In [9]:
import a
import b
a.fun()
b.fun()
In [ ]:
# %load moda.py
X = 88
def f():
global X
X = 99
In [ ]:
# %load modb.py
X = 11
import moda
moda.f()
print(X, moda.X)
Co zwróci odpalanie modb.py, a co zaimportowanie X z moda?
In [14]:
%run modb.py
In [ ]:
%%javascript
IPython.notebook.kernel.restart();
In [38]:
from moda import X
X
Out[38]:
In [ ]:
# %load mod1.py
x = 1
import mod2
print(x, mod2.x, mod2.mod3.x)
In [ ]:
# %load mod2.py
x = 2
import mod3
print(x, mod3.x)
In [ ]:
# %load mod3.py
x = 3
Co zwróci uruchmienie mod1.py ?
In [9]:
%run mod1.py
In [13]:
!tree module/
In [ ]:
# %load module/__init__.py
print "module"
x = 1
In [ ]:
# %load module/dir1/__init__.py
print "dir1"
y = 2
In [ ]:
# %load module/dir1/mod.py
print "mod.py"
z = 3
In [17]:
import module.dir1.mod
In [18]:
import module.dir1.mod
In [19]:
module.x
Out[19]:
In [20]:
module.dir1.y
Out[20]:
In [21]:
module.dir1.mod.z
Out[21]:
from . import spam
from .. import spam
Nie jest to jednak dobrą praktyką - lepiej pisać importy absolutne - python3 je wymusza :)
In [ ]:
# %load name.py
print __name__
In [25]:
import name
In [26]:
%run name
Stąd:
if __name__ == '__main__':
main()
In [ ]:
# %load kolejnosc.py
func1()
def func1():
print(func2())
func1()
def func2():
return("No witam")
func1()
In [28]:
%run kolejnosc.py
In [ ]:
# %load kolejnosc.py
# func1()
def func1():
print(func2())
func1()
def func2():
return("No witam")
func1()
In [30]:
%run kolejnosc.py
In [ ]:
# %load kolejnosc.py
# func1()
def func1():
print(func2())
# func1()
def func2():
return("No witam")
func1()
In [32]:
%run kolejnosc.py
In [ ]:
# %load first.py
x = 1
def printer():
print(x)
In [ ]:
# %load sec.py
from first import x, printer
x = 88
printer()
Co się stanie jak odpalimy sec.py?
In [35]:
%run sec.py
Stwórz bibliotekę do rysowania w konsoli kształtów różnych figur.
Wymagania:
In [ ]:
from rozwiazania import *
In [35]:
prostokat(4, 10)
In [36]:
kwadrat(5)
In [37]:
trojkat(4)
In [34]:
wiatraczek(10)