Python


Lincal

Program lincal sa skladá z nasledujúcich častí: Toľko o programe lincal. Dúfam, že všetko je už jasné, teraz sa už pokojne môžeme vrhnúť na vysvetlenie dátových typov Pythona.

Premenné

Premenné sú základom každého programu. Do premenných môžeme uložiť čísla, reťazce a iné dátové štruktúry. V Pythone sa premenné nedeklarujú a typ premennej je určený automaticky. Identifikátor (meno premennej) môže pozostávať z písmen, čísel a podtržítiek "_", pričom identifikátory nesmú začínať číslami. Pri tvorbe identifikátorov sa vyhýbajte všetkým špeciálnym znakom ako napr. +, -, =, . atď. a tiež nesmiete použiť tzv. rezervované slová, sú to: access, and, break, class, continue, def, del, elif, else, except, exec, finally, for, from, global, if, import, in, is, lambda, not, or, pass, print, raise, return, try, while . Python má tieto slová rezervované pre vlastné účely. Dbajte na to, že Python rozlišuje medzi malými a veľkými písmenami. Vo verzii 1.52 vďaka chýbajucemu modulu nefunguje diakritika, preto ju zatiaľ nebudeme používať.

>>> passe = 3 #bez chyby
>>> pass = 3 #chyba, pass je rezervovane slovo!

V Pythone nie je problém priradiť viacerým premenným jednu hodnotu naraz:

>>> a, b, c = 3

Takisto sa dá použiť viacnásobné priradenie:

>>> a, b, c = 1, 2, 3

ktoré je ekvivalentné príkazu:

>>> a = 1
>>> b = 2
>>> c = 3

Komentáre

V Pythone sa komentáre začínajú znakom "#" a končia koncom riadku. Komentár nesmie byť v reťazci. Príklad:

>>> pocet = 1 #toto je komentar
>>> '#toto nie je komentar'
'#toto nie je komentar'

Čísla

Jednou z vecí, ktoré môžeme uložiť v premennej sú čísla. Python rozoznáva tieto druhy čísel: Povolené sú nasledujúce zápisy čísel:

>>> 100 #celociselny zapis (int)
100
>>> 100L #celociselny zapis (long)
100L
>>> 0255 #oktanovy zapis (int)
173
>>> 0x30aL #hexadecimalny zapis (int)
778L
>>> 123.3 #desatinny zapis (float)
123.3
>>> 1e2 #exponencialny zapis (float)
100.0
>>> 1e-2L #exponencialny zapis (float)
0.01L
>>> 1J #zapis komplexneho cisla
1j

Python podporuje klasické zátvorkovanie pomocou "()".Základné operátory funkcie na prácu s číslami sú:

+, -, *, / plus, mínus, krát, delene
pow(a,b) umocní a na b
a%b operátor modulo, vydá zvyšok z delenia a/b
hex(a) vráti hodnotu decimálneho čísla a v hexadecimálnej sústave
oct(a) vráti hodnotu decimálneho čísla a v oktánovej sústave
long(a) ak je to možné, vráti číslo a v tvare celočíselnom tvare (long), desatinnú časť zaokrúhli na nulu smerom na dol
int(a) ak je to možné, vráti číslo a v celočíselnom tvare (int), desatinnú časť zaokrúhli na nulu smerom na dol
float(a) ak je to možné, vráti číslo a v desatinnom tvare
coerce(a,b) ak sa dajú obidva argumenty upraviť na ten istý typ, vráti tuple s týmito upravenými argumentami, ináč vráti hodnotu None (nič)
divmod(a,b) vráti tuple s ((a-a%b)/b, a%b)
complex(real, imag) vytvorí komplexné číslo z reálnej časti a z imagnárnej časti, pričom imaginárna časť je nepovinná
abs(z) vráti absolútnu hodnotou argumentu z
z.real vráti reálnu časť čísla z
z.imag vráti imaginárnu časť čísla z
range(start=0,koniec,krok=1) vráti pole s číslami od start (štandardne 0) do koniec s krokom (štandardne 1)
round(x,n=0) zaokrúhli x na n miest (štandardne 0)
xrange(start=0,koniec,krok=1) vráti tuple s číslami od start (štandardne 0) do koniec s krokom (štandardne 1)

