Linux E X P R E S

Facebook

Python 3 (3): funkcie dátových typov a vstup od užívateľa

python.png

V tejto časti sa pozrieme na manipuláciu s dátovými typmi, ktoré sme si predstavili v minulej časti. Taktiež si vytvoríme program, na ktorom si na jednoduchom príklade ukážeme, ako spracovať vstup od užívateľa.


Ako sme si už v minulej časti povedali, dáta uložené v premennej predstavujú objekt istého dátového typu. Tieto objekty majú v závislosti od rôznych dátových typov rôzne funkcie, ktoré nám umožňujú manipulovať s obsahom premennej, čiže s dátami, pričom tieto funkcie sa väčšinou využívajú pri „pokročilejších“ dátových typoch ako sú rôzne zoznamy a reťazce.

Takisto môžeme medzi jednotlivými dátovými typmi premieňať, a tak napríklad číslo dátového typu integer premeniť na reťazec a ďalej s ním manipulovať ako s reťazcom.

Zoznamy

Ako prvému dátovému typu sa budem venovať zoznamu (list). Zoznamy obsahujú viacej položiek a pokiaľ potrebujeme dostať len obsah jednej položky zoznamu, použijeme zápis:

názov_premennej[pozícia]. Zoznamy sú v Pythone, tak ako vo väčšine programovacích jazykov, číslované od nuly. To znamená, že prvá položka zoznamu sa nachádza na nulovej pozícii, druhá na pozícii 1, tretia položka na pozícii 2 atď.

>>> list = [1, 2, 3, 5, 9, 11]
>>> print(list[0])
1

Poznámka autora (5. 5. 2015): Pri volení názvov premenných sa vyhýbajte pomenovaniam vstavaných funkcii Pythonu. Ja som teraz vytvoril a pracoval s premennou, ktorú som nazval list. Tým som však prepísal odkaz na vstavanú funkciu list(), ktorá slúži na vytváranie listov z iných dátových typov, a preto túto funkciu už ďalej nieje možné takýmto spôsobom volať. Za upozornenie ďakujem čitateľovi Lukášovi.

Pokiaľ chceme dostať poslednú položku zoznamu a nevieme, aký dlhý je celý list, môžeme použiť aj zápornú pozíciu, kedy -1 je pozícia poslednej položky, -2 predposlednej atď.. Dĺžku listu mimochodom určíme pomocou funkcie len(názov_premennej).

>>> print(list)
[1, 2, 3, 5, 9, 11]
>>> print(list[-1])
11

Obsah položky v liste môžeme prepísať spôsobom definovania premenných. Položka však v zozname musí existovať. Pokiaľ zadáme neplatnú pozíciu, Python sa bude sťažovať.

>>> print(list)
[1, 2, 3, 5, 9, 11]
>>> list[4] = 7
>>> print(list)
[1, 2, 3, 5, 7, 11]

Z listu môžeme naraz dostať (vystrihnúť) aj viac ako len jednu položku. Pre vybratie určitej časti listu použijeme zápis: názov_premennej[začiatočná_pozícia:konečná_pozícia].

>>> print(list)
[1, 2, 3, 5, 7, 11]
>>> print(list[2:4])
[3, 5]

Ak necháme začiatočnú pozíciu prázdnu [:4], dostaneme všetky položky od začiatku po konečnú pozíciu. Naopak, ak vyplníme len začiatočnú pozíciu a konečnú necháme voľnú [2:], dostaneme položky od začiatočnej pozícii až po koniec listu. V prípadne, že nevyplníme ani jednu pozíciu [:] dostaneme celý list.

>>> print(list)
[1, 2, 3, 5, 7, 11]
>>> print(list[2:])
[3, 5, 7, 11]
>>> print(list[:4])
[1, 2, 3, 5]
>>> print(list[:])
[1, 2, 3, 5, 7, 11]

Položky listu môžeme vybrať aj podľa určeného kroku: [začiatočná_pozícia:konečná_pozícia:krok].  Môžeme tak vypísať napríklad každú druhú [::2], tretiu [::3] alebo každú siedmu [::7] položku listu. Krok môžeme zadať aj záporný. Vtedy sa položky zoradia z opačnej strany, a preto pokiaľ určíme napríklad krok -1 [::-1] dostaneme zoznam v opačnom poradí.

>>> print(list[:])
[1, 2, 3, 5, 7, 11]
>>> print(list[::2])
[1, 3, 7]
>>> print(list[1::2])
[2, 5, 11]
>>> print(list[::-1])
[11, 7, 5, 3, 2, 1]
>>> print(list[::-3])
[11, 3]

Určovanie pozície a počtu

Teraz sa už konečne dostávame k spomínaným funkciám dátového typu list. Jednotlivé funkcie voláme spôsobom: názov_premennej.funkcia() tak, ako je to aj pri používaní modulov.

V prípade, že chceme určiť pozíciu položky s určitým obsahom, môžeme použiť funkciu index().

>>> print(list)
[1, 2, 3, 5, 7, 11]
>>> print(list.index(5))
3

