Linux E X P R E S

Facebook

Python 3 (12): zhrnutie prvej etapy seriálu

python.png

V tejto časti seriálu, ktorá vychádza po dlhšej dobe, som sa rozhodol spísať zhrnutie, resp. zopakovanie toho, čo ste sa doteraz v tomto seriáli mohli dozvedieť. Seriál rovnako touto časťou bohužiaľ pozastavujem na dobu neurčitú.


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 stringlist 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 whilefor, 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 ExpressionsList 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.

Diskuze (0) Nahoru