Príklady:

>>> 100L-100/4*(3-10+17)
-150L
>>> 10%3
1
>>> hex(100)
'0x64'
>>> oct(100)
'0144'
>>> a=long(3) ; a #bodkociarkou sa oddeluju 2 prikazy
3L
>>> int(a)
3
>>> float(a)
3.0
>>> coerce(3.67,8)
(3.67, 8.0)
>>> divmod(33,5)
(6, 3)
>>> a=complex(3,8) ; a
(3+8j)
>>> round(abs(a),3) #ukazka abs() a round()
8.544
>>> a.real
3.0
>>> a.imag
8.0
>>> range(0,10,3)
[0, 3, 6, 9]
>>> xrange(5)
(0, 1, 2, 3, 4)

Sekvenčné dátové typy.

Reťazce, tuple a polia sú v Pythone sekvenčné dátové typy. U reťazcov sa za sekvenciu považujú jednotlivé znaky, u tuple a polí sú to jednotlivé prvky. Ku všetkým sekvenčným dátovým typom môžeme pristupovať pomocou indexov alebo slice notácie. Reťazce a tuple su nemenné, prvky polí sa dajú meniť!

Indexovanie, slice notácia

Indexovanie je veľmi mocná zbraň programátorov. Dá sa použiť na všetky sekvenčné dátové typy (reťazec, pole, tuple). Pomocou indexov pristupujeme k jednotlivým prvkom sekvenčných dátovych typov a reťazcov. Slice notácia (kúsková notácia), ktorá je podobná tej z jazyka Icon, nám ponúka prácu s indexmi v "množnom čísle", čo znamená, že nepristupujeme len k jedinému prvku, ale rovno k viacerým, vyhradenými dvoma indexmi medzi dvojbodkou. Prvý index ukazuje na miesto, kde s vyznačovaním treba začať a druhý, kde skončiť. Obidva indexy označujú z ľava do prava. Je možné vynechať jeden z týchto indexov. Potom sa označuje od konca/začiatku reťazca (podľa toho, ktorý index vynecháme). U Pythona platí, že indexy sa začínajú nulou. Tiež je možné udať záporné indexy. Pri použití záporných indexov sa zmení smer označovania (z prava do ľava). Indexovanie a slice notácia sa najľahšie pochopia na príkladoch:

>>> string='retazec'
>>> string[1] #klasicke indexovanie
'e'
>>> string[-3]
'z'
>>> string[1:6] #slice notácia
'etaze'
>>> string[:5]
'retaz'
>>> string[-3:]
'zec'
>>> string[-5:-2]
'taz'
>>> string[:4]= 'be' #chyba, retazce su nemenne

Schéma indexovania pri použití slice notácie:

  r  e  t  a  z  e  c
-----------------------
 0  1  2  3  4  5  6  7
-7 -6 -5 -4 -3 -2 -1

Reťazce

Reťazec je prvý sekvenčný prvok s ktorým sa stretneme. Reťazec vytvoríme tým, že obsah premennej uzatvoríme medzi apostrofy alebo medzi úvodzovky. Už kvôli spomenutému chýbajucemu modulu nebudeme zatiaľ využívať diakritiku.

>>> "retazec"
'retazec'
>>> '23+23' #dalsi retazec
'23+23'

