70
Základy (objektového) Pythonu A4B99RPH – Řešení problémů a hry Tomáš Svoboda, [email protected] katedra kybernetiky, centrum strojového vnímání 26. září 2012 Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP / OOP, Python 1 / 70

Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,[email protected] katedra kybernetiky,centrum

  • Upload
    others

  • View
    17

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Základy (objektového) PythonuA4B99RPH – Řešení problémů a hry

Tomáš Svoboda, [email protected]

katedra kybernetiky, centrum strojového vnímání

26. září 2012

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 1 / 70

Page 2: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Paradigmata programování, malá odbočka

Strukturované programování:I poddruh imperativního programováníI posloupnost příkazů, určuje přesný postupI podobný klasickým návodům, blízký lidskému uvažování

Objektově orientované programování:I interakce objektů např. posíláním zprávI manipulace s daty (objekty)

Deklarativní programování: (funkcionální, logické, . . . )I definujeme problémI postup řešení najde jazyk/počítač sám

. . .

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 2 / 70

Page 3: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Paradigmata programování, malá odbočka

Strukturované programování:I poddruh imperativního programováníI posloupnost příkazů, určuje přesný postupI podobný klasickým návodům, blízký lidskému uvažování

Objektově orientované programování:I interakce objektů např. posíláním zprávI manipulace s daty (objekty)

Deklarativní programování: (funkcionální, logické, . . . )I definujeme problémI postup řešení najde jazyk/počítač sám

. . .

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 3 / 70

Page 4: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Paradigmata programování, malá odbočka

Strukturované programování:I poddruh imperativního programováníI posloupnost příkazů, určuje přesný postupI podobný klasickým návodům, blízký lidskému uvažování

Objektově orientované programování:I interakce objektů např. posíláním zprávI manipulace s daty (objekty)

Deklarativní programování: (funkcionální, logické, . . . )I definujeme problémI postup řešení najde jazyk/počítač sám

. . .

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 4 / 70

Page 5: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Funkce (procedury)

I strukturování programuI logické celkyI opakující se operace (filipika proti copy+paste technice)

1 def jmeno_funkce(parametry):2 prikazy3 return(promenne)

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 5 / 70

Page 6: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Funkce (procedury)

I strukturování programuI logické celkyI opakující se operace (filipika proti copy+paste technice)

1 def jmeno_funkce(parametry):2 prikazy3 return(promenne)

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 6 / 70

Page 7: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Funkce – příklad

1 def area(radius):2 temp = 3.14159 * radius**23 return temp

Pochopitelně, že:

1 class Circle:2 def __init__(self,radius):3 self.r = radius45 def area(self):6 return(self.r**2 * 3.14159)

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 7 / 70

Page 8: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Funkce – příklad

1 def area(radius):2 temp = 3.14159 * radius**23 return temp

Pochopitelně, že:

1 class Circle:2 def __init__(self,radius):3 self.r = radius45 def area(self):6 return(self.r**2 * 3.14159)

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 8 / 70

Page 9: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Funkce – v modulech

Předpokládejme funkce v souboru knihovna.py.

1 import knihovna2 vysledek = knihovna.moje_funkce(parametry)

nebo

1 from knihovna import *2 vysledek = moje_funkce(parametry)

případně

1 from knihovna import moje_funkce2 vysledek = moje_funkce(parametry)

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 9 / 70

Page 10: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Funkce – v modulech

Předpokládejme funkce v souboru knihovna.py.

1 import knihovna2 vysledek = knihovna.moje_funkce(parametry)

nebo

1 from knihovna import *2 vysledek = moje_funkce(parametry)

případně

1 from knihovna import moje_funkce2 vysledek = moje_funkce(parametry)

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 10 / 70

Page 11: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Funkce – v modulech

Předpokládejme funkce v souboru knihovna.py.

1 import knihovna2 vysledek = knihovna.moje_funkce(parametry)

