![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Ústředním pojmem
Každý objekt (instance třídy) má jedinečnou
>>> type("Hello, World!")# Text v uvozovkách je objekt <class 'str'> typu 'string' neboli řetězec >>> type(17)# Celé číslo je rovněž objekt <class 'int'>typu 'integer' >>> type(3.2)# Desetinné číslo je objekt <class 'float'>typu 'float'
Vězme tedy, že řetězce (strings) patří k typu
A což objekty jako
>>> type("17") <class 'str'> >>> type("2.3") <class 'str'>
Jsou to řetězce. Řetězce mohou být v Pythonu uzavřeny v jednoduchých ('), dvojitých (") nebo i trojitých uvozovkách. Uvnitř dvojitých uvozovek mohou být uvozovky jednoduché a obráceně:
Některé objekty mohou mít explicitně přiřazené jméno, obecně označované jako proměnná:
>>> num = 17; type(num), type(17)# num je jméno proměnné (<class 'int'>, <class 'int'>) >>> id(num), id(17) (1835649200, 1835649200)# zde id(num) == id(17)
Komentář na posledním řádku nutno brát s jistou rezervou, neboť ne vždy
Není na škodu si uvědomit, že objekt (základní entita Pythonu) má tři stadia existence:
Nový objekt vzniká zpracováním programového textu interpretem Pythonu, přičemž je ověřováno, zda takový objekt již je či není v paměti počítače uložen.
Přiřazování identifikačních čísel k objektům je ve výlučné kompetenci Interpreta a do jisté míry se řídí řadou známých pravidel.
Opuštěná hodnota zůstává v paměti i po změně přiřazení. Z paměti zmizí až po ukončení aktuální seance Pythonu působením procedury garbage collection.
Velice frekventovaným termínem při popisování struktury programovacího jazyka je slovo literál. Literál (literal - doslovný) je přímý zápis určité hodnoty.
Následující stručný přehled datových typů jazyka Python je zároveň přehledem jeho literálů. V přehledu jsou nejprve uváděny názvy typů, posléze příklady jejich literálů (
Sekvence je uspořádaná množina
Následující sekvenční typy pracují se sekvencemi bitů:
Prvky všech sekvenčních typů jsou interně indexovány pořadovým číslem (
Objekty typu
Naproti tomu slovník nemění své pořadí ale místo indexů používá klíče svých párových elementů.
Sekvence a kolekce jsou složené datové typy, sumárně označované jako kontejnery. Mají tu společnou vlastnost, že jsou
Všechny názvy typů kromě
Hodnoty typů
Hodnoty typů
Poznámka 1:
Python nemá datový typ pro jeden znak, v jiných jazycích označovaný termínem
Kromě uvedeného výčtu datových typů disponuje Python řadou dalších typů jako
Poznámka 2:
Počítání s desetinnými čísly typu float není úplně přesné:
>>> f = 0.1 + 0.1 + 0.1; f# viz Poznámka 3 0.30000000000000004
Existuje modul
>>> from decimal import Decimal >>> x = Decimal('0.1') >>> y = Decimal('0.1') >>> z = Decimal('0.1') >>> s = x + y + z; print(s)# viz Poznámka 3 0.3
Poznámka 3:
Invokace výrazu za středníkem chodí pouze v interaktivním režimu konzoly. Nechodí při spuštění skriptu ze souboru ~.py.
Pythonovský typ pro uložení hodnoty
Jsou pouze dvě booleovské hodnoty:
>>>type(True) <class 'bool'> >>>type(true) Traceback (most recent call last): >>File "<stdin>", line 1, in <module>NameError: name 'true' is not defined
Booleovský výraz (prostěji podmínka) je výraz, který vede k boooleovské hodnotě. Tento výraz má tuto zavedenou skladbu:
<levý operand> relační či specielní operátor <pravý operand>
>>> 5 == 5 True >>> 5 is not 5 False
Vestavěná funkce
>>> bool(1) True >>> bool(0) False >>> bool("No !")# neprázdný řetězec True >>> bool("")# prázdný řetězec False >>> bool(3.14159)# nenulová hodnota True >>> bool(0.0)# nulová hodnota False
Změna typu neboli konverze typu se provádí pomocí řady vestavěných funkcí.
Funkce
>>> str(32), str(32.12), str(0b100000) ('32', '32.12', '32')
Funkce
>>> float(32), float('32'), float(0b100000) (32.0, 32.0, 32.0)
Funkce
>>> int("32"), int(32.12), int(0b100000) (32, 32, 32)
Funkce
>>> int('0b100000',2), int('0o40',8), int('0x20',16) (32, 32, 32)
Pro převod celého čísla do jiného číselného systému slouží funkce:
Funkce
Funkce
Funkce
Všechny formáty celého čísla, vytvořené funkcemi
>>> hex(32), oct(32), bin(32) ('0x20', '0o40', '0b100000') type('0x20'), type('0o40'), type('0b100000') (<class 'str'>, <class 'str'>, <class 'str'>)
Všechny formáty celého čísla, zapsané přímo jako literál nebo jako přiřazená hodnota k proměnné, jsou typu
>>> 0x20, 0o40, 0b100000# literály (32, 32, 32) >>> hx = 0x20; oc = 0o40; bn = 0b100000# proměnné >>> hx, oc, bn (32, 32, 32)
Převod znaku na pořadové číslo systému Unicode provádí funkce
>>> ord(" "), ord("m"), ord("ž")# mezera je také znak (32, 109, 382)
Převod přadového čísla systému Unicode na příslušný znak provádí funkce
>>> chr(32), chr(109), chr(382) (' ', 'm', 'ž')
Pro převod řetězce na kontejnery typu list, tuple, set slouží funkce
>>> list("a5 True") ['a', '5', '', 'T', 'r', 'u', 'e'] >>> tuple("a5 True") ('a', '5', '', 'T', 'r', 'u', 'e') >>> set("a5 True") {'u', 'r', '', 'T', 'e', '5', 'a'}
Pro převod entice, slovníku či setu na slovník slouží funkce
>>> tup = (("a", 5), ("b", True)) >>> dit = dict(tup); dit# dict from tuple {'a': 5, 'b': True} >>> lup = [("a", 5), ("b", True)] >>> lip = dict(lup); lip# dict from list {'a': 5, 'b': True} >>> sup = {("a", 5), ("b", True)} >>> sip = dict(sup); sip# dict from set {'a': 5, 'b': True}
Pro převod reálných čísel na číslo komplexní slouží funkce
>>> complex(3.2, 12) (3.2+12j)
Funkce
>>> ascii("žížala"), ascii("oves") ("'\\u017e\\xed\\u017eala'", "'oves'")
Jména proměnných, jakož i funkcí a tříd, mohou být libovolně dlouhá. Mohou obsahovat jak písmena tak číslice, ale musejí
začínat písmenem a nesmějí obsahovat mezeru. I když je přípustné použít velká písmena, z konvenčních důvodů to neděláme.
Pokud tak učiníme, musíme si uvědomit, že velikost písmena hraje roli.
Podtržítko (
Dáme-li proměnné nepřípustné jméno, obdržíme syntaktickou chybu:
>>> 76trombones = "big parade"SyntaxError: invalid syntax >>> more$ = 1000000SyntaxError: invalid syntax >>> class = "Computer Science 101"SyntaxError: invalid syntax
Ukazuje se, že
Python má aktuálně třicet dva plus tři klíčová slova:
and as assert async await break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield True False None
Aktuálně platný seznam klíčových slov získáme zadáním příkazu:
>>> help("keywords")
Operátor je znak, zastupující funkci -
Z hlediska použitých operandů rozeznáváme
x,y = -3, 3 +(-3) nebo x. __pos()__() --> -3 -(-3) nebo x. __neg()__() --> 3 ~ 3 nebo y. __invert__() --> -4Metoda __invert__() používá unární aritmetickou operaci bitwise NOT - viz odstavec 2.6.3.
Python používá různé druhy operátorů: aritmetické, bitwise, relační, logické, a speciální operátory. Jejich popis je uveden v další části textu.
a,b = 10,20# operandem bývá i podmínka a if a<b else b --> 10 a<b and a or b --> 10 (a,b) [a<b] --> 20 (lambda: a, lambda: b) [a<b]() --> 20 {True: a, False: b} [a<b] --> 20
Aritmetickými operátory jsou znaky pro sčítání
Pořadí důležitosti (precedence) je následující:
Operátor
>>> "naše" + " prasátko"# string 'naše prasátko' >>> ["naše"]+["prasátko"] ['naše', 'prasátko']# list ("naše",)+("prasátko",) ('naše', 'prasátko')# tuple >>> b"our" + b" little pig" b'our little pig'# bytes >>> bytearray(" naše", "utf-8") + bytearray(" prasátko", "utf-8") bytearray(b' na\xc5\xa1e pras\xc3\xa1tko')# bytearray
Výše uvedené operandy lze rovněž násobit celým číslem. Objeví-li se na místě operandu
>>> hele, mese = "hele", "mese " >>> (hele + mese)*3# záporné číslo vrátí prázdný řetězec 'helemese helemese helemese '
Popsané součty operandů (kromě čísel) provádí Python při kompilaci v rámci zjednodušení (redukce) výrazů. U řetězců se tato procedura označuje jako zřetězení (concatenation).
Operátor celočíselného dělení
>>> minute = 59 >>> minute // 60 0 >>> -minute // -60.0 0.0
Záporný podíl je zaokrouhlován směrem k minus nekonečno.
>>> -minute // 60.0 -1.0
Operátor modulo pracuje s celými čísly (číselnými výrazy) a poskytuje zbytek při dělení prvního operandu druhým. V Pythonu jej označujeme znakem pro procento (%). V pořadí operací má stejnou preferenci jako násobení.
>>> 7 % 3.0 1.0
Ukazuje se, že modulo operátor je překvapivě užitečný. Na příklad, můžeme zjistit, zda jedno číslo
je dělitelné druhým: je-li
Lze jím také oddělit krajní číslice zprava od zadaného čísla. Například,
Použití operátoru modulo (
secs_celk = int(input("Kolik vteřin celkem?")) hodiny = secs_celk // 3600 secs_navic = secs_celk % 3600 minuty = secs_navic // 60 sekundy = secs_navic % 60 print("Celkem vteřin: ", secs_celk) print("Hodin, minut, vteřin: ", hodiny, minuty, sekundy)
Operátor | Příklad | Náhrada za |
---|---|---|
= | x = 5 | x = 5 |
+= | x += 3 | x = x + 3 |
-= | x -= 3 | x = x - 3 |
*= | x *= 3 | x = x * 3 |
/= | x /= 3 | x = x / 3 |
%= | x %= 3 | x = x % 3 |
//= | x //= 3 | x = x // 3 |
**= | x **= 3 | x = x ** 3 |
&= | x &= 3 | x = x & 3 |
|= | x |= 3 | x = x | 3 |
^= | x ^= 3 | x = x ^ 3 |
>>= | x >>= 3 | x = x >> 3 |
<<= | x <<= 3 | x = x << 3 |
Bitwise operátory provádějí logické operace AND, OR, NOT, operaci XOR, jakož i operace levého a pravého posunu na
Tyto operátory nejprve převedou celá čísla svých operandů do binárního formátu stejné délky, na tomto formátu provedou bit za bitem (bitwise) předepsanou operaci a výsledek posléze převedou zpět na celé číslo.
Příklady v následující tabulce jsou vyčísleny pro x,y = 12, 5 (0b1100, 0b0101):
Operátor | Význam | Příklad |
---|---|---|
& | bitwise AND | 1) x & y -> 4 (0b100) |
| | bitwise OR | 2) x | y -> 13 (0b1101) |
~ | bitwise NOT | 3) ~x -> -13 (-0b1101) |
^ | bitwise XOR | 4) x ^ y -> 9 (0b1001) |
<< | bitwise left shift | 5) x << 2 -> 48 ('0b110000') |
>> | bitwise right shift | 6) x >> 2 -> 3 ('0b11') |
bin(~12) --> '-0b1101'# ~12 = -(10+1) = -13 bin(a^b) --> ' 0b1001' int('110000',2) --> 48# dclr-tto int('0b110000',2)
Binární systém vyžaduje více paměťového prostoru než decimální systém ale je méně komplikovaný pro uplatnění v hardwaru počítače.
Relační operátory vyjadřují tvrzení o kvantitativním vztahu mezi dvěma hodnotami. Jsou to tyto operátory:
x == y# x je rovno y x != y# x není rovno y x > y# x je větší než y x < y# x je menší než y x >= y# x je větší nebo rovno y x <= y# x je menší nebo rovno y
Jednotlivé tvrzení může být buď pravdivé nebo nepravdivé.
>>> 5 < 3 >>> False >>> 5/3 < 10 >>> True
Rovnítko (
Logické (booleovské) operátory provádějí některé logické operace se zadanými operandy. Tyto operátory jsou tři:
Tvrzení
Konečně, operátor
Operátory totožnosti (identity) -
>>> x1 = y1 = 5 >>> x2 = y2 = "hej" >>> x1is not y1# False - operandy jsou identické >>> x2is y2# True - id(x1) == id(y1)
Operátory příslušnosti (membership)
>>> x = "Nazdárek!" >>> y = {1:"a", 2:"b"} >>> 'H'not in x# True >>> 1in y# True
Operátor přiřazení s výrazem (mroží operátor) :=
Novějším (Python 3.8) způsobem přiřazení je přiřazení ve tvaru
Prostý příkaz přiřazení (mrož = False)nevrací hodnotu: Přiřazení s výrazem vrací hodnotu: >>> (mrož:= False) False >>> (u := 5 + 3*2) 11Mrožík má rád závorky, bez závorky produkuje Syntax Error.
Mroží operátor umožňuje zkrácené pojmenování vyhodnoceného výrazu (viz poslední ukázka v Kap. 6.12.
Nutno však upozornit na to, že v následné ukázce se nejedná o mroží operátor, nýbrž o formátování výstupu, popsané v Kap. 6.13.
>>> x = 3; f"{x:=8}" ' 3'# řetězec o délce 8 (včetně čísla 3)
S hvězdičkami se nám v Pythonu roztrhl pytel. K původním aritmetickým operátorům pro násobení (*) a umocňování (**) máme aktuálně ještě:
Objeví-li se ve výrazu více než jeden operátor, závisí pořadí výpočtu na pravidlech o pořadí operací. Python (až na výjimky) respektuje stejná pravidla, jaká se používají v matematice.
Operátor | Název, použití |
---|---|
() | závorky |
a**b, a**(1/b) | umocnění, odmocnění |
+x, -x, ~x | unární +, - , bitwise NOT |
*, /, //, % | aritmetické operace |
+, - | aritmetický součin, podíl |
<<, >> | bitwise left shift, bitw. right shift |
&, ^, | | bitwise AND, XOR, OR - dle pořadí |
<, <=, >, >=; ==, != | relace; rovná se, nerovná se |
(+ - * / ** // %) = | složené přiřazení (+=, *=, ...) |
not, and, or | logické operátory - dle pořadí |
is, is not | operátory identity |
in, not in | operátory příslušnosti |
:= | 'mroží' operátor |
Téměř všechny operátory se stejnou prioritou jsou vyhodnocovány zleva doprava (jsou
>>> 7 * 3 // 2# (7 * 3) // 2 10
Opakované mocniny jsou vyhodnocovány zprava doleva (jsou
>>> 2**3**2# 2**(3**2) 512 >>> 7*8**(1/3)# 7*3?¯8 14.0
Některé operátory nemají asociativitu a řídí se jinými pravidly, například:
x < y < z--> x < y and y < z
Podtržítka mají různý význam v různých situacích. Ukázka 4 až 6 souvisí s třídami (viz kap. 12).
>>> 2 + 3 5 >>> _ * 3 15
>>> for _ in range(6): print(_*_, end=" ") 0 1 4 9 16 25
>>> def pattern(name, class):# class je klíčové slovo SyntaxError: "invalid syntax" >>> def pattern(name, class_):# OK pass
class myClass : def __init__(self): self._ bar = "Aleluja!"
>>> myc = myClass(); myc._bar 'Aleluja!'
class myClass : def __init__(self): self.__x = 20# privátní název atributu def __myFunc(self):# privátní název atributu print("Hello, World!") obj=myClass()# instance třídy
Názvy s předsazenými dvojitými podtržítky jsou externě nepřístupné:
>>> obj.__xAttributeError: 'myClass' object has no attribute '__x'
Zkomolené (mangled) názvy atributů __x, __myFunc() mají tvar : _myClass__x, _myClass__myFunc(). Pouze v této formě jsou externě přístupné:
>>> obj._myClass__x; obj._myClass__myFunc() 20 Hello, World!
Dvojitá podtržítka před i za názvem (double underscores -
Proměnná je uživatelské
# Příklady názvů proměnných: >>>a ,a_a ,A , aA,
Podle zavedené konvence jsou jména, počínající velkým písmenen, vyhražena pro názvy tříd. Není doporučován ani formát "aA".
Objekt na pravé straně ke jménu na levé straně připojuje
>>> n = "hosana"# OK, objekt typu string >>> pi = 3.14159# OK, objekt typu float >>> x = ping; ping = 5NameError: 'ping' is not defined >>> ping = 5; x = ping; type(x) <class ´int´># OK, objekt typu integer
Před vlastním přiřazením se vyhodnotí případný výraz na pravé straně.
>>> a = 5 + 3; a 8
Vazba jména na objekt se vyskytuje ve dvou místech:
Stejnému jménu lze postupně přiřazovat různé hodnoty (objekty):
>>> bruce = 5 >>> bruce 5 >>> bruce = 7; bruce 7
Nové přiřazení ruší přiřazení předchozí.
Nejběžnější formou změny přiřazení je aktualizace, kdy nová hodnota proměnné závisí na její předchozí hodnotě, například:
x = 6; id(x)# inicializace 2161740743056 x = x + 1; x; id(x)# aktualizace 7 2161740743088
Aktualizace proměnné přičtením hodnoty
Aktualizaci proměnné lze s výhodou provádět i pomocí operátorů
>>> y = 6 >>> y += 1; y 7
Rozšířené (augmented) přiřazení je kombinace binární operace (
Operátor | Příklad | Nahrazuje |
---|---|---|
+= | x += 5 | x = x + 5 |
-= | x -= 5 | x = x - 5 |
*= | x *= 5 | x = x * 5 |
/= | x /= 5 | x = x / 5 |
//= | x // 5 | x = x // 5 |
%= | x %= 5 | x = x % 5 |
**= | x **= 5 | x = x ** 5 |
Podobně lze provést rozšířené přiřazení s bitwise operátory
>>> n = n + 1NameError: name 'n' is not defined
>>> print(n = 7)A což toto?
>>> print(7 + 5)Nebo toto?
>>> print(5.2, "toto", 4-2, 5/2.0)
>>> 5 % 2 >>> 9 % 5 >>> 15 % 12 >>> 12 % 15 >>> 6 % 6 >>> 0 % 7 >>> 7 % 0
JménuNameError: name 'houby' is not defined
Úlohu řešte v interaktivním i programovém režimu v aplikaci IDLE. Skript vložte do souboru
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |