Linux E X P R E S

Facebook

Python 3 (2): pokročilá matematika, premenné a dátové typy

python.png

V minulej časti sme sa dostali po používanie Pythonu ako jednoduchú kalkulačku. Teraz na to nadviažem a pozrieme sa na ďalšie, pokročilejšie matematické funkcie. Ďalej si povieme niečo o premenných a dátových typoch v Python 3. 


Pokročilejšie matematické funkcie (Moduly)

V Pythone (tak ako aj vo väčšine ostatných jazykov) je už v základnej inštalácii dostupných niekoľko knižníc – modulov, ktoré združujú rôzne funkcie. Moduly Pythonu sú väčšinou napísané v Céčku alebo v Pythone samotnom. Jedným z modulov je aj modul math, ktorý obsahuje pokročilé matematické funkcie. Predtým, ako chceme daný modul použiť, musíme ho najprv importovať.

Moduly sa importujú pomocou príkazu import (nečakané, že?) a to takto:

>>> import math

Teraz máme importovaný modul math, ktorý v sebe obsahuje niekoľko funkcií týkajúcich sa matematiky. Nájdeme v ňom napríklad funkcie pre odmocniny, logaritmy či goniometrické funkcie.  Celý zoznam funkcií a ich popis nájdete v oficiálnej dokumentácii Python 3, my si teraz ukážeme len nejaké základné príklady.

Funkcie modulov po importovaní modulu príkazom import voláme spôsobom: názov_modulu.funkcia(). Takže v prípade, že by sme chceli z modulu math použiť funkciu pre druhú odmocninu, použijeme: math.sqrt(36). Goniometrické funkcie ako sínus, kosínus či tangens majú v module skrátené názvy cos, sintan. Môžeme teda skúsiť vypočítať sínus 90° takto:

>>> math.sin(90)
0.8939966636005579

Vidíme však, že sme nedostali očakávaný výsledok. Ide o to, že vstupom týchto funkcií je veľkosť uhla v radiánoch. V module math však nájdeme aj funkcie pre premenu veľkosti uhla zo stupňov na radiány math.radians() a opačne math.degrees(). Vypočítanie sínusu 90°  bude teda vyzerať takto:

>>> math.sin(math.radians(90))
1.0

Okrem funkcií v module math nájdeme aj dve konštanty: Ludolfovo a Eulerovo číslo.

>>> math.pi
3.141592653589793
>>> math.e
2.718281828459045

Ostatným modulom sa postupne budem podrobnejšie venovať v ďalších dieloch.

Premenné a dátové typy

Premenná je niečo, čo nám umožňuje ukladať dáta rôzneho typu. V prípade Pythonu premenná po vytvorení ukazuje na nejaký objekt. Je potrebné si uvedomiť, že všetko v Pythone je objekt či už sa jedná o funkciu, slovo (reťazec) alebo číslo. Pre jednoduchú ukážku použijem dátový typ integer čiže celé číslo.

>>> Číslo = 12345
>>> Číslo
12345

Týmto sme vytvorili objekt obsahujúci celé číslo 12345, na ktorý ukazuje premenná s názvom „Číslo“. V Pythone je možné premennú nazvať akýmkoľvek zhlukom čísel a písmen vrátane diakritiky a veľkých písmen, pričom môžeme použiť aj podčiarkovník _. Nie je však povolené názov premennej začať číslom a takisto nemôžete premennú pomenovať kľúčovým slovom Pythonu. Python je case-sensitive, čo znamená, že rozlišuje veľké a malé písmená.

Pozíciu objektu v pamäti, na ktorý ukazuje premenná, Číslo zistíme pomocou funkcie id.

>>> id(Číslo)
140580596424592

Graficky znázornená premenná ukazujúca na vytvorený objekt Graficky znázornená premenná ukazujúca na vytvorený objekt

Teraz skúsime ďalšej premennej priradiť obsah premennej Číslo:

>>> To_isté_číslo = Číslo
>>> To_isté_číslo
12345
>>> id(To_isté_číslo)
140580596424592

Vidíme, že keď sme premennej To_isté_číslo priradili obsah premennej Číslo, naozaj ukazuje na ten istý objekt (s rovnakou pozíciou v pamäti).

To_isté_číslo ukazuje na rovnaký objekt ako premenná Číslo To_isté_číslo ukazuje na rovnaký objekt ako premenná Číslo

Čo sa stane pokiaľ zmeníme obsah premennej Číslo?

>>> Číslo = 54321
>>> Číslo
54321
>>> To_isté_číslo
12345
>>> id(Číslo)
140580595791888
>>> id(To_isté_číslo)
140580596424592

Po priradení čísla 54321 premennej Číslo sme vytvorili nový objekt s obsahom 54321. Premenná Číslo tak prestala ukazovať na predchádzajúci objekt a odteraz ukazuje na objekt nový. Na objekt s číslom 12345 naďalej ukazuje premenná To_isté_číslo, takže tento objekt sa nikde nestratil a stále existuje v pamäti.