nebo

1 from knihovna import *2 vysledek = moje_funkce(parametry)

případně

1 from knihovna import moje_funkce2 vysledek = moje_funkce(parametry)

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 11 / 70

Page 12: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Funkce – vstupní parametry

1 def moje_fce(par1, par2=implicitni_hodnota_pro_par2):2 prikazy3 return(promenna)456 vysledek_pro_default_par2 = moje_fce(par1_hodnota)7 vysledek = moje_fce(par1_hodnota, par2_hodnota)

Jsou možné i další variance na dané téma (viz např. část 4.7na http://docs.python.org)

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 12 / 70

Page 13: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Konvence, zvyklosti – krátké ohlédnutí

I 4 mezery pro odsazování (editory to typicky udělají zavás), nemíchejte tabelátory a mezery

I raději řádky kratší než 79 znakůI nepoužívejte diakritiku v názvech souborů, jménech

proměnných a raději ani v komentářích.I jména funkcí a proměnných:mala_pismena_s_podtrzitky

I mezery:

1 hypot2 = x*x + y*y NE hypot2=x * x + y * y

Toto není kompletní seznam, přečtěte si Style Guide forPython Code1

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 13 / 70

Page 14: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Konvence, zvyklosti – krátké ohlédnutí

I 4 mezery pro odsazování (editory to typicky udělají zavás), nemíchejte tabelátory a mezery

I raději řádky kratší než 79 znakůI nepoužívejte diakritiku v názvech souborů, jménech

proměnných a raději ani v komentářích.I jména funkcí a proměnných:mala_pismena_s_podtrzitky

I mezery:

1 hypot2 = x*x + y*y NE hypot2=x * x + y * y

Toto není kompletní seznam, přečtěte si Style Guide forPython Code1

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 14 / 70

Page 15: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Konvence, zvyklosti – krátké ohlédnutí

I 4 mezery pro odsazování (editory to typicky udělají zavás), nemíchejte tabelátory a mezery

I raději řádky kratší než 79 znakůI nepoužívejte diakritiku v názvech souborů, jménech

proměnných a raději ani v komentářích.I jména funkcí a proměnných:mala_pismena_s_podtrzitky

I mezery:

1 hypot2 = x*x + y*y NE hypot2=x * x + y * y

Toto není kompletní seznam, přečtěte si Style Guide forPython Code1

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 15 / 70

Page 16: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Konvence, zvyklosti – krátké ohlédnutí

I 4 mezery pro odsazování (editory to typicky udělají zavás), nemíchejte tabelátory a mezery

I raději řádky kratší než 79 znakůI nepoužívejte diakritiku v názvech souborů, jménech

proměnných a raději ani v komentářích.I jména funkcí a proměnných:mala_pismena_s_podtrzitky

I mezery:

1 hypot2 = x*x + y*y NE hypot2=x * x + y * y

Toto není kompletní seznam, přečtěte si Style Guide forPython Code1

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 16 / 70

Page 17: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Konvence, zvyklosti – krátké ohlédnutí

I 4 mezery pro odsazování (editory to typicky udělají zavás), nemíchejte tabelátory a mezery

I raději řádky kratší než 79 znakůI nepoužívejte diakritiku v názvech souborů, jménech

proměnných a raději ani v komentářích.I jména funkcí a proměnných:mala_pismena_s_podtrzitky

I mezery:

1 hypot2 = x*x + y*y NE hypot2=x * x + y * y

Toto není kompletní seznam, přečtěte si Style Guide forPython Code1

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 17 / 70

Page 18: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Konvence, zvyklosti – krátké ohlédnutí

I 4 mezery pro odsazování (editory to typicky udělají zavás), nemíchejte tabelátory a mezery

I raději řádky kratší než 79 znakůI nepoužívejte diakritiku v názvech souborů, jménech

proměnných a raději ani v komentářích.I jména funkcí a proměnných:mala_pismena_s_podtrzitky

I mezery:

1 hypot2 = x*x + y*y NE hypot2=x * x + y * y

Toto není kompletní seznam, přečtěte si Style Guide forPython Code1

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 18 / 70

Page 19: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Seznamy

Uspořádaná (multi)množina hodnot s indexem (od 0).

Příklady seznamů:

1 [10, 20, 30, 40, 40]2 ["spam", "bungee", "swallow"]3 ["hello", 2.0, 5, [10, 20]]4 []

viz příklady on-line

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 19 / 70

Page 20: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Seznamy, procházení, příslušnost, . . .

1 horsemen = ["war", "famine", "pestilence", "death"]23 for i, horseman in enumerate(horsemen):4 print(horseman, "is at position",i)

Pokud nepotřebujeme nutně index, pak elegantněji:

1 for horseman in horsemen:2 print(horseman)

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 20 / 70

Page 21: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Seznamy, procházení, příslušnost, . . .

1 horsemen = ["war", "famine", "pestilence", "death"]23 for i, horseman in enumerate(horsemen):4 print(horseman, "is at position",i)

Pokud nepotřebujeme nutně index, pak elegantněji:

1 for horseman in horsemen:2 print(horseman)

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 21 / 70

Page 22: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Matice, aneb vnořené seznamy

1 2 34 5 67 8 9

1 matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]234 >>> matrix[1]5 [4, 5, 6]67 >>> matrix[1][1]8 5

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 22 / 70