Teraz vidíme, že pozícia položky, ktorá obsahuje číslo 5, je 3. Čo ak by sme chceli vedieť počet položiek s určitým obsahom? Použijeme funkciu count().

>>> print(list)
[1, 2, 3, 5, 7, 11]
>>> print(list.count(7))
1

Položka obsahujúca číslo 7 sa v zozname v premennej list naozaj nachádza len raz.

Pridávanie a odoberanie

Najjednoduchším spôsobom pre priradenie ďalších položiek do zoznamu je „pripočítanie“ ich k nemu. V Pythone sa znamienko + okrem matematickej operácii sčítania často využíva aj na spájanie niektorých dátových typov. Sčítavať, resp. spájať, je vždy možné len premenné rovnakého dátového typu, takže pokiaľ chceme k listu priradiť nejaké ďalšie položky, musíme ich takisto vložiť do listu.

>>> print(list)
[1, 2, 3, 5, 7, 11]
>>> list = list+[13, 17, 19]
>>> print(list)
[1, 2, 3, 5, 7, 11, 13, 17, 19]

Okrem takéhoto spôsobu môžeme pre priradenie položiek na koniec zoznamu použiť funkciu append().

>>> list.append(21)
>>> print(list)
[1, 2, 3, 5, 7, 11, 13, 17, 19, 21]

Všimnite si, že pri prvom spôsobe sme priraďovali premennej list novovzniknutý objekt listu ktorý bol kombináciu starého obsahu premennej list a zoznamu [13, 17]. Pri druhom spôsobe sme premennej list nemuseli nič nové priraďovať, pretože sme priamo manipulovali s obsahom danej premennej. Prvý spôsob je teda pomalší, pretože sa pri ňom vytvára nový objekt a starý maže. Druhý spôsob len upravuje už existujúci objekt.

Pre odstraňovanie položiek tu máme funkcie remove()pop(). Funkcia remove() odstraňuje položky podľa obsahu, zatiaľ čo funkcia pop() odstráni a zároveň vráti položku podľa pozície. Pokiaľ pri funkcii pop() neurčíme pozíciu, automaticky maže poslednú položku.

>>> print(list)
[1, 2, 3, 5, 7, 11, 13, 17, 19, 21]
>>> list.remove(1)
>>> print(list)
[2, 3, 5, 7, 11, 13, 17, 19, 21]
>>> list.pop()
21
>>> print(list)
[2, 3, 5, 7, 11, 13, 17, 19]

Z funkcii, ktoré sú dostupné pre dátový typ list som ešte nespomenul funkcie clear(), copy(), extend(), insert(), reverse()sort(). Názvy funkcií väčšinou zodpovedajú tomu, čo tie funkcie robia, ale pokiaľ by ste chceli vedieť viac, môžete sa pozrieť do oficiálnej dokumentácii Pythonu.



Reťazce

V minulej časti som spomenul, že reťazec môže byť zhluk akýchkoľvek znakov. Znaky v reťazcoch si môžeme predstaviť aj ako jednotlivé položky, a preto s reťazcom môžeme manipulovať podobne ako so zoznamom. Rezať, resp. vyberať jednotlivé znaky môžeme rovnakým spôsobom ako pri zoznamoch.

>>> string = "abcdefghijklmnopqrstuvwxyz0123456789"
>>> print(string[-1])
9
>>> print(string[0:5])
abcde
>>> print(string[:10:-2])
97531zxvtrpnl

Spájanie

Tak ako aj pri zoznamoch, reťazce môžeme spájať viacerými spôsobmi. Zrejme najjednoduchším ale zároveň takisto najpomalším spôsobom je použitie sčítania dvoch alebo viacerých reťazcov pomocou +. Okrem tohto spôsobu má dátový typ string aj iné možnosti, pričom sa nejedná len o priradenie iného reťazca na koniec druhého, ale taktiež je možné vložiť ľubovoľný počet reťazcov na rôzne miesta v inom reťazci.

>>> sentence = "Toto je len"
>>> sentence = sentence + " náhodná veta."
>>> print(sentence)
Toto je len náhodná veta.

Ďalším spôsobom je použitie %, pričom tento znak v kombinácii s reťazcom slúži na mnoho užitočných formátovacích vecí. Pre jednoduché vloženie reťazca do reťazca sa používa spolu s písmenom s (string) takto:

>>> name = "Štefan"
>>> sentence2 = "Volám sa %s." % name
>>> print(sentence2)
Volám sa Štefan.

Podrobnejšiemu formátovaniu s pomocou % sa určite ešte niekedy budem venovať. Ďalej tu máme funkciu format(). Reťazec pri použití tejto funkcie musí na miestach vloženia obsahovať zátvorky {} s prípadným číslovaním alebo kľúčovým slovom vo vnútri, podľa toho, čo chceme do reťazca vložiť.

>>> name = "Rex"
>>> age = 2
>>> weight = 29
>>> print("Ten pes sa volá {}, má {} rokov a váži {}kg.".format(name, age, weight))
Ten pes sa volá Rex, má 2 rokov a váži 29kg.

Vidíme, že jednotlivý obsah premenných bol do reťazca pridaný presne podľa poradia. Pokiaľ použijeme číslovanie, môžeme určiť, kde sa obsah presnej premennej bude nachádzať. Samozrejme číslujeme od nuly.

