Python
Datové typy
Jazyk Python používá pro přístup k prvkům posloupnosti, jako je například žetězec, hranaté závorky []
Příklad:
>>> "Miluju python"[4]
'j'
>> "Pracuji jako sysadmin"[0]
'P'
V Pythonu jsou typ str a základní číselné typy neměnitelné, to znamená, že po nastavení již nelze jejich hodnotu změnit. Pomocí hranatých závorek tedy můžeme získat znak, ale pro nastavení nového znaku je již použít nemůžeme. Pro převod datového prvku jednoho typu na jiný, můžeme použít sayntaxi: datovýPrvek(prvek)
>>> int("69")
69
>>> str(912)
'912'
Odkazy na objekty
Python nezná proměnné jako takové, nabízí však tzv. odkazy na objekty. Syntaxe má prostý tvar: odkazNaObjekt = hodnota. Nic neni nutné deklarovat předem, přimečž není nutné uvádět ani typ hodnoty.
Operátor = není stejný jako operátor přiřazení ( == ) Operátor = totiž sváže odkaz na objekt s objektem v paměti. Pokud odkaz na objekt již existuje, pak je jednoduše svázán znovu, tentokrát ale s objektem na pravé strně operátoru =. Pokud odkaz na objekt neexistuje, tak jej operátor = vytvoří.
Příklad:
x = "modrá"
y = "zelená"
z = x
print(x,y,z) # vypíše: modrá zelená modrá
z = y
print(x,y,z) # vypíše: modrá zelená zelená
x = z
print(x,y,z) # vypíše zelená zelená zelená
Po čtvrtém příkazu (x = z) se všechny tři odkazy na objekty odkazují na tentýž objekt str. Vzhledem k tomu, že na řetězec "modrá" se již žádné objekty neodkazují, může je Python uklidit z paměti.
Objekty, neboli identifikátory se vztahuje několik omezení. Nesmějí být shodné s žádným klíčových slovem Pythonu a musejí začínat písmenem nebo podtržítkem, za nímž následuje nula, nebo více písmen, podtžítek nebo číslic, ale nesmí jít o znak představující prázdné místo. Délka neni omezena, používá se znaková sada Unicode. U identifikátorů se rozlišuje velikost písmen Limit, limit, LIMIT jsou tři různé identifikátory.
Python používá dynamickou práci s typy, což znamená, že odkaz na objekt lze kdykoliv opětovně svázat s jiným objektem ( který může být jiného datového typu).
Příklad:
poloha = 69
print(poloha, type(poloha)) # vypíše: 69 <class 'int'>
poloha = "klasická"
print(poloha, type(poloha)) # vypíše: klasická <class 'str'>
Vytváříme nový odkaz na objekt poloha a nastavujeme ho, aby odkazoval na nový objekt int s hodnoutou 69. Objekt poloha pak použijeme znovu, aby odkazoval na nový objekt str s hodnotou "klasická" a protože na objekt int již nic neodkazuje je naplánován pro uklizení s paměti.
Funkce type() vrací datový typ (ozanočovaný též jako "class" - "třída" ) zadaného datového prvku. Funkce je dobrá pro testování a ledění, v ostrém kódu ji však nepoužívejte.
Datové typy pro kolekce
Python nabízí pro kolekce několik datových typů, které mohou uchovávat prvky. Nyní si však představíme dva a to:
- tuple (n-tice)
- list (seznam)
Hlavní rozdíl spočívá v tom, že n-tice jsou neměnitelné, po vytvoření je tedy již nelze změnit. Seznamy jsou měnitelné, takže lze snadno vkládat a odebírzt prvky, kdykoliv chceme.
N-tice se vytvářejí pomocí čárek:
>>> "Java", "Python", "PHP", "Ruby"
('Java', 'Python', 'PHP', 'Ruby')
>>> "english",
('english',)
Pokud chceme použít jednoprvkovou n-tici a chcem použít závorky, musíme i tak uvést čárku:
(1,)
Prázdnou n-tici vytvoříme pomocí prázdných závorek:
()
Čárka se také pouívá o oddělení argumentů při volání funkce, takže pokud chceme jako arguemtn předat n-ticový literál, musíme jej pro jednozančnost uzavřít do závorek.
Příklady seznamů
[1, 5, 65, 78, 100, 200]
['koder', 'monter', 'pravnik', 'ucetni', 'prodavacka']
[] # takto se deklaruje prázdný seznam
Seznamy ani n-tice neuchovávají datové prvky, ale odkazy na objekty. Při vytváření seznamů a n-tic (a také při vkládání prvků v případě seznamů) příjmají tyto kolekce kopie zadávaných odkazů na objekty. V případě literálových prvků, jako jsou čísla a řetězce, se v pamtě vytvoří a vhodným způsobem inicalizuje objekt příslušného datového typu a poté se vytvoří odkaz na objekt odkazující na daný objekt, přičmež do seznamu nebo n-tice se uloží právě odkaz na objekt.
Datové typy pro kolekce jsou objekty, takže datové typy pro kolekce lze vnořovat do dalších datových typů pro kolekce, tím lze vytvořit např. seznamy seznamů.
Při procedurálním programování se volají fce, kterým se často předávají datové prvky jako argumenty. Např. s funkcí print() jsem se již setkali. Další častou fcí je len(), která jako svůj argument přijímá jediný datový prvek a vrací jeho délku jako objekt int.
>>> len(("dvacet",))
1
>>> len([5, 3, 66, "mozek", 56, "lenovo"])
6
>>> len("business")
8
Při předání funkci len() datový prvek, který nezná pojem velikost, dojde k vyvolání vyjímky. Proto se nejčastěji používá fce velikosti u datových typů jako jsou n-tice, seznamy a řetězce.
Všechny datové prvky v Pythonu jsou objekty nebo též instance určitého datového typu (označovaného také jako třída). Datový typ a třída je v podstatě totéž!!! Jediným podstatným rozdílem mezi objektem a holými prvky s daty nabízenými v některým jiných jazycích spočívá v tom, že objekt může mít metody. Metoda je v podstatě funkce, která se volá pro určitý objekt. Například typ list má metodu append(), která připojí zadaný objekt k seznamu.
>>> x = ["jachym", 56, "hranolky", 12, -567]
>>> x.append(69)
>>> x
['jachym', 56, 'hranolky', 12, -567, 69]
Objekt x ví, že je seznamem (v pythonu všechny objekty znají svůj datový typ), takže neni nutné jej explicitně zadávat. V případě metody append() bude prvním argumentem samotný objekt x. O to se Python stará automaticky v rámci své syntaktické podpory pro metody. Uvedená metoda mění původní seznam a to je možné díky tomu, že seznamy jsou měnitelné.
>>> list.append(x, "ahoj")
>>> x
['jachym', 56, 'hranolky', 12, -567, 69, 'ahoj']
Jak vidíme, pomocí metody append() a datového typu list, lze dosáhnout toho stejného příkladu.
Zde specifikujeme datový typ a jeho metodu, které jako první argument předáváme datový prvek tohoto datového typu, na který chceme metodu zavolat. Dále pokračujeme jakýmikoli dalšími argumenty metody.
Python nabízí konveční funkce volané ve tvaru názevFunkce(argumenty) a metody, které se volají stylem názevObjektu.názevMetody(argumenty).
Operátor tečka ("přístup k atributům") se používá pro přístup k atributům objektu. Atributem může být libovolný druh objektu, i kdayž zatím jsme ukázali jen atributy ve formě metod. Vzhledem k tomu, že atributem může být objekt, který má také atributy, které zse mohou mít svoje atributy (a tak pořád dál), můžeme pro přístup k určitému atributu použít toik operátorů tečka, kolik jen potřebujeme.
Např. typ list má další metody jako:
- insert() - vložení prvku na zadanou pozici
- remove() - odstranění prvku na zadané pozici
Jak jsme si již ukázali, pomocí operátoru [] můžeme získat znaky z řetězce, to platí u všechn posloupností.
>>> x
['jachym', 56, 'hranolky', 12, -567, 69, 'ahoj']
>>> x[2]
'hranolky'
>>> x[0]
'jachym'
Vzhledem k tomu, že seznamy jsou měnitelné (na rozdíl od řetězců a n-tic), můžeme pomocí operátoru [] prvky seznamu také nastavovat:
>>> x[3] = "jsem sexy kodér"
>>> x
['jachym', 56, 'hranolky', 'jsem sexy kodér', 12, -567, 69, 'ahoj']
Pokud použijeme index, který je mimo rozsah, dojde k vyvolání vyjímky.
Logické operátory
Python nabízí čtyři skupinu logických operací, zde si představíme základy každé z nich.
Operátor identita
Vzhledem k tomu, že všechny proměnné v Pythonu jsou ve skutečnosti odkazy na objekty, může být někdy užitečné ptát se, zda dva či více odkazů na objekty odakzují na tentýž objekt. K tomuto účelu slouží binární operátor is, který vrací hodnotu True, pokud se odkaz na objekt na levé straně odkazuje na stejný objekt jako odkaz na objekt na pravé straně.
>>> a = ["java", 4, None]
>>> b = ["java", 4, None]
>>> a is b
False
>>> b = a
>>> a is b
True
Většinou nemá smysl použít operátor is k porovnání objektů int, str a většiny ostatních datových typů, protože téměr vždy chceme porovnat jejich hodnoty. Ptáte se proč nám vyšel takový výsledek? Je to z důvodu, že seznamy jsou uloženy jako samostatné objekty typy list, proto při prvním použití operátoru is obdržíme hodnotu False.
Jednou z výhod provnání na základě identity je jeho rychlost. Ta je dána tím, že není nutné prozkoumávat samostatné odkazované objekty. Operátoru is stačí porovnat pouze paměťové adresy objektů - stejná adresa znamená stejný objekt.
Uvedený operátor se nejčastěji používá k porovnání datového prvku s věstavěným objektem None, který se většinou používá pro označení neznámé nebo neexistující hodnoty:
>>> a = "nic"
>>> b = None
>>> a is not None, b is None
(True, True)
Smyslem tohoto operátoru je zjistit, zda dva odkazy na objekty odkazují na tentýž objekt, nebo zda je daný objekt None Chceme-li porovnat hodnoty objektě, musíme používat porovnávací operátor.
Porovnávací operátory
Python má standardní porovnávací operátory:
< menší než
<= menší nebo rovno
== rovná se
!= nerovná se
>= větší nebo rovno
> větší než
Tyto operátory porovnávají hodnoty objektů, neboli objekty, na které se ukazují odkazy na objekt použíté v porovnání.
>>> a = 8
>>> b = 12
>>> a == b
False
>>> a < b
True
>>> a <= b, a != b, a >= b, a > b
(True, True, False, False)
Stejně funguje taktéž u porovnání řetězců
>>> a = "nothing"
>>> b = "nothing"
>>> a is b
False
>>> a == b
True
Při porovnávání je však potřeba dávat pozor, protože Python používá pro prezentaci řetězců znakou sadu Unicode, a proto může být porovnání řetůzců, které obsahují znamy mimo kódování ASCII, mnohem komplikovanější.
Operátory == a != se mají používat k porovnání hodnot a operátor is a is not pouze k porovnání s objektem None nebo pokud skutečně chceme zjistit, zda jsou stejné odkazy na objekty, a ne objekty samotné.
Porovnávací operátory lze také řetězit:
>>> a = 5
>>> 0 <= a <= 6
True
Tohle je rozhodně hezčí způsob testování, zda je datový prvek v určitém rozsahu, než dvě samostatná porovnání spojená logickým operátorem and, což je nezbytné ve většine ostatních jazyků.
Díky dynamické práce s datovými typy je Python mocný, např. při porovnání, které nedává smysl, vyhodí python vyjímku:
>>> "deset" < 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'str' and 'int'
Při vyvolání neošetřené vyjímky, dojde k výše uvedenémy výpisu. Ke stejné vyjímce typu TypeError by došlo také při porovnání:
"20" > 4
Operátor příslušnosti
U datových typů jako jsou řetězce, seznamy, nebo n-tice, můžeme testovat příslušnost pomocí operátoru in a npříslušnost pomocí not in:
>>> x = (10, "software", 89, 45, -5)
>>> 10 in x
True
>>> "koder" not in x
True
U seznamů a n-tic používá operátor in lineární vyhledávání, které může být pomalé u velkých kolekcí (desítky tísíce a více prvků). Použití operátoru in je zase naopak rychlé při použití na slovníku nebo u množiny.
>>> exam = "Mam rád linux"
>>> "x" in exam
True
>>> "nux" in exam
True
V případě řetězců lze operátor příslušnosti použít i pro testování podřetězců libovolné délky (znak je v podstatě řetězec délky 1).
Logické operátory
Python nabízí tři logické operátory:
and
or
not
Operátor and a or vracejí operand, který rozhodl o výsledku - nevracejí logickou hodnotu (pokud teda samy operandy neobsahují logickou hodnotu).
>>> eight = 8
>>> ten = 10
>>> zero = 0
>>> eight and ten
10
>>> ten and eight
8
>>> zero and ten
0
Příkazy pro řízení toku programu
Příkazy uvedené v souboru .py se provádějí jeden za druhým, přičemž se začíná prvním příkazem a pokračuje se řádek po řádku. Tok programu lze odklonit voláním funkcí či metody nebo řídící strukturou, jako je podmíněná větev nebo příkaz cyklu. Tok pogramu je též odkloněn při vyvolání vyjímky.
Logický výraz je cokoliv, co lze vyhodnotit na logickou hodnotu (True nebo False). V Pythonu se takový výraz vyhodnotí na hodnotu False, jedná-li se o předdefinovanou konstatnu False, o speciální objekt None, o prázdnou posloupnost nebo kolekci (prázdný řetězec, seznam, nebo n-tice) nebo o číselný datový prvek s hodnotou 0. Cokoliv jiného se vyhodnotí na hodnotu True.
V Pythonu se so blok kódu (posloupnost jednoho či více příkazů, nazývá sada (suite). Některé prvk syntaxe Pythonu vyžadují přítomnost sady, a proto Python nabízí klíčové slovo pass, které představuje příkaz, který neudělá nic a který lze používat všude tam, kde je vyžadována sada, ale kde není potřeba provést žádné zpracování.
Příkaz if
Obecná syntaxe pro příkaz if vypadá takto:
if logickýVýraz1:
sada1
elif logickýVýraz2:
sada2
elif logickýVýrazN:
sadaN
else:
jináSada