Page 23: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Co vlastně označují proměnné?

1 a = [1,2,3]2 b = a3 b[1] = 104 print(b)5 print(a)

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 23 / 70

Page 24: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

N-tice

skoro jako seznamy, ale prvky N-tic jsou neměnné!

1 >>> ntice = (1,2,3)2 >>> seznam = [1,2,3]

Neměnnost prvků může být i výhodou.

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 24 / 70

Page 25: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Třída jako rozšíření datových typů

Python je velmi flexibilní (to může být výhoda i nevýhoda). Atoto je nejjednodušší použití.

1 class Point:2 """represents a point in 2-D space"""34 blank = Point()5 blank.x = 3.06 blank.y = 4.0

x

y

3.0

4.0

blank

Point

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 25 / 70

Page 26: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Vnořené (embedded) objekty

1 class Rectangle:2 """represent a rectangle.3 attributes: width, height, corner.4 """56 box = Rectangle()7 box.width = 100.08 box.height = 200.09 box.corner = Point()

10 box.corner.x = 0.011 box.corner.y = 0.0

y

0.0x

0.0

width

height

100.0

corner

200.0Point

Rectangle

box

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 26 / 70

Page 27: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Mělká a hluboká kopie složeného objektu1 class Point:2 """represents a point in 2-D space"""34 class Rectangle:5 """represent a rectangle. attributes:6 width, height, corner"""78 box1 = Rectangle()9 box1.width = 100

10 box1.height = 10011 box1.corner = Point()12 box1.corner.x = 113 box1.corner.y = 11415 box2 = box116 box2.height = 200

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 27 / 70

Page 28: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Mělká a hluboká kopie složeného objektu

Možný zdroj těžko odhalitelných chyb.

Zkusme kód a přemýšlejme, proč vidíme to, co při zběžnémmělkém pohledu nedává smysl.

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 28 / 70

Page 29: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Přiřazení

1 box2 = box1

box1

y 1

1

width

height

100

corner

100Point

Rectangle

x

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 29 / 70

Page 30: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Přiřazení

1 box2 = box1

box2

box1

y 1

1

width

height

100

corner

100Point

Rectangle

x

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 30 / 70

Page 31: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Mělká kopie

1 box3 = copy.copy(box1)

box1

y 1

1

width

height

100

corner

100Point

Rectangle

x

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 31 / 70

Page 32: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Mělká kopie