>>> print("Ten pes sa volá {0}, má {2} rokov a váži {1}kg.".format(name, age, weight))
Ten pes sa volá Rex, má 29 rokov a váži 2kg.

Polohu môžeme označiť aj pomocou zvolených kľúčových slov, a to tak, že vo vstupe funkcie format() si každé jedno definujeme ako premennú.

>>> print("Ten pes sa volá {meno}, má {vek} rokov a váži {váha}kg.".format(vek=age, váha=weight, meno=name))
Ten pes sa volá Rex, má 2 rokov a váži 29kg.

Upráva textu

Keďže reťazce väčšinou obsahujú text, dostupných je niekoľko funkcii pre string, ktoré rôzne tento text upravujú. Jedná sa napríklad o centrovanie textu, premenenie na kapitálky, prípadne len vytvorenie veľkého písmena na začiatku každého slova či celého reťazca. Najlepšie bude si rovno uviesť niekoľko príkladov.

>>> st = "toto je LEN náhodná Veta."
>>> print(st.center(80))
                           toto je LEN náhodná Veta.
>>> print(st.lower())
toto je len náhodná veta.                            
>>> print(st.capitalize())
Toto je len náhodná veta.
>>> print(st.title())
Toto Je Len Náhodná Veta.
>>> print(st.upper())
TOTO JE LEN NÁHODNÁ VETA.

Program so vstupom od užívateľa

Konečne sa dostávame k vytvoreniu spustiteľného Python skriptu, ktorý bude robiť to, čo mu predprogramujeme. Teraz budeme okrem Python interpreteru potrebovať aj nejaký textový editor najlepšie s podporou zvýrazňovania syntaxi Python 3. Môžete použiť napríklad známy editor Geany alebo Sublime Text či terminálový Vim. Ja už dlhšiu dobu používam Komodo Edit a som s ním maximálne spokojný.

Začnime teda tým, že si vo zvolenom editore vytvoríme nový súbor a vložíme doň jednoduchý „Hello, World!“ skript:

print("Hello, World!")

Ukážka zvýraznenia syntaxe v editore Komodo Edit 9 Ukážka zvýraznenia syntaxe v editore Komodo Edit 9

Súbor uložíme pod názvom napríklad first.py a následne spustíme z terminálu pomocou Python interpreteru:

$ python3 first.py
Hello, World!
$

Teraz skúsime pridať vstup od užívateľa, tak aby bol užívateľ vyzvaný k napísaniu svojho mena a program ho následne pozdraví. Pre vyžiadanie vstupu použijeme funkciu input("voliteľný text") tak, že do nejakej premennej zapíšeme práve jej výstup, čiže vstup, ktorý zadá užívateľ.

name = input("Zadajte svoje meno: ")

Použijeme aj funkciu format(), aby sme meno ktoré zadá užívateľ vložili do pripraveného reťazca.

name = input("Zadajte svoje meno: ")
print("Ahoj, {}.".format(name))

Python program first.py, ktorý sa Vám pozdraví. Python program first.py, ktorý sa Vám pozdraví.

Môžeme skúsiť niečo komplikovanejšie – vytvoriť nový program (vytvorte si nový súbor, napríklad second.py), ktorý bude počítať povrch a objem kocky. Teraz budeme od užívateľa vyžadovať, aby zadal dĺžku strany kocky, čiže číslo. Avšak funkcia input() všetko, čo zadá užívateľ, ukladá v podobe reťazca, s ktorým samozrejme nemôžeme počítať. Preto musíme tento reťazec, ktorý bude obsahovať iba číslo, premeniť na dátový typ integer a to pomocou funkcie int(premenná).

inp = input("Zadajte dĺžku strany kocky (bez jednotiek): ")
a = int(inp)

Vstup od užívateľa a zmenu na číslo by sme týmto mali vyriešenú. Teraz už len vypočítať obsah a objem podľa jednotlivých vzorcov a vypísať výsledok užívateľovi. Celý kód by mohol vyzerať takto:

inp = input("Zadajte dĺžku strany kocky (bez jednotiek): ")
a = int(inp)
volume = a**3
surface_area = 6*a**2
print("Objem kocky je: {}".format(volume))
print("Príklad: {a}^3={result}".format(a=a, result=volume))
print("Povrch kocky je: {}".format(surface_area))
print("Príklad: 6×{a}^2={result}".format(a=a, result=surface_area))

Ukážka výsledného programu pre počítanie objemu a povrchu kocky. Ukážka výsledného programu pre počítanie objemu a povrchu kocky.

Záver

Pokiaľ by ste do posledného programu namiesto čísla pri vstupe napísali niečo, čo číslom nieje, dostali by ste ValueError, pretože nič iné ako číslo sa na číslo zmeniť nedá (okrem True (1)False (0)). V ďalšej časti sa preto pozrieme, ako s týmito chybami pracovať, takisto si ukážeme podmienky (pretože kocka nemôže mať mínusový rozmer) a možno nám ostane nejaké miesto aj na cyklus while.

Diskuze (15) Nahoru