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:
- Komplexní čísla (
complex
) - Skládá se ze dvou floatů, jednoho pro reálnou část a druhého pro imaginární část. - Float (
float
) - Integery (
int
) - 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
- Co je implicitní castování a jak funguje v Pythonu?
- Jaké funkce jsou dostupné pro explicitní casting v Pythonu?
- Jaký je rozdíl mezi implicitním a explicitním castováním?
- Co se stane, pokud se pokusíte převést neplatný řetězec na číslo pomocí
int()
?
Kvízy
Které z následujících funkcí explicitního castingu povedou k chybě v Pythonu?
- int('123') Odpověď: Proběhne bez chyby.
- int('abc') Odpověď: Správně: Dojde k chybě ValueError: invalid literal for int() with base 10: 'abc'
- str(456) Odpověď: Proběhne bez chyby.
- float('xyz') Odpověď: Správně: Dojde k chybě ValueError: could not convert string to float: 'xyz'