1 box3 = copy.copy(box1)

width 100

100height

cornerbox3

Rectangle

box1

y 1

1

width

height

100

corner

100Point

Rectangle

x

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 32 / 70

Page 33: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Hluboká kopie, aneb klonování

1 box4 = copy.deepcopy(box1)

box1

y 1

1

width

height

100

corner

100Point

Rectangle

x

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 33 / 70

Page 34: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Hluboká kopie, aneb klonování

1 box4 = copy.deepcopy(box1)

Rectangle

Point

corner

width

100

100

height x 1

y 1

box4

box1

y 1

1

width

height

100

corner

100Point

Rectangle

x

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 34 / 70

Page 35: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Třída Time

1 class Time:2 """represents the time of day.3 attributes: hour, minute, second"""45 time = Time()6 time.hours = 117 time.minutes = 598 time.seconds = 30

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 35 / 70

Page 36: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Produktivní (čistá) funkce

1 def add_time(t1, t2):2 sum = Time()3 sum.hours = t1.hours + t2.hours4 sum.minutes = t1.minutes + t2.minutes5 sum.seconds = t1.seconds + t2.seconds6 return sum

I funkce nic nemodifikujeI vytváří nový objektI a není dobře

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 36 / 70

Page 37: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Funkce – modifikátor

1 def increment(time, seconds):2 time.seconds += seconds34 if time.seconds >= 60:5 time.seconds -= 606 time.minutes += 178 if time.minutes >= 60:9 time.minutes -= 60

10 time.hours += 1

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 37 / 70

Page 38: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Čistou funkci nebo modifikátor?

I čisté funkce generují obvykle čitelnější kódI méně náchylné k chybám (pamatujeme diskusi okolo

hloubky kopií)I modifikátory mohou být někdy efektivnějšíI . . .

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 38 / 70

Page 39: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

print_time

1 class Time:2 """represents the time of day.3 attributes: hour, minute, second"""45 def print_time(time):6 print("{:02d}:{:02d}:{:02d}".format(time.hours, time.minutes, time.seconds))78 >>> start = Time()9 >>> start.hours = 9

10 >>> start.minutes = 4511 >>> start.seconds = 0012 >>> print_time(start)13 09:45:00

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 39 / 70

Page 40: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

poznámka k formátování printPython 2.x vs 3.x

Funguje v Python 2.x i 3.x, ale označeno jako obsolete

1 print('%.2d:%.2d:%.2d' % (self.hours, self.minutes, self.seconds))

Nově:

1 print("{:02d}:{:02d}:{:02d}".format(self.hours, self.minutes, self.seconds))

viz: http://docs.python.org/py3k/library/string.html#string-formatting

též http://docs.python.org/py3k/library/stdtypes.html#old-string-formatting-operations

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 40 / 70

Page 41: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

print_time jako metoda třídy

1 class Time:2 def print_time(self):3 print("{:02d}:{:02d}:{:02d}".format(self.hours, self.minutes, self.seconds))

I v zásadě se změnilo jen odsazeníI self označuje objekt, kterého se to týkáI z příkladu použití to bude jasné

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 41 / 70

Page 42: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Čase, vytiskni se! vs. vytiskni nějaký čas

funkce jako aktivní prvek: „vytiskni nějaký čas (který je tidán)“

1 start_time = Time()2 print_time(start_time)

objekt jako aktivní prvek: „vytiskni se, zobraz se!“

1 start_time = Time()2 start_time.print_time()

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 42 / 70

Page 43: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Čase, vytiskni se! vs. vytiskni nějaký čas

funkce jako aktivní prvek: „vytiskni nějaký čas (který je tidán)“

1 start_time = Time()2 print_time(start_time)

objekt jako aktivní prvek: „vytiskni se, zobraz se!“

1 start_time = Time()2 start_time.print_time()

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 43 / 70

Page 44: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Čase vytiskni se – lépe!

