Pozastavenie seriálu
Ako som už spomenul, kvôli časovým dôvodom (iné priority) som sa rozhodol dočasne pozastaviť tento seriál o programovaní v Python 3, ktorého prvá časť vyšla 27.3. v minulom roku 2015. Seriál má teda takmer po roku 12 častí (vrátane tejto), v ktorých som (dúfam) spísal všetko najzákladnejšie, čo sa programovania v Pythone týka. Poďme sa teda pozrieť na to, o čom všetkom sme v seriáli hovorili, v tomto zhrnutí.
Základné informácie o Python 3
V prvom, úvodnom článku sme si povedali, že Python 3 je (najnovšia) verzia objektovo-orientovaného interpretovaného programovacieho jazyku Python. V súčasnosti poslednou stabilnou verziou tejto verzie je 3.5.1.
V úvodnom článku sme si taktiež napísali, ako Python 3 nainštalovať a ukázali sme si, že jeho interpreter sa dá využívať ako jednoduchá kalkulačka. Teraz, po oboznámení sa s funkciami a inými prvkami Pythonu, vieme interpreter využívať aj zložitejšie, napríklad na počítanie komplexnejších matematických príkladov, pričom program pre ich vypočítanie si píšeme „in real-time“.
Čo sa týka matematiky, v nasledujúcej časti seriálu som v úvode spomenul Python modul math, ktorý združuje zopár pokročilejších matematických funkcií a ukázal, ako ho importovať a použiť. Spomínate?
>>> import math >>> math.sqrt(2209) 47.0
Všetko v Pythone je objekt
Určite nezabúdajte na to, že všetko v Pythone je objekt, či už sa jedná o číslo, reťazec, funkciu, pravdivostnú hodnotu alebo o nič. Každý z týchto objektov je pri vytváraní vytvorený z triedy a má svoje metódy.
>>> nothing = None
>>> nothing
>>> nothing.__class__
<class 'NoneType'>
>>> dir(nothing)
['__bool__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
Čo sme si takisto spomenuli je, že premenné de facto nič neobsahujú len odkazujú práve na jeden objekt, pričom rôzne premenné môžu odkazovať na rovnaký objekt.
>>> number = 12345 # premenná number odkazuje na objekt typu int s obsahom 12345
>>> number2 = number # premenná number2 odkazuje na rovnaký objekt ako number
>>> number3 = 12345 # premenná number3 odkazuje na iný objekt s obsahom 12345
>>> number is number2 # alebo: id(number) == id(number2)
True
>>> number is number3 # alebo: id(number) == id(number3)
False
Práca s reťazcami a zoznamami
Vieme, že s reťazcami môžeme do istej miery pracovať ako so zoznamom, vzhľadom k tomu, že reťazec je de facto zoznam znakov. Prvky v liste, alebo teda znaky v reťazci, sú číslované od nuly a pre výber určitého prvku, alebo skupiny prvkov zo zoznamu či reťazca vieme použiť zápis premenná[začiatok:koniec:krok]
, pričom krok je nepovinný a môže byť aj záporný. Reťazce a zoznamy takisto môžeme spájať rovnakým spôsobom, a to za použitia znamienka +
.
>>> greeting = "Hello, world!"
>>> names = ["Steve", "John", "Matthew"]
>>> print(greeting[:7]+names[1]+"!") # spájame reťazce "Hello, " a "John" a "!"
Hello, John!
>>> names = names + ["Adam", "Agatha"]
>>> names
['Steve', 'John', 'Matthew', 'Adam', 'Agatha']
Samozrejme, v takomto prípade by bolo lepšie použitie či už metódy replace()
triedy str
(string -> reťazec), prípadne word v reťazci pridelenému premennej greeting
nahradiť zloženými zátvorkami a meno dopĺňať pomocou metódy format()
. Viac o rôznych metódach dátových typov string a list som písal v tretej časti seriálu, kde som taktiež spomenul funkciu input()
pre vstup od užívateľa.
Vetvenie programu
Program väčšinou funguje na princípe rozhodovania sa podľa naprogramovaných pravidiel, ako a pri akých podmienkach bude pracovať. Jeho priebeh teda môže byť vetvený a najobyčajnejším spôsobom vetvenia je klasická podmienka, ktorá funguje na princípe pravda/nepravda. Základný zápis podmienky je následovný:
if (podmienka): # príkazy, ktoré sa majú vykonať v prípade splnenej podmienky pass else: # nepovinný blok # príkazy, ktoré sa majú vykonať v prípade nesplnenej podmienky pass
Podmienkou je výraz alebo objekt s pravdivostnou hodnotou True
alebo False
, napríklad 23 + 12 == 35
, kedy samozrejme dostaneme hodnotu True
. Viac o vetvení podmienok a dostupných porovnávacích operátoroch som písal v rovnakom článku, kde som písal o chybách a ich spracovávaní, čo nám vlastne takisto vytvára vetvenie: Python 3 (4): výnimky a podmienky.
Cykly
Pre za sebou opakované úkony samozrejme využívame v Pythone dostupné cykly while a for, prípadne sa dá do istej miery využiť rekurzia (funkcia spúšťajúca sama seba). While používame, pokiaľ chceme beh cyklu vymedziť nejakou podmienkou, ktorá keď platí, cyklus sa opakuje. For využívame na prechádzanie iterovateľnými objektami napríklad dátového typu list, kedy do lokálnej premennej cyklu postupne ukladáme pre každý beh cyklu jednotlivé položky v zozname, s ktorými tak môžeme v cykle pracovať.
Pre zopakovanie, ukážka z časti seriálu zaoberajúcej sa cyklami:
# While: i = 1 while i<=5: print(i) i += 1 # For: for i in range(1, 6): # range(1, 6) vygeneruje list [1, 2, 3, 4, 5, 6] print(i)
Funkcie
Funkcie sú balíčky príkazov, ktoré môžeme spoločne volať z ľubovoľného miesta v programe. Tie môžu pri volaní prijímať argumenty, s ktorými funkcia pracuje a takisto po skončení môžu vracať nejakú hodnotu (resp. objekt). Základná syntax funkcie v Pythone vyzerá takto:
def function(parameter1, …, parameterN): # do something return something
...a volá sa takto: function(argument1, …, argumentN)
. Viac o funkciách samozrejme v častiach seriálu venujúcich sa funkciám: odkaz na prvú časť, odkaz na druhú časť.
Triedy a objekty
Objekty sú samozrejme nedeliteľnou súčasťou Pythonu, keďže, ako už vieme, v Pythone je objekt všetko. Tie sú vytvárané z preddefinovaných tried, a získavajú tak metódy (funkcie objektu) a vlastnosti z týchto tried. Pre ukážku jednoduchej triedy s konštruktorom a metódou, a vytvorenie objektu, použijem starší kód z odpovedajúcej časti seriálu:
class Rectangle:
def __init__(self, a, b):
self.a = a
self.b = b
print("Obdĺžnik s rozmermi {}x{} bol vytvorený.".format(a, b))
def get_dimensions(self):
""" Vráti tuple s rozmermi: (a, b) """
return self.a, self.b
rect1 = Rectangle(1, 5)
rect2 = Rectangle(20, 3)
Triedy a objekty môžu byť samozrejme aj zložitejšie. Napríklad o špeciálnych privátnych metódach tried a dedení sme si hovorili v ďalšej časti seriálu. V danej časti sme si takisto ukázali ako importovať vlastný súbor s Python kódom do nášho programu a celkovo, ako funguje importovanie modulov.
Iterátory a generátory
Iterátorom či už jednotlivých iterovateľných dátových typov (list, set, string) alebo sme si taktiež napísali vlastnú triedu s metódami iterátora, a generátorom (yeld, Generator Expressions a List Comprehensions) sme sa venovali v predposlednej časti seriálu (vrátane tejto). Tie nám umožnili napríklad postupne prechádzať spomenuté dátové typy pomocou next()
, vytvárať nekonečné rovnako iterovateľné objekty alebo konečné zoznamy rovnakým spôsobom.
Pokračovanie?
Predpokladám a dúfam, že k pokračovaniu článku by som sa mohol dostať v lete tento rok. Pokračovať budem, ako som mal v pláne s dekorátormi funkcií a neskôr s rôznymi užitočnými modulmi.