Typy, multipriradenie

Typy

Aj keď premenné v Pythone nemajú typy a do jednej premennej sa dá postupne priradiť čokoľvek, samotné hodnoty, ktoré do premenných priradzujeme, typy majú.

Niektoré zo základných typov, s ktorými sa budete stretávať:

Python nemá zvlášť typ char pre jednotlivé znaky. Znaky chápe ako reťazce (str) dĺžky 1.

Operácie

Na číselných typoch (int a float) fungujú bežné aritmetické operácie: sčítanie (+), odčítanie (-), násobenie (*), delenie (/), delenie so zaokrúhlením nadol (//), modulo (%), umocnenie (**).

Reťazce a polia sa dajú zreťazovať (+), opakovať (*), dá sa do nich indexovať ([]):

>>> "ahoj " + "svet"
'ahoj svet'
>>> "la" * 10
'lalalalalalalalalala'
>>> "slovo"[0]
's'
>>> "slovo"[3]
'v'
>>> [4, 9, 13] + [6, 15]
[4, 9, 13, 6, 15]
>>> [4, 9, 13] * 5
[4, 9, 13, 4, 9, 13, 4, 9, 13, 4, 9, 13, 4, 9, 13]
>>> [4, 9, 13][2]
13

S reťazcami sa dá robiť kopec ďalších vecí, napríklad rozdeliť ich na slová pomocou .split():

>>> "toto je viacslovný reťazec".split()
['toto', 'je', 'viacslovný', 'reťazec']

Konverzie typov

Ako ste si mohli všimnúť, niektoré operácie (napríklad zreťazenie reťazcov a sčítanie čísel) sa volajú rovnako (+). To, ktorá operácia sa vykoná, sa rozhodne až na základe typov operandov. Preto je niekedy dôležité mať kontrolu nad typmi hodnôt, s ktorými pracujeme.

Ak by sme napríklad chceli napísať program, ktorý načíta dve čísla (pre jednoduchosť každé na zvlášť riadku) a sčíta ich, mohli by sme napísať niečo takéto:

x = input()
y = input()
print(x + y)

Keď takýto program spustíme a na vstup mu zadáme

2
2

program vypíše

22

Problém je, že funkcia input() nám vždy vráti reťazec, takže náš program "sčítal" dva reťazce "2" a "2". Keďže operácia + na reťazcoch znamená zreťazenie, výsledkom bol reťazec "22".

Aby sme program donútili sčítavať čísla a nie reťazce, potrebujeme reťazcové hodnoty najprv skonvertovať na číselné. Na konverziu na nejaký typ v Pythone spravidla existuje funkcia s rovnakým názvom ako daný typ. Na konverziu na int-y teda slúži funkcia int(). Náš program by sme teda mohli prepísať takto:

x = input()
x = int(x)
y = input()
y = int(y)
print(x + y)

(samozrejme, môžeme spojiť viac operácií do jedného riadka. Ak by sme veľmi chceli, celý program sa dá prepísať na print(int(input()) + int(input())))

Zistenie typu hodnoty

Ak máme v premennej uloženú nejakú hodnotu, môžeme sa na typ tejto hodnoty spýtať pomocou funkcie type():

>>> x = 4.7
>>> type(x)
<class 'float'>
>>> x = 17
>>> type(x)
<class 'int'>
>>> x = "ananas"
>>> type(x)
<class 'str'>

Multipriradenie

Operátor priradenia (=) sa dá v Pythone použiť aj na takzvané multipriradenie. Ide o niekoľko priradení vykonaných "naraz". Syntax vyzerá tak, že naľavo od = je niekoľko názvov premenných oddelených čiarkami a na pravej strane je rovnako veľa hodnôt. Napríklad

x, y, z = 4, 9, 13

priradí do x hodnotu 4, do y hodnotu 9 a do z hodnotu 13. Nie je nutné, aby hodnoty na pravej strane boli rovnakého typu:

x, y, z, w = 4, "jablko", True, [4.2, 7.0]

Na pravej strane = nemusia byť len explicitné hodnoty, môžu tam byť aj výrazy, ktoré sa vyhodnotia na hodnoty:

z = 8
x, y = 17+3, str((z ** 19) + 7)

Dôležité je, že najprv sa vyhodnotia všetky výrazy na pravej strane a až potom sa hodnoty priradia do premenných. To znamená, že po vykonaní

x = 4
y = 9
x, y = y, x

bude v premennej x hodnota 9 a v premennej y hodnota 4, zatiaľ čo vykonaním

x = 4
y = 9
x = y
y = x

dostaneme v oboch premenných hodnotu 9.

Multipriradenie s poľom

Hodnoty, ktoré chceme priradiť do premenných môžeme špecifikovať aj ako pole s rovnakým počtom prvkov, ako je počet premenných do ktorých priradzujeme:

pole = [4, 9, 13]
x, y, z = pole

Python si v takom prípade zvládne pole "rozbaliť" a do premenných priradí jednotlivé hodnoty z neho. Ak počet hodnôt v poli nesedí, vznikne chyba ValueError. Rozbaľovanie polí funguje, iba ak sú na ľavej strane priradenia aspoň dve premenné -- ak je tam iba jedna, priradí sa do nej pole ako také (nerozbalí sa, ani keby malo práve jeden prvok).

Keďže operácia .split() na reťazcoch vracia pole, môžeme multipriradenie použiť na pohodlnejší zápis parsovania viacerých slov z jedného riadka vstupu:

x, y, z = input().split()

Podotýkam, že na rozdiel od niektorých iných jazykov, v Pythone sú zátvorky za volaním funkci/metódy povinné, aj keby mali byť prázdne. Ba čo viac, názov funkcie/metódy bez prázdnych zátvoriek má v Pythone tiež svoj špecifický význam, takže ak ich zabudnete napísať, program bude stále niečo robiť, len to pravdepodobne nebude to, čo by ste čakali.