1 class Time:2 def __str__(self):3 return("{:02d}:{:02d}:{:02d}".format(self.hours, self.minutes, self.seconds))

1 start_time = Time()2 print(start_time)

Přetížení metody print

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 44 / 70

Page 45: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Čase vytiskni se – lépe!

1 class Time:2 def __str__(self):3 return("{:02d}:{:02d}:{:02d}".format(self.hours, self.minutes, self.seconds))

1 start_time = Time()2 print(start_time)

Přetížení metody print

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 45 / 70

Page 46: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Čase vytiskni se – lépe!

1 class Time:2 def __str__(self):3 return("{:02d}:{:02d}:{:02d}".format(self.hours, self.minutes, self.seconds))

1 start_time = Time()2 print(start_time)

Přetížení metody print

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 46 / 70

Page 47: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Modifikátor objektu1 class Time:2 def increment(self,seconds):3 self.seconds = self.seconds + seconds4 while self.seconds >= 60:5 self.seconds = self.seconds - 606 self.minutes = self.minutes + 17 while self.minutes >= 60:8 self.minutes = self.minutes - 609 self.hours = self.hours + 1

1 c_time = Time()2 c_time.hours = 103 c_time.minutes = 424 c_time.seconds = 245 c_time.increment(500)

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 47 / 70

Page 48: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Modifikátor objektu1 class Time:2 def increment(self,seconds):3 self.seconds = self.seconds + seconds4 while self.seconds >= 60:5 self.seconds = self.seconds - 606 self.minutes = self.minutes + 17 while self.minutes >= 60:8 self.minutes = self.minutes - 609 self.hours = self.hours + 1

1 c_time = Time()2 c_time.hours = 103 c_time.minutes = 424 c_time.seconds = 245 c_time.increment(500)

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 48 / 70

Page 49: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Atributy (proměnné) třídy1 c_time = Time()2 c_time.hours = 103 c_time.minutes = 424 c_time.seconds = 245 c_time.increment(500)

1 class Time:2 def increment(self,seconds):3 self.seconds = self.seconds + seconds4 while self.seconds >= 60:5 self.seconds = self.seconds - 606 self.minutes = self.minutes + 17 while self.minutes >= 60:8 self.minutes = self.minutes - 609 self.hours = self.hours + 1

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 49 / 70

Page 50: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

__init__1 class Time:2 def __init__(self, hours=0, minutes=0, seconds=0):3 self.hours = hours4 self.minutes = minutes5 self.seconds = seconds

1 >>> time = Time()2 >>> print(time)3 00:00:00

1 >>> time = Time (9)2 >>> print(time)3 09:00:00

1 >>> time = Time(9, 45)2 >>> print(time)3 09:45:00Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 50 / 70

Page 51: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

__init__1 class Time:2 def __init__(self, hours=0, minutes=0, seconds=0):3 self.hours = hours4 self.minutes = minutes5 self.seconds = seconds

1 >>> time = Time()2 >>> print(time)3 00:00:00

1 >>> time = Time (9)2 >>> print(time)3 09:00:00

1 >>> time = Time(9, 45)2 >>> print(time)3 09:45:00Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 51 / 70

Page 52: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

__init__1 class Time:2 def __init__(self, hours=0, minutes=0, seconds=0):3 self.hours = hours4 self.minutes = minutes5 self.seconds = seconds

1 >>> time = Time()2 >>> print(time)3 00:00:00

1 >>> time = Time (9)2 >>> print(time)3 09:00:00

1 >>> time = Time(9, 45)2 >>> print(time)3 09:45:00Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 52 / 70

Page 53: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

__init__1 class Time:2 def __init__(self, hours=0, minutes=0, seconds=0):3 self.hours = hours4 self.minutes = minutes5 self.seconds = seconds

1 >>> time = Time()2 >>> print(time)3 00:00:00

