IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

5. diel - Typový systém druhýkrát - Dátové typy v Pythone

V predchádzajúcom cvičení, Riešené úlohy k 3.-4. lekcii Pythona, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

Dnešný Python tutoriál bude teoretickejší, pozrieme sa dôkladnejšie na dátové typy a vysvetlíme si, kedy ktorý použiť. Na konci si ale aj tak ukážeme nejaké príklady.

Dátové typy

Všetky dátové typy v Pythone fungujú ako referencie. To znamená, že hodnota premennej je uložená niekde v pamäti počítača. My k nej potom pristupujeme prostredníctvom referencie (odkazu) na toto miesto v pamäti. To je významný rozdiel oproti niektorým programovacím jazykom, kde sú hodnoty premenných priamo uložené v pamäti.

Všetky premenné v Pythone interne uchovávajú adresu svojich dát v pamäti. Tento spôsob umožňuje odkazovanie na jednu hodnotu z viacerých premenných pomocou rovnakej adresy. Vysvetlime si to na nasledujúcom príklade:

s1 = "Python!"
s2 = s1
print(s1)
print(s2)

V konzole uvidíme výstup:

References:
Python!
Python!

V ukážke vyššie je textový reťazec Python! uložený v pamäti iba raz. Sú tu ale dve referencie odkazujúce na rovnaké miesto – premenné s1 a s2. Premenná s1 obsahuje referenciu na spomínaný textový reťazec, premenná s2 odkazuje na premennú s1. Má teda v sebe uloženú rovnakú adresu ako s1. Tento spôsob šetrí pamäť a bude sa nám hodiť, až budeme neskôr pracovať s objektmi.

Meniteľné a nemeniteľné dátové typy

Python rozlišuje dva druhy dátových typov:

  • meniteľné (mutable)
  • a nemeniteľné (immutable).

Nás budú zatiaľ zaujímať tie základné, ktoré sú nemeniteľné.

Nemeniteľné dátové typy

Nemeniteľné (immutable) typy okrem iného zahŕňajú:

  • int – celé čísla,
  • float – desatinné čísla,
  • Decimal – desatinné čísla s presným výpočtom,
  • bool – logická hodnota (pravda/nepravda),
  • str – textový reťazec,
  • Fraction – zlomky v tvare čitateľa a menovateľa,
  • complex – komplexné čísla s reálnou a imaginárnou časťou.

Bolo by mätúce, keby zmena jednej z premenných menila viac premenných. Práve preto sú základné dátové typy v Pythone nemenné:

s1 = "This is the original text"
s2 = s1
s1 = "This is the new text"
print(s1)
print(s2)

V konzole vidíme výstup:

Immutable types:
This is the new text
This is the original text

Akonáhle vytvoríme nemeniteľný objekt (ako je napr. reťazec), nemôžeme už jeho hodnotu meniť. Ak vykonáme nejakú akciu, ktorá by normálne zmenila hodnotu reťazcovej premennej, Python vytvorí v pamäti nový objekt a náš názov premennej bude odkazovať na tento nový objekt. Starý objekt však zostane nezmenený.

K tejto téme sa ešte vrátime v kurze Objektovo orientovaného programovania v Pythone.

Číselné dátové typy

V Pythone sa číselné dátové typy využívajú na reprezentáciu a manipuláciu s číselnými hodnotami.

Dátový typ int

Tento typ už pomerne dobre poznáme. V Pythone reprezentuje celé čísla, teda čísla bez desatinných miest. Významným rysom typu int v Pythone je jeho flexibilita v porovnaní s celočíselnými dátovými typmi v niektorých iných programovacích jazykoch. V nich je celé číslo často obmedzené svojím rozsahom na základe bitov, ktoré sú pre neho alokované (napr. 32 bity alebo 64 bity). V Pythone však nie je dĺžka čísla typu int pevne stanovená. Namiesto toho je dynamicky rozširovaná podľa potreby, obmedzená je iba dostupnou pamäťou systému. S typom int je možné vykonávať bežné matematické operácie ako sčítanie, odčítanie, násobenie a delenie. Python ďalej poskytuje operácie ako modulo (zvyšok po delení) a celočíselné delenie:

x = 10
y = 3
print(x + y)   # 13
print(x % y)   # 1
print(x // y)  # 3

V konzole vidíme výsledky:

Integer type:
13
1
3

Už sme sa tiež zoznámili s parsovaním. Avšak pokiaľ je to zmysluplné, typ int tiež vie na seba prevádzať iné dátové typy:

float_num = 3.9
int_num = int(float_num)
print(int_num)

V konzole vidíme výsledky:

Integer type:
3

Pokiaľ bude mať Python na zmysluplnosť našej snahy o prevod iného dátového typu na int iný názor ako my, informuje nás o tom chybovou hláškou:

Integer type:
ValueError: invalid literal for int()

Dátové typy float a Decimal

Zatiaľ čo typ int reprezentuje celé čísla, typy float a Decimal v Pythone slúžia na reprezentáciu desatinných čísel. Hoci oba typy zastupujú desatinné čísla, majú rôzne vlastnosti a použitie.

Dátový typ float

Typ float je dátový typ zastupujúci čísla s plávajúcou rádovou čiarkou. Je dôležité si uvedomiť, že čísla typu float nemajú absolútnu presnosť v dôsledku obmedzenia hardvéru a reprezentácie čísel. Môže to viesť (a často vedie) k drobným zaokrúhľovacím chybám. Výstupom tohto kódu často nemusí byť 0.3:

print(0.1 + 0.2)

Namiesto toho sa niekedy dočkáme výsledku ako 0.30000000000000004.

Nedá sa presne povedať, ako často k tomu dôjde, pretože tento jav závisí od konkrétnych čísel, s ktorými pracujeme. Niektoré čísla s plávajúcou rádovou čiarkou môžu byť reprezentované presne, zatiaľ čo iné nie. Problém s 0.1 + 0.2 je známy a často uvádzaný príklad.

Číslo typu float získame aj pomocou exponenciálnej notácie:

b = 2.71e-5  # which is 0.0000271
Dátový typ Decimal

Zatiaľ čo typ float je navrhnutý pre rýchle výpočty, typ Decimal je navrhnutý pre presné výpočty. Je obzvlášť vhodný pre finančné a monetárne aplikácie, kde je potrebná maximálna presnosť. Je navrhnutý tak, aby minimalizoval zaokrúhľovacie chyby a poskytoval presné výsledky, a to aj v prípadoch, keď float môže zlyhať:

from decimal import Decimal
a = Decimal('0.1')
b = Decimal('0.2')
total = a + b
print(total)  # returns exactly 0.3

Hoci sa ponúka zabudnúť na float a pre istotu vždy voliť Decimal, je dôležité vybrať ten správny typ na základe požiadaviek aplikácie:

  • float pre rýchle výpočty,
  • Decimal pre situácie, kde je potrebná maximálna presnosť.

Dátový typ bool

Premenné boolean, ktoré v Pythone reprezentuje typ bool, umožňujú uložiť len dve hodnotyTrue a False. Ukážme si to na nasledujúcom príklade:

b = False
expression = 15 > 5
print(b)
print(expression)

Výstup programu je nasledujúci:

Logical expressions:
False
True

Výraz platí, teda je rovný True, pretože 15 je väčší ako 5. Prejsť z výrazov k podmienkam je síce len malý krôčik, my sa ale podmienkam budeme venovať až neskôr v kurze.

Dátový typ complex

V Pythone je dátový typ complex určený na reprezentáciu komplexných čísel. Komplexné čísla majú reálnu a imaginárnu časť a v matematike sa často reprezentujú v tvare a + bi, kde a je reálna časť, b je imaginárna časť a i je imaginárna jednotka. V Pythone je imaginárna jednotka reprezentovaná písmenom j. Vytvoriť sa dá dvoma spôsobmi:

complex_number1 = 3 + 4j
complex_number2 = complex(3, 4)  # both notations are equivalent

Operácie s komplexnými číslami presahujú hranice nášho kurzu, preto si ich tu uvádzame iba v základnej podobe ako informáciu, že v Pythone existujú. Pre komplexné čísla má Python modul cmath, ktorý obsahuje mnoho užitočných funkcií pre prácu s komplexnými číslami, napríklad pre výpočet magnitúdy, fázového uhla alebo komplexného odmocnenia.

Dátový typ Fraction

Dátový typ Fraction v Pythone umožňuje pracovať s racionálnymi číslami, tj číslami reprezentovanými zlomkami. Je súčasťou modulu fractions a je obzvlášť užitočný v situáciách, kedy je potrebné zachovať presnú hodnotu výpočtu bez zaokrúhľovania, čo je nám už známy problém pri float číslach. Na vytvorenie zlomku použijeme dve celé čísla (čitateľa a menovateľa):

from fractions import Fraction

fraction = Fraction(3, 4)  # represents the fraction 3/4

Pokiaľ zadáme zlomok, ktorý je možné skrátiť, Python to urobí automaticky:

fraction = Fraction(6, 8)  # will automatically be reduced to 3/4

Rovnako ako s celými číslami alebo číslami s plávajúcou rádovou čiarkou máme aj so zlomkami k dispozícii všetky základné aritmetické operácie:

a = Fraction(3, 4)
b = Fraction(1, 3)
result = a + b # addition of fractions 3/4 + 1/3

A nakoniec zlomok ľahko prevedieme na desatinné číslo:

fraction = Fraction(1, 3)
float_value = float(fraction)

To je pre dnešnú lekciu všetko :-)

V budúcej lekcii, Textové reťazce v Pythone, nás čakajú reťazce v Pythone.


 

Predchádzajúci článok
Riešené úlohy k 3.-4. lekcii Pythona
Všetky články v sekcii
Základná konštrukcia jazyka Python
Preskočiť článok
(neodporúčame)
Textové reťazce v Pythone
Článok pre vás napísal gcx11
Avatar
Užívateľské hodnotenie:
42 hlasov
(^_^)
Aktivity