Ak má byť v samotnom reťazci apostrof "'" alebo úvodzovka """, tak je nevyhnutné dať pred tento znak spätné lomítko "\". Týmto vytvoríme tzv. "escape sekvenciu", pomocou ktorej nahradzujeme znaky, ktoré majú v Pythone rezervovaný význam a tiež znaky, so zadávaním ktorých by sme mohli mať problémy (napr. ASCII znaky, ktoré sú štandardne neviditeľné ako napr. medzera, nový riadok ...).

Escape sekvencie
\<enter> prázdna escape sekvencia
\\ spätné lomítko (\)
\' apostrof (')
\" úvodzovka (")
\a pípnutie (BEL)
\b backspace (BS)
\e escape (ESC)
\t horizontálny tabulátor (HT)
\v vertikálny tabulátor (VT)
\n nový riadok (NL)
\r návrat vozíka (CR)
\f odstránkovanie (FF)
\0XX ASCII znak v oktánovej sústave s hodnotou XX
\xXX ASCII znak v hexadecimalnej sústave s hodnotou XX

>>> 'Martin\'s'
"Martin's"
>>> print '\"Ano\",\n povedal mi a odisiel\a'
"Ano",
 povedal mi a odisiel<pipnutie>
>>> print "\x50\x79\x74\x68\x6f\x6e"
Python

Funkciu print sme museli použiť, ináč by bol znak nového riadku "\n" vypísaný ako ASCII hodnota. Funkcia print tiež vypúšťa vonkajšie apostrofy alebo úvodzovky, ktoré sú okolo reťazca. Dlhý reťazec, ktorý sa nevojde na jeden riadok, vytvoríte takto:

pozdrav="tymto dlhociznym retazcom\n\
... zdravim citatelov PC Revue"

Použitím spätného lomítka "\" a stlačením klávesy <enter> na konci prvého riadku sme vytvorili prázdnu escape sekvenciu, ktorá je nevyhnutná kvôli prehľadnosti zdrojového textu. Pomocou nej zapíšeme príkazy, ktoré môžu byť len na jednom riadku, prehľadnejším spôsobom do viacerých riadkov. Existuje ešte aj druhá možnosť ako vytvoriť viacriadkový reťazec, a to síce pomocou trojice apostrofov '''reťazec''' alebo úvodzoviek """reťazec""", presne tak ako sme to videli v programe lincal:

"""linuxovsky calendar verzia 0.1\n
pouzitie: ./lincal.py rok
./lincal.py rok1 rok2 ..."""

Pospájať reťazce je možné uvedením týchto reťazcov vedľa seba, pričom sa musí jednať len o reťazce, nesmú to byť funkcie, metódy alebo mená premenných! Ak potrebujeme spojiť reťazce s hodnotami uloženými v premenných alebo výstupnymi hodnotami funkcií, musíme použiť operátor "+".

>>> 'Toto ' 'je ' 'moj ' 'retazec'
'Toto je moj retazec'
>>> a='retazec'
>>> 'Toto je ' + a + ' cislo 2'
'Toto je retazec cislo 2'

Funkcie na prácu s reťazcami:

repr(s) vráti argument s v apostrofoch
str(s) vráti argument s ak je reťazec, ak s nie je reťazec, tak ho konvertuje na reťazec a vráti
eval(s) vyhodnotí a vráti výraz v reťazci s, náprotivok funkcie repr()
ord(c) vráti ASCII hodnotu znaku c
chr(i) vráti ASCII znak, ktorému zodpovedá hodnota argumentu i, náprotivok funkcie ord(), 0 <= i < 256

Príklady:

>>> 'Slovo \"pes\" ma ' + repr(len("pes")) + ' pismen(a)'
'Slovo "pes" ma 3 pismen(a)'
>>> eval('23+23') #pouzitie funkcie eval()
46
>>> ord('s') #ASCII hodnota znaku 's'
115
>>> chr(115) #ktory znak ma ASCII hodnotu 115?
's'

Obrátené apostrofy "`" ponúkajú presne to isté čo funkcia repr() v elegantnej a kratšej forme. Stačí uviesť `len("pes")` a je po probléme:

>>> 'Slovo \"pes\" ma ' + `len("pes")` + ' pismen(a)'
'Slovo "pes" ma 3 pismen(a)'

Polia

Ďalší z sekvenčných dátových typov je pole. Pole vytvoríme priradením hodnôt v hranatých zátvorkách identifikátoru. Jednotlivé prvky poľa sa dajú meniť a dajú sa pridávať nové prvky.

>>> lang=['python','c']
>>> lang[1]='tcl'
>>> lang
['python', 'tcl']

Použitím slice notácie je možné zmeniť viac prvkov poľa naraz. Ak priraďujeme menej hodnôt ako je prvkov, na ktoré ukazujeme, budú prebytočné prvky zmazané!

>>> cisla=[1,2,3,4,5,6,7,8,9]
>>> cisla[:3]=[10,20,30] #zmenime prve 3 prvky
>>> cisla
[10, 20, 30, 4, 5, 6, 7, 8, 9]
>>> cisla[:7]=[100,200] #prvky 3 az 7 zmiznu
>>> cisla
[100, 200, 8, 9]

Vnorené polia nie sú pre Python ničím neznámym. V iných jazykoch napr. C sa takýmto poliam hovorí viacrozmerné polia:

>>> lang=['python', 'tcl', 'c']
>>> lang[2]=['java','javascript'] ; lang
['python', 'tcl', ['java', 'javascript']]
>>> lang[2][0]
'java'

List unpacking je extrahovanie prvkov poľa do jednotlivých premenných:

>>> [a1, a2, a3] = lang
>>> a1
'python'
>>> a2
'tcl'
>>> a3
['java', 'javascript']

No a ešte treba spomenúť niekoľko dôležitých metód a funkcií, ktoré sa nám zídu pri práci s poľami:

a.append(x) na koniec poľa a pripojí hodnotu x
a.extend(P) na koniec poľa a pripojí pole P
a.insert(i, x) na pozíciu (index) v poli a, danú argumentom i, priradí hodnotu x
a.remove(x) zmaže prvý prvok poľa a s hodnotou x
a.pop([i]) zmaže a vráti prvok poľa a z pozície i, pri použití bez argumentu, zmaže a vráti posledný prvok poľa
a.index(x) vráti index prvého prvku s hodnotou x v poli a, v prípade, že žiaden prvok poľa nemá hodnotu x, vráti chybu
a.count(x) vráti, koľko krát sa nachádza prvok s hodnotou x v poli a
a.sort() zoradí prvky poľa a podľa abecedy
a.reverse() to isté čo sort, len zoradí prvky poľa a v obrátenom poradí
list(sekvencia) vráti pole, ktorého prvky sú prebraté zo sekvencie
del a[x] zmaže prvok poľa a s indexom x, dá sa použiť aj s slice notáciou a môže zmazávať celé premenné (napr. del a)

Príklady:

>>> a=['Zuza', 'Julia'] # zoznam priatelok
>>> a.append('Liza') #pridame Lizu
['Zuza', 'Julia', 'Liza']
>>> a.extend(['Misa', 'Kata']) #pridame 2 priatelky
['Zuza', 'Julia', 'Liza', 'Misa', 'Kata']
>>> a.insert(0, 'Petra') #Petru dame na zaciatok
['Petra', 'Zuza', 'Julia', 'Liza', 'Misa', 'Kata']
>>> a.remove('Kata') #vyhodime Katu
['Petra', 'Zuza', 'Julia', 'Liza', 'Misa']
>>> a.pop() #aj Misa ma smolu
Misa
>>> a.index('Zuza') #Zuza je druha,indexovanie od 0!
1
>>> a.count('Julia') #kolko mame Julii
1
>>> a.sort() ; a
['Julia', 'Liza', 'Petra', 'Zuza']
>>> list(a[0])
['J', 'u', 'l', 'i', 'a']
>>> del a #zmazeme premennu "a"

Tuple

Posledný sekvenčný dátový typ je tuple, je to akási zmiešanina medzi poľami a reťazcami. Tuple uchováva síce podobne ako pole sekvenciu prvkov, avšak tieto prvky sú ako pri reťazcoch nemenné! Tuple vytvoríme ako pole priradením viacerých hodnôt identifikátoru, pričom tieto hodnoty môžu, ale nemusia byť uzatvorené v normálnych zátvorkách.

>>> a=1,2,3 #a=(1,2,3) je to iste

Ak chceme vytvoriť tuple len s jednou hodnotou, treba za ňou uviesť čiarku:

>>> a='python',
>>> a
('python',)

Presne ako u polí funguje aj pri dátovom type tuple vnorenie, extrahovanie prvkov. Kedže jednotlivé prvky tuple sú nemenné, nefunguje nahradzovanie indexovaných prvkov!

>>> a=('python','tcl','java') #vytvorime tuple
>>> a[1:] #v poriadku, nic nenahradzujeme
('tcl', 'java')
>>> a[0]='perl' #chyba, tuple je nemenne!
>>> a[1:]=('c','scheme') #chyba, tuple je nemenne!

Pre tuple existuje funkcia podobná funkcii list(), ktorú využívame u polí. Funkcia sa volá tuple() a vracia tuple, ktorého prvky sú prebraté z argumentu, ktorý musí byť sekvenčný dátový typ (reťazec, pole, tuple).

>>> tuple(['pes','macka']) #argument je pole
('pes', 'macka') #argument je retazec
>>> tuple('Python')
('P', 'y', 't', 'h', 'o', 'n')

Spoločne pre všetky sekvenčné dátové typy existujú tieto funkcie:

min(s) vráti najmenší prvok zo sekvencie s
max(s) vráti najväčší prvok zo sekvencie s
z [not] in s ak je písmeno z v sekvencii s, tak vráti 1, ináč vráti 0. Použitím not sa otázka neguje
len(s) vráti počet prvkov v poli alebo tuple pri použití na reťazec jeho dŀžku
s1 + s2 spojí sekvenciu s1 so sekvenciou s2
seq * x opakuje sekvenciu seq x krát, x musí byť prirodzené číslo

Príklady:

>>> a=(3,4,'psi','macka', ' nema rada ')
>>> a[3] + a[4] + (str(min(a))) + ' ' + max(a)
'macka nema rada 3 psi'
>>> 'a' not in a[2]
1
>>> a=['Qmail','Exim']
>>> len(a), len(a[1]) #pocet prvkov a dlzka prvku a[1]
(2, 4)
>>> a*2 + ['Sendmail','Smail']
['Qmail', 'Exim', 'Qmail', 'Exim', 'Sendmail', 'Smail']
>>> ('Send' + a[0][1:])*2
'SendmailSendmail'

Asociatívne polia

Asociatívne polia (slovníky, hashe) sú špeciálne, veľmi užitočné druhy polí, ktorých indexy nemusia byť bezpodmienečne čísla. Prvky tohto poľa pozostávajú z dvoch častí kľúč:hodnota, pričom sa kľúč používa ako index, vďaka čomu máme k dispozícii mocný nástroj na vyhľadávanie, ktorý nám uľahčí prácu s poľami, kde by použitie štandardného číselného indexovania viedlo k neprehľadnosti a celkovému chaosu. Slovník vytvoríme priradením hodnôt kľúč:hodnota uzatvorených v hranatých zátvorkách.

>>> telcisla={'robert':'183 426','manfred':'684 158'}
>>> telcisla['robert']
'183 426'

slov.items() vydá pole s pármi kľúč:hodnota zo slovníka slov
slov.keys() vydá pole s kľúčmi zo slovníka slov
slov.values() vydá pole s hodnotami zo slovníka slov
slov.has_key(k) ak slovník slov obsahuje kľúč k, tak vráti 1, ináč 0
slov[k]=x priradí slovníku slov kľúč k s hodnotou x
len(slov) vráti počet prvkov v slovníku slov
del slov[k] zmaže zo slovníka slov prvok s kľúčom k

Príklady:

>>> telcisla.items()
[('robert', '183 426'), ('manfred', '684 158')]
>>> telcisla.keys()
['robert', 'manfred']
>>> telcisla.values()
['183 426', '684 158']
>>> telcisla.has_key('robert')
1
>>> telcisla['joe']='313 213' ; telcisla
{'robert': '183 426', 'joe': '313 213', 'manfred': '684 158'}
>>> len(a)
3
>>> del telcisla['robert']; telcisla
{'joe': '313 213', 'manfred': '684 158'}

Martin Uzak

[Pridať príspevok k článku][Verzia pre tlač]