1 >>> time = Time (9)2 >>> print(time)3 09:00:00

1 >>> time = Time(9, 45)2 >>> print(time)3 09:45:00Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 53 / 70

Page 54: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

interní proměnné a metody

I pokud neřeknete jinak, je vše veřejnéI některé proměnné a metody jsou spíše pracovní, okolí o

nich vedět nemusí nicI pomocí __ můžete specikovat interní proměnné a metody

Příklad interní metody:

1 def __init_dimensions(self):2 """computes some internal variables"""

Takovou funkci pak můžete volat pouze v tělě třídy

1 self.__init_dimensions()

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 54 / 70

Page 55: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Dědění

1 class Solver:2 def __init__(self,maze):3 """abstract solver implements some methods common for solvers"""4 self.path = []5 self.maze = maze6 self.final_reached = False78 class DummySolver(Solver):9 def __init__(self,maze):

10 """simplistic solver finds a path regardless the walls and others"""11 Solver.__init__(self,maze)

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 55 / 70

Page 56: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Konvence, zvyklosti – krátké ohlédnutí II

I jméno třídy začíná velkým písmenem, slova uvnitř také

1 class MySuperClass:

I pozor na odsazení, ale opět, editor vás hlídáI i když konstruktor __init__ není nutný, je nanejvýš

doporučené ho používat.I čisté (pure) funkce jsou lepší než modifikátoryI vede-li návrh na modifikátory, možná je nejvyšší čas, začít

přemýšlet objektověI pozor na hloubku kopií proměnných

Toto není kompletní seznam, přečtěte si Style Guide forPython Code2

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 56 / 70

Page 57: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Konvence, zvyklosti – krátké ohlédnutí II

I jméno třídy začíná velkým písmenem, slova uvnitř také

1 class MySuperClass:

I pozor na odsazení, ale opět, editor vás hlídáI i když konstruktor __init__ není nutný, je nanejvýš

doporučené ho používat.I čisté (pure) funkce jsou lepší než modifikátoryI vede-li návrh na modifikátory, možná je nejvyšší čas, začít

přemýšlet objektověI pozor na hloubku kopií proměnných

Toto není kompletní seznam, přečtěte si Style Guide forPython Code2

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 57 / 70

Page 58: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Konvence, zvyklosti – krátké ohlédnutí II

I jméno třídy začíná velkým písmenem, slova uvnitř také

1 class MySuperClass:

I pozor na odsazení, ale opět, editor vás hlídáI i když konstruktor __init__ není nutný, je nanejvýš

doporučené ho používat.I čisté (pure) funkce jsou lepší než modifikátoryI vede-li návrh na modifikátory, možná je nejvyšší čas, začít

přemýšlet objektověI pozor na hloubku kopií proměnných

Toto není kompletní seznam, přečtěte si Style Guide forPython Code2

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 58 / 70

Page 59: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Konvence, zvyklosti – krátké ohlédnutí II

I jméno třídy začíná velkým písmenem, slova uvnitř také

1 class MySuperClass:

I pozor na odsazení, ale opět, editor vás hlídáI i když konstruktor __init__ není nutný, je nanejvýš

doporučené ho používat.I čisté (pure) funkce jsou lepší než modifikátoryI vede-li návrh na modifikátory, možná je nejvyšší čas, začít

přemýšlet objektověI pozor na hloubku kopií proměnných

Toto není kompletní seznam, přečtěte si Style Guide forPython Code2

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 59 / 70

Page 60: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Konvence, zvyklosti – krátké ohlédnutí II

I jméno třídy začíná velkým písmenem, slova uvnitř také

1 class MySuperClass:

I pozor na odsazení, ale opět, editor vás hlídáI i když konstruktor __init__ není nutný, je nanejvýš

doporučené ho používat.I čisté (pure) funkce jsou lepší než modifikátoryI vede-li návrh na modifikátory, možná je nejvyšší čas, začít

