Sterowanie: spacja + shift-spacja || page down + page up || strzałki || esc
class Kot:
def glos(self):
print("Miau")
class Pies:
def glos(self):
print("Hau")
class Krowa:
def glos(self):
print("Muu") for zwierze in [Kot(), Pies(), Krowa()]:
zwierze.glos() # za każdym razem inny typMiau
Hau
Muuclass Ryba:
pass # brak definicji glosfor zwierze in [Kot(), Pies(), Krowa(), Ryba()]:
zwierze.glos() # Ryba nie ma zdefiniowanej metody glosMiau
Hau
Muu
...
AttributeError: 'Ryba' object has no attribute 'glos'class Zwierze:
def glos(self):
pass
class Kot(Zwierze):
def glos(self): # nadpisuje Zwierze.glos
print("Miau")
class Ryba(Zwierze):
passfor zwierze in [Kot(), Ryba()]:
zwierze.glos() # Ryba siedzi cichoMiauclass Zwierze:
def glos(self):
raise NotImplementedError("Każde zwiesze musi mieć głos.")
class Kot(Zwierze):
def glos(self): # nadpisuje Zwierze.glos
print("Miau")
class Ryba(Zwierze):
passfor zwierze in [Kot(), Ryba()]:
zwierze.glos() # Ryba zwróci błądMiau
...
NotImplementedError: Każde zwiesze musi mieć głos.class Wielokat:
def __init__(self, *boki):
self.boki = boki # krotka
def obwod(self): # suma długości
return sum(self.boki) # boków
def pole(self): raise NotImplementedErrorw = Wielokat(1, 2, 3, 4, 5) # pięciokąt
w.obwod()15class Trojkat(Wielokat):
def __init__(self, *boki):
super().__init__(*boki) # utwórz wielokąt
def pole(self):
pole = p = self.obwod()/2 # obwod zdefiniowane w Wielokat
for bok in self.boki: # wzór Herona
pole *= (p - bok) # p(p - a)(p - b)(p - c)
return pole**0.5 # pierwiastekt = Trojkat(3, 4, 5)
t.obwod() # z Wielokat12t.pole() # z Trójkat6.0class TrojkatR(Trojkat):
def __init__(self, bok):
super().__init__(bok, bok, bok) # Trójkąt -> Wielokąt
def pole(self):
return (self.boki[0]**2)*(3**0.5)/4t = TrojkatR(3) # (3, 3, 3)
t.pole() # TrojkatR.pole()3.8971143170299736t = Trojkat(3, 3, 3)
t.pole() # Trojkat.pole() 3.897114317029974class Samochod:
def jedz(self):
print("Jadę...")
class Lodz:
def plyn(self):
print("Płynę...")
class Amfibia(Samochod, Lodz): passamfibia = Amfibia()
amfibia.jedz() # Samochod
amfibia.plyn() # LodzJadę...
Płynę...class Samochod:
def run(self):
print("Jadę...")
class Lodz:
def run(self):
print("Płynę...")
class Amfibia1(Samochod, Lodz): pass
class Amfibia2(Lodz, Samochod): passamifibia1 = Amfibia1()
amifibia1.run()Jadę...amifibia2 = Amfibia2()
amifibia2.run()Płynę...%timeit -n1 range(1000000) # tworzy obiekt range1 loop, best of 3: 1.68 µs per loop# kolejne elementy range
# muszą zostać zapisane w pamięci
%timeit -n1 list(range(1000000))1 loop, best of 3: 53.3 ms per loopdef geometryczny(a1, q, n):
"""Generuje n wyrazów ciągu geometrycznego."""
ciag = [a1]
for _ in range(n-1): # n-1 bo pierwszy już jest
ciag.append(ciag[-1]*q) # następny = poprzedni * iloraz
return ciagciag = geometryczny(1, 3, 10)
print(ciag)[1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683]def gen_geometryczny(a1, q, n):
"""Generuje n wyrazów ciągu geometrycznego."""
for _ in range(n):
yield a1 # zwróć obecną wartość a1
a1 *= q # i czekaj na kolejną iteracjęciag1 = geometryczny(1, 3, 10) # zwraca listę
ciag2 = gen_geometryczny(1, 3, 10) # zwraca generatorprint(ciag1)[1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683]print(ciag2)<generator object gen_geometryczny at 0x7f9bac1ec678>next(ciag2) # pierwszy element1next(ciag2) # kolejny element itd3# a najczęściej w pętli
for i in gen_geometryczny(1, 3, 10):
print(i, end=', ')1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, %timeit -n3 geometryczny(1, 3, 10000)3 loops, best of 3: 12.8 ms per loop%timeit -n3 gen_geometryczny(1, 3, 10000)3 loops, best of 3: 978 ns per loopdef test_lista():
"""Pętla po liście"""
for element in geometryczny(1, 3, 10000):
pass
def test_generator():
"""Pętla po generatorze"""
for element in gen_geometryczny(1, 3, 10000):
pass%timeit -n3 test_lista()3 loops, best of 3: 13.6 ms per loop%timeit -n3 test_generator()3 loops, best of 3: 12.1 ms per loopciag = gen_geometryczny(1, 3, 20) # generuje 20 wyrazówfor i in range(10): # wydrukuj 10 pierwszych
print(next(ciag), end=' ')1 3 9 27 81 243 729 2187 6561 19683
for element in ciag: # nie zaczyna od pierwszego!
print(element, end=' ')59049 177147 531441 1594323 4782969 14348907 43046721 129140163 387420489 1162261467 def lista_loop(n=10):
"""Wykonuje n pętli po liście"""
ciag = geometryczny(1, 3, 10000)
for _ in range(n):
for element in ciag:
pass
def gen_loop(n=10):
"""Wykonuje n pętli po generatorze"""
for _ in range(n):
for element in gen_geometryczny(1, 3, 10000):
pass%timeit -n3 lista_loop()3 loops, best of 3: 14.2 ms per loop%timeit -n3 gen_loop()3 loops, best of 3: 77.4 ms per loop# chcemy stworzyć listę zawierającą
# kwadraty wszystkich cyfr
kwadraty = []
for x in range(10):
kwadraty.append(x**2)
print(kwadraty)[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]# a korzystając z listy skladanej
kwadraty = [x**2 for x in range(10)]
print(kwadraty)[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]def create_list(n=100000):
"""Tworzy listę kwadratów pierwszych n liczb naturalnych"""
kwadraty = []
for x in range(n):
kwadraty.append(x**2)
return kwadraty
def list_comprehension(n=100000):
"""Tworzy listę kwadratów pierwszych n liczb naturalnych"""
return [x**2 for x in range(n)]%timeit -n3 x = create_list() # lista tworzona przez append3 loops, best of 3: 48.3 ms per loop%timeit -n3 y = list_comprehension() # lista składana3 loops, best of 3: 42.5 ms per loopcreate_list() == list_comprehension() # wynik ten samTruedef force(m, a):
"""Zwraca wartość siły [N].
Liczy siłę jaką należy zadziałać na ciało
o masie m [kg], aby nadać mu przyspieszenie a [m/s^2].
"""
return m*a
wagi = [10, 20, 30, 40, 50] # kg
przyspieszenia = [1, 2, 3, 4, 5] # m/s^2# stwórz tablicę z wartościami sił
sily = [force(m, a) for m, a in zip(wagi, przyspieszenia)]
print(sily)[10, 40, 90, 160, 250]# lista składana
list_comprehension = [x**2 for x in range(10)]
# generator expression
generator = (x**2 for x in range(10))for x in generator:
print(x, end=' ')0 1 4 9 16 25 36 49 64 81 # lub prościej
for x in (x**2 for x in range(10)):
print(x, end=' ')0 1 4 9 16 25 36 49 64 81 krotka = *(x**2 for x in range(10)),
print(krotka)(0, 1, 4, 9, 16, 25, 36, 49, 64, 81)