Martin Svoboda

Martin Svoboda - Blog

Převod datových typů


Převod datových typů je důležitý koncept při programování v Pythonu. Pomáhá zajistit, že operace s různými typy dat jsou prováděny správně a konzistentně. Python nabízí dva způsoby, jak provádět tento převod - implicitní a explicitní castování (/kástování/ z anglického casting /kæstɪŋ/). V tomto článku si vysvětlíme oba druhy a ukážeme si, jak je správně využívat.

Implicitní castování

Co je implicitní casting?

Implicitní castování probíhá automaticky, aniž by bylo nutné zásahu programátora. Python inteligentně převede jeden datový typ na jiný, aby zabránil ztrátě přesnosti a zajistil správné provedení operací. Typicky se to děje například při operacích mezi int a float. Python převede int na float, protože desetinná čísla (float) poskytují větší rozsah a přesnost než celá čísla (int).

cele_cislo = 5
desetinne_cislo = 5.5

soucet = cele_cislo + desetinne_cislo
print(soucet) # 10.5 - výsledek je desetinné číslo

Zde je cele_cislo převedeno na desetinné číslo, aby bylo možné provést sčítání s desetinne_cislo.

Boolean na integer

Vezměme si následující příklad, kde operace mezi bool a int vede k automatickému převedení datového typu bool na int:

pravda = True
nepravda = False
celkove_cislo = 5

soucet = pravda + celkove_cislo # 1 + 5 = 6
print(soucet) # 6 - výsledek je celé číslo

soucet = nepravda + celkove_cislo # 0 + 5 = 5
print(soucet) # 5 - výsledek je celé číslo

V tomto případě je True převedeno na hodnotu 1 a False na hodnotu 0, což umožňuje provést sčítání s celým číslem 5.

Komplexní čísla

Na vrcholu heirarchie čísel sedí komplexní čísla, s těmi se člověk jen tak nesetká, ale pro úplnost je zde příklad:

komplexni_cislo = 5 + 5j
desetinne_cislo = 5.5


soucet = komplexni_cislo + desetinne_cislo # 5 + 5j + 5.5 = 10.5 + 5j
print(soucet) # (10.5+5j) - výsledek je komplexní číslo

Historie implicitního castování

Existuje jistá hierarchie “přesnosti” a zde je:

  1. Komplexní čísla (complex) - Skládá se ze dvou floatů, jednoho pro reálnou část a druhého pro imaginární část.
  2. Float (float)
  3. Integery (int)
  4. Booleans (bool)

Znamená to, že pokud se pokusíte provést operaci mezi dvěma různými typy, Python automaticky převede méně přesný typ na ten přesnější. Na příklad, pokud se pokusíte sčítat int a float, Python převede int na float, protože float poskytuje větší rozsah a přesnost než int. Apod.

Explicitní castování

Na rozdíl od implicitního castingu je explicitní castování prováděno programátorem. To se děje pomocí vestavěných funkcí jako int(), float(), str() a bool(). V mnoha situacích vzniká potřeba explicitního castingu z důvodu nekompatibility datových typů nebo specifických požadavků programu. Například:

  • Ošetšení vstupu: Funkce input() vždy vrací řetězec. Pokud očekáváš číslo, musíš ho castovat.
  • Konzistence dat: Při práci s daty z různých zdrojů se běžně vyskytují nesrovnalosti v datových typech. Explicitní casting může pomoci tato data standardizovat.
  • Předcházení typovým chybám: V situacích, kdy je očekáván určitý datový typ (např. při použití určitých funkcí nebo metod), může explicitní casting zabránit chybám souvisejícím s typem.

Vzpomeň si na příklady s input():

text_cislo = '1'
cislo = int(text_cislo)  # Výsledek: 1

Vestavěné funkce pro explicitní castování:

  • int(): Převede na celé číslo (integer).
  • float(): Převede na desetinné číslo (floating point).
  • str(): Převede na řetězec (string).
  • bool(): Převede na boolean (True/False).

Následující příklad ukazuje, jak explicitní castování funguje pro různé datové typy. Některé řádky vyvolají chybu, protože převod není možný, tak je dobré je zakomentovat 😉.

cele_cislo     = 1     # int
desetine_cislo = 1.0   # float
text_cislo     = '1'   # str
text           = 'asdf'# str
pravda         = True  # bool
nepravda       = False # bool


print("int----------")
print(int(cele_cislo))      # 1
print(int(desetine_cislo))  # 1
print(int(text_cislo))      # 1
print(int(text))            # ValueError: invalid literal for int() with base 10: 'asdf'
print(int(pravda))          # 1
print(int(nepravda))        # 0
print("float----------")
print(float(cele_cislo))     # 1.0
print(float(desetine_cislo)) # 1.0
print(float(text_cislo))     # 1.0
print(float(text))           # ValueError: could not convert string to float: 'asdf'
print(float(pravda))         # 1.0
print(float(nepravda))       # 0.0
print("str----------")
print(str(cele_cislo))       # '1'
print(str(desetine_cislo))   # '1.0'
print(str(text))             # 'asdf'
print(str(pravda))           # 'True'
print(str(nepravda))         # 'False'
print("bool----------")
print(bool(cele_cislo))      # True
print(bool(desetine_cislo))  # True
print(bool(text))            # True
print(bool(pravda))          # True
print(bool(nepravda))        # False
print(bool(''))              # False
print(bool('0'))             # True
print(bool(0))               # False

Všimni si, že "1" python převede na číslo, ale asdf již ne. Pokud je řetězec tvořen číslem, tak python je schopen převodu na číslo, ale pokud jde o písmena a znamky, tak python neví jak má převod provézt a k převodu nedojde (ValueError).

Další aspekt, který stojí za pozornost je bool(). Všimni si, že prázdný řetězec je False. bool(0) je také False, ale bool('0') je True. Funkce bool aplikovaný na řetězec hodnotí pouze zda je řetězec prázdný nebo ne.

Závěr

Casting, ať už implicitní nebo explicitní, je klíčovým nástrojem pro zajištění hladkého průběhu operací s různými datovými typy v Pythonu. Implicitní castování probíhá automaticky během operací, zatímco explicitní castování vyžaduje ruční zásah.

Kontrolní Otázky

  1. Co je implicitní castování a jak funguje v Pythonu?
  2. Jaké funkce jsou dostupné pro explicitní casting v Pythonu?
  3. Jaký je rozdíl mezi implicitním a explicitním castováním?
  4. Co se stane, pokud se pokusíte převést neplatný řetězec na číslo pomocí int()?

Kvízy

Kvíz:

Které z následujících funkcí explicitního castingu povedou k chybě v Pythonu?

  1. int('123') Odpověď: Proběhne bez chyby.
  2. int('abc') Odpověď: Správně: Dojde k chybě ValueError: invalid literal for int() with base 10: 'abc'
  3. str(456) Odpověď: Proběhne bez chyby.
  4. float('xyz') Odpověď: Správně: Dojde k chybě ValueError: could not convert string to float: 'xyz'