přemýšlet objektověI pozor na hloubku kopií proměnných

Toto není kompletní seznam, přečtěte si Style Guide forPython Code2

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 60 / 70

Page 61: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Konvence, zvyklosti – krátké ohlédnutí II

I jméno třídy začíná velkým písmenem, slova uvnitř také

1 class MySuperClass:

I pozor na odsazení, ale opět, editor vás hlídáI i když konstruktor __init__ není nutný, je nanejvýš

doporučené ho používat.I čisté (pure) funkce jsou lepší než modifikátoryI vede-li návrh na modifikátory, možná je nejvyšší čas, začít

přemýšlet objektověI pozor na hloubku kopií proměnných

Toto není kompletní seznam, přečtěte si Style Guide forPython Code2

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 61 / 70

Page 62: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Konvence, zvyklosti – krátké ohlédnutí II

I jméno třídy začíná velkým písmenem, slova uvnitř také

1 class MySuperClass:

I pozor na odsazení, ale opět, editor vás hlídáI i když konstruktor __init__ není nutný, je nanejvýš

doporučené ho používat.I čisté (pure) funkce jsou lepší než modifikátoryI vede-li návrh na modifikátory, možná je nejvyšší čas, začít

přemýšlet objektověI pozor na hloubku kopií proměnných

Toto není kompletní seznam, přečtěte si Style Guide forPython Code2

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 62 / 70

Page 63: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Game class

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 63 / 70

Page 64: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Obtíže s objekty a s programováním vůbec

I Nevzdávejte to!I zkusíme spolu projít nejčastější problémyI self a co s ním?I platnost proměnnýchI self vs. „statická“ proměnnáI dynamicky vs. staticky typovaný programovací jazyk

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 64 / 70

Page 65: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Obtíže s objekty a s programováním vůbec

I Nevzdávejte to!I zkusíme spolu projít nejčastější problémyI self a co s ním?I platnost proměnnýchI self vs. „statická“ proměnnáI dynamicky vs. staticky typovaný programovací jazyk

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 65 / 70

Page 66: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Obtíže s objekty a s programováním vůbec

I Nevzdávejte to!I zkusíme spolu projít nejčastější problémyI self a co s ním?I platnost proměnnýchI self vs. „statická“ proměnnáI dynamicky vs. staticky typovaný programovací jazyk

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 66 / 70

Page 67: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Slovníky, typ dict

I kolekce dvojic klíč–hodnotaI podobné seznamům či nticím, kdy místo pořadového

indexu máme obecný klíčI vyskytuje se i v jiných jazycích, někdy se používá název

hash arrayI velmi užitečná datová strukturaI určitě si přečtěte kap. 12 na http://howto.py.czI spoustu užitečných metod, viz google: python dict

methods

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 67 / 70

Page 68: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

jednoduché použití slovníku

1 import string2 import employee3 def read_csv_list(fname):4 employees = {}5 try:6 f_in = open(fname,'r')7 except:8 raise IOError("could not open %s for reading"%fname)9 for line in f_in.readlines():

10 line = sanitize_string(line)11 data = string.split(line,";")12 felusername = data[4]13 if (len(felusername)>1):14 employees[felusername]=employee.Employee(data)15 return(employees)

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 68 / 70

Page 69: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Otázky?

I pokud si vzpomenete později, použijte diskusní fórumI nebo čas na cvičeníI nebo si svoji otázku poznamenejte a položte ji na další

přednášce

Otázky jsou velmi důležité.

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 69 / 70

Page 70: Základy (objektového) Pythonu A4B99RPH -- Re ení problému ... · Základy(objektového)Pythonu A4B99RPH–Řešeníproblémůahry TomášSvoboda,svobodat@fel.cvut.cz katedra kybernetiky,centrum

Literatura I

Tomáš Svoboda, [email protected] / katedra kybernetiky, CMP/ OOP, Python 70 / 70