To_isté_číslo naďalej ukazuje na objekt 12345 To_isté_číslo naďalej ukazuje na objekt 12345

Ukážme si, čo sa stane, pokiaľ ďalšej premennej priradíme rovnaké číslo, ale nepoužijeme pri tom ani jednu z predchádzajúcich premenných:

>>> Rovnaké_číslo = 12345
>>> Rovnaké_číslo
12345
>>> id(Rovnaké_číslo)
140580595791856

Teraz vidíme, že premenná Rovnaké_číslo síce vráti rovnaké číslo ako premenná To_isté_číslo, ale nejedná sa o ten istý objekt. Týmto sme vytvorili nový objekt s obsahom 12345 a v pamäti tak máme dva obsahovo identické objekty s rozdielnou pozíciou.

Premenná Rovnaké_číslo je síce obsahovo zhodná s premennou To_isté_číslo ale neukazuje na rovnaký objekt Premenná Rovnaké_číslo je síce obsahovo zhodná s premennou To_isté_číslo ale neukazuje na rovnaký objekt

5.png, Pokiaľ na objekt prestanú ukazovať všetky premenné, objekt zanikne. 5.png, Pokiaľ na objekt prestanú ukazovať všetky premenné, objekt zanikne.

Poznámka 1: pri menších číslach alebo krátkych reťazcoch a podobne sa môže stať, že budú všetky premenné ukazovať na rovnaký objekt aj pokiaľ premennej nepriradíme priamo obsah inej premennej. Táto vec je ovplyvnená implementáciou Pythonu 3, a tak sa toto správanie môže v závislosti od platformy a operačného systému meniť.

Poznámka 2: Názvy premenných som napísal s diakritikou len pre ukážku, že sa to dá. V praxi sa však diakritika a slovenské či české názvy nepoužívajú. Preto v ďalších príkladoch už budem používať len názvy premenných v angličtine.

Integer – celé číslo

Takže, už sme si vlastne povedali o prvom dátovom type – integer, ktorý predstavuje celé číslo. Do tohto dátového typu môžeme okrem čísiel v desiatkovej sústave uložiť aj čísla iných číselných sústav:
>>> binary_num = 0b1100101
>>> octal_num = 0o74152063
>>> hexadecimal_num = 0xFEABCD9517368420
Pre zistenie, či sa skutočne jedná o daný typ, použijeme funkciu type():
>>> type(binary_num)
<class 'int'>
Vidíme, že číslo uložené v premennej binary_num naozaj patrí do triedy int, čo je skrátene integer.

Float – číslo s desatinnou čiarkou

Ďalším číselným dátovým typom je float, do ktorého sa ukladajú všetky čísla s desatinnou čiarkou. Výnimkou niesu ani celé čísla s desatinnou čiarkou, ako napríklad 5.0. Akonáhle sa v čísle vyskytne desatinná čiarka, jedná sa o float.
>>> float_num = 658.0
>>> type(float_num)
<class 'float'>
>>> float_num = 0.25
>>> type(float_num)
<class 'float'>

Complex – komplexné číslo

Posledným číselným dátovým typom je complex. Komplexné čísla v Pythone zapíšeme rovnako ako v matematike.
>>> complex_number = 3.3+2j
>>> complex_number
(3.3+2j)
>>> type(complex_number)
<class 'complex'>
Pre počítanie s komplexnými číslami má Python dostupný modul cmath (complex math).


String – reťazec

Pokiaľ chceme do premennej uložiť napríklad písmeno, slovo, vetu či celý text, používame dátový typ string. Do stringu môžeme uložiť všetky znaky existujúce v znakovej sade. String sa ohraničuje buď vrchnými úvodzovkami "reťazec", apostrofmi 'reťacez' alebo ich strojenými ekvivalentmi """terazec""" a '''teracez'''. Reťazec označený úvodzovkami sa od reťazca označeného apostrofmi nijak neodlišuje. Jediným rozdielom je, že v „úvodzovkovom“ reťazci nemôžme len tak použiť znak " a v prípade apostrofov zasa znak '. Toto je však riešiteľné použitím escapování, čo znamená, že pred daný znak umiestníme spätnú lomku \ a tak zabezpečíme, že Python nebude úvodzovku či apostrof brať ako ukončenie stringu a znak vypíše. Pokiaľ by sme spätnú lomku nepoužili, Python by sa sťažoval a vypísal by nám chybu. Reťazce označené trojitými úvodzovkami alebo apostrofmi môžu obsahovať viac riadkov a takisto v nich môžeme voľne používať apostrofy aj úvodzovky bez ohľadu na to, aké znaky sme použili pre označenie reťazca.
Keď už sme sa dostali k reťazcom, asi by bolo načase predstaviť funkciu print(), ktorú budeme používať na vypísanie obsahu premennej.
>>> string1 = 'He said: "I\'ll kill you!"'
>>> print(string1)
He said: "I'll kill you!"
>>> type(string1)
<class 'str'>
>>> string2 = "\"Mňa kedys' zvádzal svet\" - Pavol Országh-Hviezdoslav"
>>> print(string2)
"Mňa kedys' zvádzal svet" - Pavol Országh-Hviezdoslav
>>> string3 = """"Mňa kedys’ zvádzal svet, mi hovoriac:
... Reč, ktorú z domu vieš, ó, jak je lichá!"
... - Pavol Országh-Hviezdoslav"""
>>> print(string3)
"Mňa kedys' zvádzal svet, mi hovoriac:
Reč, ktorú z domu vieš, ó, jak je lichá!"
- Pavol Országh-Hviezdoslav

List – zoznam

List je dátovým typom, do ktorého môžeme vložiť viac prvkov, pričom prvky nemusia byť rovnakého dátového typu. Do listu tak môžeme vložiť číslo, reťazec či ďalšie listy. Označujeme ho pomocou hranatých zátvoriek [] a jednotlivé prvky oddeľujeme čiarkami.
>>> list = [54, 8.9, 0j, "slovo", string1, [], [1, 2, "a"]]
>>> type(list)
<class 'list'>
>>> print(list)
[54, 8.9, 0j, 'slovo', '"Mňa kedys\' zvádzal svet" - Pavol Országh-Hviezdoslav', [], [1, 2, 'a']]
Takto sme vytvorili zoznam obsahujúci číslo 54, desatinné číslo 8.9, komplexné číslo 0j, reťazec slovo, reťazec z premennej string1, prázdny list a ďalší list s obsahom 1, 2 a "a".

Set – list druhýkrát

Tento dátový typ je veľmi podobný listu s tým rozdielom, že ho označujeme pomocou {} a neobsahuje duplicitné prvky.
>>> list = [1, 2, 4, 3, 3]
>>> set = {1, 2, 4, 3, 3}
>>> print(list)
[1, 2, 4, 3, 3]
>>> print(set)
{1, 2, 3, 4}

Tuple – N-tica (list tretíkrát)

N-tica je ďalší dátový typ, ktorý môže obsahovať rôzne prvky. Označujeme ho jednoduchými zátvorkami () a od listu a setu sa odlišuje hlavne tým, že jeho obsah je po definovaní nemenný.
>>> tuple = (0, "rtzc", list, ("a", "b"), ())
>>> print(tuple)
(0, 'rtzc', [1, 2, 4, 3, 3], ('a', 'b'), ())

Dictionary – slovník

Slovník je takisto podobný listu. Vieme doň rovnako uložiť akýkoľvek dátový typ, ale na rozdiel od listu, v ktorom má každá položka len svoju pozíciu, v slovníku definujeme číslo/slovo alebo čokoľvek pod čo ukladáme položku. Dá sa to chápať ako dynamicky definované názvy premenných.
>>> dict = {1:"A", 2: set, 9:54}
>>> type(dict)
<class 'dict'>
>>> print(dict)
{1: 'A', 2: {1, 2, 3, 4}, 9: 54}

None – nič

Dátový typ NoneType nepredstavuje nič... Teda vlastne, predstavuje nič. Označuje sa slovom None a pokiaľ premennej priradíme None, nebude sa jednať o prázdnu premennú (taká neexistuje), ale o premennú, ktorá obsahuje objekt „nič“.
>>> none = None
>>> none
>>> print(none)
None
>>> type(none)
<class 'NoneType'>

Boolean – pravda/nepravda

Pre uloženie pravdivostnej hodnoty, napríklad nejakého výrazu, používame dátový typ boolean, ktorý obsahuje dve kľúčové slová: True, v prípade, že sa jedná o pravdivý výraz a False, pokiaľ je výraz nepravdivý. Boolean sa používa hlavne pri podmienkach, ku ktorým sa dostaneme neskôr.
>>> truth = True
>>> untruth = False
>>> type(truth)
<class 'bool'>
>>> print(truth, untruth)
True False
Pokiaľ už niekedy programovali v nejakom staticky typovanom jazyku, kde je potrebné premenné presne deklarovať na daný dátový typ, určite ste si všimli, že v Pythone sa nič také nerobí. Python je dynamicky typovaný jazyk, čo znamená, že do rovnakej premennej môžete počas behu programu uložiť dáta rôzneho dátového typu, pričom premenné nemusíte vopred deklarovať.

Nabudúce...

...si ukážeme, ako môžeme s jednotlivými dátovými typmi manipulovať a prípadne medzi nimi premieňať. Taktiež si ukážeme, ako do premennej zapísať vstup od užívateľa a vytvoríme si už do tejto časti sľubovaný jednoduchý program.

Diskuze (6) Nahoru