Přeskočit na obsah

Python/Juandev

Z Wikiverzity

Toto jsou uživatelské poznámky ke studiu Python. Pokud zde vidíte chybu, nebo chcet něco říct, tak prosím do diskuse.

Instalace v příkazové řádce

[editovat]

Úkol: naistalovat Python verze 3.10 a vyšší, nainstalovat tcl/tk, IDLE, nainstalovat dokumentaci v příkazové řadce Bash shell

Nápověda pro Debian: https://www.debian.org/doc/manuals/maint-guide/first.en.html

Installace Pythonu:

  • sudo apt update
  • sudo apt install python3.11

Instalace tcl/tk:

  • tato knihovna je na většině unixových zařízení nainstalována, zjistíme příkazem python3.11 -m tkinter
  • zjištěno, že máme verzi 8.6

Instalace IDLE:

  • pokus o nalezení: idle bez reakce, whereis idle nic
  • sudo apt update
  • sudo apt install idle

Dokumentace:

  • řekněme, že dokumentace je v man?

Poznámky

[editovat]
  • syntaxe - pravidla správného zápisu programu
  • v poslední době se prosazuje funkční programování, které je posazené na funkcích - tedy na místo toho, aby se zadávali jednotlivé proměnné, třeba jako v Rku a zaplavovala se tak paměť, tak se pro výpočet použije již předpřipravená funkce - tj. funkční programování. Některé jazyky to nepodporují. Podproruje to např. Python, PHP, JavaScript, Java, C++, Kotlin... Dále se nemění stále jedna proměná jak jsme zvyklý v Bash, nebo i R, ale na místo toho se deklarují nové proměnné.
  • objektové programování je postaveno na šablonách, třídách (clasess), etc. - na místo toho, aby se každý objekt programoval samostatně, tak se stejné objekty zahrnou do tříd, rozdíly u jednotlivch objektů se pak zapíší separátně (tzn. to co mají objekty společné je ve třídě a separátně se jim zapisují jen nespolečné vlastnosti)
  • Java a Python jsou hybrydní jazyky, tj. umožňují jak držet kód v člověku čitelném formátu, tak ve stroji čitelném formátu
  • .py - soubor s pythonem
  • .pyc - soubor s přeloženým kodem Python
  • na začátku řádku nesmí být mezera
  • komentáře začínají mřížkou (#) a končí koncem řádku
    • mřížku lze escapnout uvozovkami či apostrofy před i za (součást stringu)
    • nicméně escape characterem je \
  • velká čísla se při zápisu dají zpřehlednit podtržítkem
  • čísla jde zadávat i v jiných soustavách a též lze zadávat komplexní čísla a počítat s nimi (např. 1+2j)
  • text označují uvozovky, či apostrofy
  • znak \n označuje konec řádku (a například \t vloží odsazení typu tabulátor)
  • \ je escape charakterem (a když chci zobrazit samotný backslash, musím dát dva za sebe \\)
  • bílé znaky: mezera, tabulátor, konec řádku, konec stránky
  • proměnná je odkaz na uloženou hodnotu, název proměnné nahrazuje tuto hodnotu
  • název proměnné se jmenuje identifikátor
    • nesmí začínat číslicí
    • rozlišují se v nich velikosti písmen
    • nesmí být shodné s klíčovým slovem (seznam viz Č23)
    • co nejpřesnější popis
    • malými písmeny, slova oddělena podtržítkem
    • konstanty se obvykle pojmenovávají pouze velkými písmeny
    • u tříd velbloudí notace (např. ThisClass), kdy je každé nové slovo uvozeno velkým písmenem a nejsou mezi nimi mezery
    • přiřazovací příkaz je tedy identifikátor = hodnota
    • je možná i hadí notace (např. ted_me_nic_nenapada)
  • do proměnné, lze zadat jen jednu hodnotu
    • existují, ale například listy [], které mohou obsahovat více hodnot oddělených čárkou seznam_ptakovin = ["ptakovina 1", "ptakovina 2", "pt 3"], nebo ciselny-seznam = [1, 5, 50]. Manipulace s jednotlivými hodnotami je pak přes indexy, tzn. na pozici 1 je index 1, na pozici 2 index 2 atd.
    • pole se vytvářejí shlukováním listů, například tabulku:
1 2
3 4
5 6

lze vnořit do listu způsobem zanoření dvou listů: dvojlist = [[1, 2], [3, 4], [5, 6]]

    • 3 vnořené listy, by se tedy zapsaly jako matrix3 = [[[1, 2, 6], [3, 4, 8], [5, 6, 10]]], rozparcelovaně
matrix3 = [
  [
    [1, 2, 6],
    [3, 4, 8],
    [5, 6, 10]
  ]
]
  • a v tabulce:
|---|---|----|
| 1 | 2 |  6 |
|---|---|----|
| 3 | 4 |  8 |
|---|---|----|
| 5 | 6 | 10 |
|---|---|----|
    • a pak ještě n-matice ( s), které se chovají stejně jako seznamy, pole se ohraničuje závorkami () ale nedají se na rozdil od seznamů již měnit a upravovat
    • matrix_tuple = (
          (1, 2, 3),
          (4, 5, 6),
          (7, 8, 9)
      )
      
  • více proměných lze vytvořit i naráz:
    • x = y = z = 123 - u stejných proměnných
    • x, y, z = 10, 20, 30 - u různých proměnných
    • výpis programu (123, 123, 123), nebo (10, 20, 30) se označuje jako n-tice hodnot (angl. tuple)
    • pořadí proměných lze prohodit:
    • a = 1
      b = 2
      print(a, b)
      a, b = b, a
      print(a, b)
      
  • k urychlení práce se proměnné ukládají do haldy (heap), která je asi od programu oddělená v paměti a v programu jsou pouze identifikátory proměnných v haldě
  • zadání hodnoty která se nemění se říká literál, takže například hodnota konstanty je literál (měnit se technicky může, ale aby to fungovalo, tak by se neměla)
  • zásad DRY (Dont repeat yourself) značí, že by se neměl v jednom programu opakovat stejný kus kodu, takže by tam třeba neměli být čísla a řetězce a měli by se nahradit konstantama. Jak ale autor dodává Python moc konstanty neumí, takže je otázka, o co se autor snaží? - asi jde o čistotu kódu
  • python má vlastní funkce (např. Python 3.9 jich měl kolem 69), plus si uživatel může vyrobit svoje funkce. Funkce se skládají z názvu funkce a argumentů v závorce. Argumenty se odesílají do funkce.
  • řádek lze zalomit znakem \n (protože new line). Takže si můžeme takhle vytisknoust básničku print("Jak vlny osením\npo tobě hrají,\nkdyž vzpomínky\na touhy rodný kraji.\nKdyž za večera, \nv dusných městazdích..."). A kdybychom si to zadali do proměnné, tak můžeme zjistit, kolik to má písmen ((poem = "Jak vlny osením po tobě hrají, když vzpomínky a touhy rodný kraji. Když za večera, v dusných městazdích...", len(poem))
    • na počet slov bysme si už museli vytvořit vlastní funkci. Následující kód by se uložil do dokumentu s koncovkou *.py a pak volal z příkazového řádku bashovským python3 *.py. Případně se dá spustit i v Rstudio, když se založí nový dokument jako Python. Pak je třeba celé kód označit myší a dát spustit (Rstudio si samo natáhne Pythoní knihovnu).
    • def word_count(s):
          words = s.split()
          return len(words)
      
      poem = "Jak vlny osením po tobě hrají, když vzpomínky a touhy rodný kraji. Když za večera, v dusných městazdích..."
      print("Řetězec:\n",poem, "\n\nmá:", word_count(poem), "slov.")
      
  • parametr je proměnná
  • když je použita hodnota None, tak ji vypíše pouze funkce. Tedy z = None, z nedá nic, ale print(z)None.
  • V případě vnořených funkcí se nejprve provedou ty vnořené a teprve potom ty vnější. Tzn. například u příkladu print(print('Pes'), "a", print('Kočka')) se nejprve zpracují dvě vnořené funkce zvýrazněné tučně a to tak že vypíší hodnoty Pes, Kočka. Pak teprve se přijde k vyhodnocení vnější fukce zvýrazněné kurzivou. Po zpracování vnější funkce dostaneme, ale výstup None a None. Je to proto, že po zpracování vnitřních funkcí tyto funkce zmizí, ale tím že vnější funkce má mít hodnoty v n-tici o 3 polích, tak se zpracované funkce nahradí prázdnou hodnotou None (tomu se říká návratová hodnota). Když se pak interperetuje vnější funkce print(None, "a", None), vytiskne Python None a None.
  • pokud nemůžu zrovna zapsat nějakou část programu mohu to nahradit výpustkou (...)
  • když chci zapsat něco do souboru, tak ten soubor nemusí existovat, funkce open() mi ho založí (např. proměna = open(cesta k souboru, mód))
  • proměnné se dají prohazovat, např. pokud mám zadány hodnoty pro proměnou a, a b, mohu je prohodit následovně a, b = b, a
  • CTRL + P mi v konzoli zapíše python3, dám enter a jedem
Č. Základní typologie Typy proměných Vysvětlení Zkratky typů proměnných určených funkcí type() Prázdná definice typu hodnoty Definice typu hodnoty znakem
1 číselné integer - celé číslo int a = int() a = 0
2 číselné float - číslo s pohyblivou desetinou čárkou float a = float() a=.0
3 číselné complex - komplexní číslo complex a = complex()
4 textové string - řetězec str a = str() a=""
5 posloupnost list - seznam Listy jsou seřazené (řazení nelze měnit), hodnoty vyměnitelné a mohou obsahovat duplicitní hodnoty. list a=list() a=[]
6 posloupnost tuple - ntice Hodnoty se nemohou měnit. tuple a=tuple() a=()
8 mapovací dictionary - slovník Hodnoty mohou mýt různé datový typy. dict a=dict() a={'něco': 'něco', 'něco': ['něco', 'něco'], 'něco': číslo}
9 boolean Boolean - Booleova hodnota Booleovy hodnoty jsou vždy True (Pravda), nebo False (Nepravda). Využívají se v ověřování nějakých výroků či hodnot, rovnic. bool a=bool()
10 nic none - nic Označuje prostě prázdnou hodnotu. Například v polích nebo tabulkách nejde určitá hodnota vynechat a tak se označí jako prázdná. NoneType
11 binární bytes - bajty v hexadecimální soustavě Protože Python umožňuje mít část kodu v lidsky čitelné podobě i v pro stroj čitelné podobě. Cílem může být to, aby se kód nedal jednoduše přečíst, nebo aby se ulevilo potřebným procesům (protože člověku čitelný kód musí compiler stejně převést do bytů). bytes a=bytes() a=b'něco'
12 binární bytearray Narozdíl od bytes se nedá měnit. Mění seznam čísel do binary seznamu čísel. Vytváří pole bitů. bytearray a=bytearray()
13 binární memoryview Umožňuje měnit například bytearray na úrovni buffer protokolu, což šetří využité prostředky. memoryview

(ale jedná se o přechodnej objekt, takže se zjistí jen jako type(memoryview(a)))

a=memoryview(b'\x00\x00\x00')

Nejde vytvořit prázdný objekt a při zadání konkrétního musí být ve formě binary.

14 setové set Set je nesařezaný seznam čísel, kde se žádné neopakuje. Sety lze slučovat (|), hledat průnik (&), tzn. číslo, které existuje v obou setech; sledovat rozdíly mezi sety (-) a něco (^). Do setu nelze zařadit set, ale pouze frozenset. set a = set() a={x}

Pouze plná hodnota. U prázdné hodnoty to vytvoří slovník.

15 setové frozenset Nesařezená skupina. Narozdíl od setu s ním nelze manipulovat. Do frozensetu, lze zařadit další frozenset. frozenset a = frozenset()
  • pak se vyvinula ještě funkce range() (česky rozsah), která vytváří blok dat s vlastnostmi, které nemají předchozí datové typy
    • Doplní rozsah čísel do zadané hodnoty (číslo, řetězec), tzn. range (10), vypíše 1-10, když před to doplním slovo, tak to vypíše slovo 1, slovo 210.
  • při převodech datových hodnot mezi ssebou, ale nedochází k jejich seřazení, pokud jsou převáděny na sezařené hodnoty.
  • z řetězců lze extrahovat znaky, používá se formát string[start:end:step]
    • start - odkazuje na počáteční index řetězce, pokud není start definován, je prvním indexem 0, při výběru řetězce, se startovací index započítává do výběru
    • end - poslední index výběru, při výběru subřetězce se nezapočítává do výběru (tzn. pokud se vybírá 1:4, pak se vyberou znaky s indexy 1, 2 a 3 (např. z Hotel se vybere ote, tedy Hotel = 01234, start je na pozici o a konec na pozici l, ale ta se nevybere.)). Pokud není zadán, nebo by byl na pozici, kterou řetězec nemá protože je delší vybere se celý řetězec
    • step - znamená o kolik se má vybírat. Tzn. step 1 je, že se vybírají hodnoty za sebou (1,2,3), step 2 znamená, že objednu (1,3,5), step 3 ob 3 atd. Záporná hodnota navíc značí obrácený výběr jak ukazuje tabulka níže.
    • vždy se vybírá zleva do prava, ale indexovat lze oboumi směry, jak ukazuje následující tabulka
H o t e l
--> 0 1 2 3 4 5
-5 -4 -3 -2 -1 <--

Takže pokud chci vybrat "ote" můžu využít kladného i negativního indexu:

  • print(promena[1:4])
  • print(promena[-4:-1])
  • výhodou negativního indexu jsou rozsáhlé pole, kde není nutné počítat všechny pole zleva
      • #Pro vysvětlenou ještě jeden příklad
        
        test_numbers = [1,2,3,4,5,6,7,8,9,10]
        
        #Cíl, vybrat číselnou řadu od 8 do 2
        
        print(test_numbers[7:0:-1])#Jedno řešení
        print(test_numbers[-3:-10:-1])#Jiné řešení
        
        Výše uvedená řešení jsou oba postavená na tom, že se vybírá po jednom a index se hledá zprava [start:end:step = -1]. První případ počítá s pozitivními indexy:
Hodnoty 1 2 3 4 5 6 7 8 9 10
Indexy hodnot 0 1 2 3 4 5 6 7 8 9

Pokud mám tedy vybrat 8 až 2 v řadě pozitivních indexů, vyberu 7, protože to bereme zprava a skončím na 0. Tzn. [start = 7:end = 0:step = -1]. Druhé řešení také vybírá zprava, ale počítá s negativními indexy:

Hodnoty 1 2 3 4 5 6 7 8 9 10
Negativní indexy hodnot -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

Proto bude tady slicing [start = -3:end = -10:step = -1].

  • len() spočte počet znaků v řetězci (tzn. print(len("Ahoj! ")) dá 6, protože i mezera je znak. Nicména obecně počítá počet objektů, můžu tedy spočítat počet řetězců v matici.
  • řetězce lze srovnávat menší (<), větší(>), menší nebo rovno(<=), větší nebo rovno(>=), rovná se(==), nerovná se(!=) a výsledná hodnota je Boolean True nebo False
  • [] označují index operátor
  • string.count() je metoda třídy string, proto zapisované obecně jako S.count(), která počítá výskyty v řetězci, které se ale nepřekrývají. Syntaxe je následující: S.count(sub[, start[, end]]) -> int. S. je řetězec, nebo třída string, sub je znak nebo řetězec u kterého počítám množství výskytu v S. Řetězec S si můžu rozříznout atributy start a end na menší část. Bohužel to ale neumí počítat výskyty u překrývajících se hodnot.
##Výpočet znaků ve výřezu
neco = "alabama" # Do proměne neco vkládáme řetězec, to že je to datový typ řetězec je dáno uvozovkami
print(neco.count("a"))       # Takže metoda "count()" je připojená na proměnou, která je vlastně řetězcem (tedy "neco.count()"). Do metody "count()" vkládáme subřetězec "a" a začátek ani konec subřetězce není určen, takže to bude hledat všechny "a" v řetězci "alabama" a díky funkci "print()" vytiskne na obrazovku jejich počet, tedy 4
print(neco.count("a", 1, 4)) # V tomto případě již řezáním určíme, v jakém řetězci se má počítat počet subřetězců "a". Je to od pozice 1 včetně, tedy "l", do pozice 4, což není včetně, tedy "a". Konkrétně prohlížíme subřetězec "lab" a v tom je jen jeden subřetězec "a", takže počet je 1
print(neco.count("a", -6, -3)) # výše uvedený výpočet z výřezu by šel dělat i přes negativní indexy
  • S.endswith() pak ověřuje, jestli řetězec končí na určitý konkrétní řetězec, zatím sem nenašel vhodné užití
  • S.find() určí index hledaného znaku, př zadání subřetězce, nejnižšího znaku subřetězce, lze omezit na hledání v subřetězci, využil bych na hledání indexů pro případ řezání následovně
##Využití funkce find() při řezání
telefon = "+420 789 152 556"
print(telefon[5:]) #Vybere telefonní číslo bez mezinárodní předvolby
#následující 4 řádky vyberou shluky čísel bez mezinárodní předvolby a pak je převedou na číslo bez mezer
casta = telefon[5:8]
castb = telefon[9:12] #pokud bych to nechtěl počítat ručně, můžu si ty indexi prostředního znaku najít metodou "find ()"
print(telefon.find("1")) #V telefoním čísle je jedna jednička, takže stačí zadat takto
print(telefon.find("2", 3)) #V telefonním čísle jsou dvě dvojky, takže vytvářím substring začínající indexem 3, abych se vyhnul první dvojce. Výsledek je 11. Aby to fungovalo dobře musím do výše uvedeného zadání přičíst 1, protože END pozice se nezahrnuje.

castc = telefon[-3:]
print(casta+castb+castc)
  • když jsem zjistil, že je těžké zjistit co je kde zařazeno, tak lze použít kod typu print(dir(proměná)), který mi ukáže jako metody má moje konkrétní uživatelsky definovaná proměnná
  • gokální proměnná je dostupná pouze z místa, kde byla vytvořena, kdežto globální proměná, která byla vytvořena mimo nějaký bojekt, je dostupná všude
    • globální proměná musí být ale definována před místem, kde se volá
    • když je proměnná definována v global i local scopu a je volána v local scopu, tak se použije její hodnot z local scopu
  • Pokud používám dataclass modul, nepotřebuji inicializační metody tříd
  • při tvorbě třídy jsou nástrojem objektově orientovaného programování, pokud někdo nepíše tříd pak programuje funkčně, nebo deklarativně, ale ne objektově
  • normálně musím u třídy napsat konstruktor (metoda __init__()), ale destruktor už potřeba většinou není, protože Python automaticky vyhodí data, která nejsou nikde zmiňována z paměti. Pokud ale používám modul dataclass, nemusím psát ani konstruktor
    • navíc je potřeba konstruktor jen tehdy, pokud moje třída obsahuje metody otisků (instancí). Tyto metody potřebují vytvořit otisk třídy a to zařídí právě konstruktor.
  • metodu __init__() je možné dědit, neznamená to, ale že by sem ji nemusel zapsat
  • u tříd se dá volat samotná třída, nebo její instance
    • volat třídu znamená, že je zavolána a vytvoří se tak její instance
    • při volání její instance lez přistupovat k jejím atributům a metodám
  • self je jako event, lambda event: nemusí být event ale cokoliv. stejně tak self u definic tříd, může být jakýkoliv placeholder, ale doporučuje se používat tento
  • u __init__() metody musí být vždy zadán alespoň jeden parametr, proto se používá dohodnutý placeholder self
    • respetive self musí být zadán u každé metody dané třídy, self totiž volá samotnou třídu a proto se mu říká self, i když by se to mohlo jmenovat jakkoliv
  • proměnným se ve třídách říká atributy a funkcím metody
  • k self "where a keyword like "this" is mandatory, the keyword is the only way to access data and methods stored in the current object."
  • vy Pythonu je self prvním parametrem instance metody, který má funkci odkazu
    • u metod třídy používá Python parameter cls
  • datové typy posloupností (seznamy, ntice, slovníky) vlastně obsahují jiné datové typy jako řetězce, čísla, Boolean, nebo sami sebe
  • funkcí len() mohu spočítat počet položek v seznamu
  • v podstatě ke každému datovému typu, si mohu najít metody, takže tímto způsobem se dá zjistit, co se s datovými typy posloupností dá dělat
  • indexing a slicing je vyjímání znaků z posloupností či řetězců. Indexing vyjímá jeden znak, slicing jeden a více znaků. Dalá se to tak, že posloupnost nebo řetězec lze chápat jako pozice od 0 nahoru. Když tu pozici zadám do hranatých závorek, tak něco z toho vyjímám. Pokud chci vyjímat zprava doleva, použiji indexy od -1
    • indexovat, mohu ale i znaky z vnořených ntic. Pokud například mám entice = [1,2,3,4.5, True, "pes",[7,8,9]], tak mi taková ntice obsahuje 7 indexů, tzn.:
      • 1 - index 0 a jedná se o číslo (integer)
      • 2 - 1 (integer)
      • 3 - 2 (integer)
      • 4.5 - 3 (float)
      • True - 4 (bool)
      • "pes" - 5 (string)
      • [7,8,9] - 6 (seznam)
    • pokud chci jakýkoliv vybrat, používám index:
      • print(ntice[1]) mi vybere integer 2
      • print(ntice[5]) - True
      • print(ntice[6]) - [7,8,9]
    • pokud chci vybrat jednotlivá čísla (integers) z vnořeného seznamu, musím postupovat následovně
      • print(ntice[6][0]) - mi dá 7
      • print(ntice[6][2]) - mi dá 9
  • Rozbalování ntice znamená, že jednotlivým hodnotám v ntici přiřadím různé proměnné na jednom řádku. Např. a, b = (10, 5) přiřadí proměnné a hodnotu 10 a proměnné b hodnotu 5. Podobně to lze dělat u seznamů.
  • funkce jde vložit na jeden řádek a oddělit středníky, hodnoty lze oddělit čárkami - nicméně není to tak přehledné proto se to nedporoučuje
    • todlecto je užitečné v případě prohazování hodnot:
      • #Prvotní zadání proměných
        a = 10
        b = "test"
        
        #Prohození hodnot proměnných
        a, b = b, a
        
        #Kontrola
        print(a)
        print(b)
        
  • když chci řetězec převést na seznam nebo ntici, mohu využít metod list(), nebo tuple(). Ty mi to ale rozsekaj po znacích. Pokud bych chtěl řetězec rozsekat po slovech, použiju metodu split() a tam mi vytvoří hodnoty jednotlivých slov, která byla v původním řetězci oddělená mezerou
  • naopak spojovat se dá data +, nebo metodou join()
    • dataset = ["Ema", "mele", "mámu."]
      
      print("-".join(["Máma","mele","maso."])) #Spojí hodnoty a vloží mezi ně pomlčku
      print(" ".join(dataset)) #Spojí hodnoty z proměnné a vloží mezi ně mezeru
      
    • Vyhrazená slova jsou: False, None, True, 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, match, case.
Kategorie Podtřída Vyhrazené slovo Vysvětlení Příklady použití
Logické hodnoty a operátory
Booleovské hodnoty
True
False
Prázdný nebo neexistující objekt
None Někdy může výt výhodné mít nějaké zástupný literal pro neexistující prvek či hodnotu, protože pak se s ní dá jednodušeji pracovat. Jinak by se třeba muselo prostředí testovat a na chybějící prvky vytvářet podmínky, ale to by nemuselo fungovat vždy.
#None pro případ, kdy nebyla předána hodnota
def pozdrav(jmeno=None):
    if jmeno is None:
        print("Hi")
    else:
        print(f"Hi, {jmeno}!")

pozdrav()        # Výstup: Hi
pozdrav("Martin")  # Výstup: Hi, Martin!
#Vyznačení prázdného místa v seznamu
seznam = [1, 2, None, 4, 5]

# Práce s hodnotou None v seznamu
for prvek in seznam:
    if prvek is None:
        print("Prvek je prázdný")
    else:
        print(f"Prvek je {prvek}")
class Application:
    def __init__(self):
        self.window = None  # Okno zatím neexistuje

    def open_window(self):
        if self.window is None:
            print("Vytváření nového okna...")
            self.window = "Nové okno"
        else:
            print("Okno již bylo vytvořeno.")

    def close_window(self):
        if self.window is not None:
            print("Zavírání okna...")
            self.window = None
        else:
            print("Žádné okno není otevřené.")

app = Application()
app.open_window()  # Vytvoření okna
app.close_window()  # Zavření okna
Logické operátory V Pythonu jsou pouze 3 logické operátory, ze kterých se dají složit další logické operace.
and Konjunkce (logické a).
#Spojení vícero podmínek
a = 10
b = 5

if a > 5 and b < 10:
    print("Obě podmínky jsou pravdivé.")
else:
    print("Jedna nebo obě podmínky jsou nepravdivé.")
#Shoda loginu s heslem
username = "admin"
password = "12345"

if username == "admin" and password == "12345":
    print("Úspěšně přihlášen.")
else:
    print("Špatné uživatelské jméno nebo heslo.")
or Disjunkce (logické nebo).
not Negace (logické ne).
Porovnávací operátor
is Kontroluje, zda dva objekty jsou stejný objekt v paměti. Liší se tím tak mírně od ==, kterým se porovnávají hodnoty. Toto rozlišení naznačuje příklad 1. Jde o to, že Python občas objekty se stejnými hodnotami, které jsou neměnitelné vloží do jednoho objektu. DODĚLAT
#Jak se liší is od ==
a = [1, 2, 3]
b = a  # b odkazuje na stejný seznam jako a
c = [1, 2, 3]  # c je nový seznam se stejnými hodnotami jako a

print(a is b)  # Výstup: True (a a b odkazují na stejný objekt)
print(a is c)  # Výstup: False (a a c jsou různé objekty)
print(a == c)  # Výstup: True (a a c mají stejnou hodnotu)
Kontrolní struktury
Pro podmíněné větvení kódu
if spouští kód, pokud je podmínka pravdivá
elif (else if) - alternativní podmínky
#Vyhodnocení několika podmínek
znamka = 85

if znamka >= 90:
    print("Výborně")
elif znamka >= 80:
    print("Chvalitebně")
elif znamka >= 70:
    print("Dobře")
elif znamka >= 60:
    print("Dostatečně")
else:
    print("Nedostatečně")
    
#Výsledek bude Chvalitebně
else spouští kód, pokud žádná z podmínek nebyla pravdivá
match spouští porovnání hodnoty s určitými vzorci
case definuje vzorce, které se vyhodnocují v rámci match
      • Kontrolní struktury
        • Pro podmíněné větvení kódu:
          • if - spouští kód, pokud je podmínka pravdivá
          • elif (else if) - alternativní podmínky
          • else - spouští kód, pokud žádná z podmínek nebyla pravdivá
          • match - spouští porovnání hodnoty s určitými vzorci
          • case - definuje vzorce, které se vyhodnocují v rámci match
        • Pro iterace a cykly
          • for - iterace přes posloupnosti
          • while - provádí cyklus dokud je podmínka pravdivá
        • Jako kontrolní příkazy v cyklech
          • break - ukončí cyklus
          • continue - přeskočí aktuální iteraci a pokračuje na další
          • pass - neprovádí žádnou akci
      • Funkce a návratového hodnoty
        • def - definuje funkci
        • return - používá se k návratu hodnoty funkce
        • lambda - vytváří anonymní funkce
        • yield - v generátorech vrací hodnoty a ukládá stav funkce
      • Vyjímky a chyby
        • try - označuje blok kódu, ve kterém se mohou vyskytnout výjimky
        • except - zachytává vyjímky
        • finally - kód se provede vždy, i když došlo k vyjímce
        • raise - vyvolá vyjímku ručně
      • Třídy a objekty
        • class - definuje třídu
        • as - vytváří aliasy importů a pojmenovává vyjímky
        • with - používá se v kontextových managerech
      • Import a správa jmen
        • Import modulů
          • import - načítá celý modul
          • from - importuje konkrétní část modulu
        • Užití proměných ve funkcích
          • global - označuje proměnou, která patří do globálního prostoru
          • nonlocal - označuje proměnou, která není lokální, ale přísluší k nejbližšímu nadřazenému prostoru
      • Asynchronní programování
        • async - označuje asynchronní funkci
        • await - čeká na dokončení asynchronní funkce
      • Zbylé příkazy
        • del - smaže proměnnou, nebo prvek z kolekce
        • assert - kontroluje, zda je podmínka splněna, a pokud není, vyvolá výjimku
  • input() zastaví exekuci programu a spustí ji až po zadání vstupu, kterým je string
  • rozdíl v použití if a elif je ten, že pokud bych měl pod sebou několik podmínek if, tak se všechny otestují. Pokud použiji ale pod sebou podmínky elif (else if) tak mohou být přestkočeny ty po té, která vyhoví podmínce (a to včetně první, tzn. mám if, elif, else - if je pravda, vše ostatní je přeskočeno)
  • prostě tím, že je soubor sekvence řádků oddělených znakem pro newline, tak mohu soubor otevřít a pak použít for loop a načíst jednotlivé řádky:
klic = open("cow.txt")

for radek in klic:
    print(radek)
  • pokud by soubor neměl příponu, tak jako tomu je na Linuxu, tak to vůbec nevadí, otevřít se dá bez přípony. Obecně totiž linux indetifikuje soubory ne podle přípony, ale toho co mají v hlavičce.
  • No a při extrakci dat z dogumentů, je potřeba se napřed zbavit znaku \n, protože jinak by tam byl 2x
  • slovníky
    • klíče se musí lišit, ale hodnoty musí být stejné
    • klíče jsou nepočitatelné, hodnoty mohou být jakýkoliv datový typ
    • hodnoty se získávají klíčem: print(my_dict["name"]) - Petr
    • přes klíče se též mění hodnoty u existujících párů my_dict["name"] = "Martin" vymění hodnotu Petr za Martin
    • přes klíče se též přidávají nové páry: my_dict["vek"] = 31
    • přes klíče se též odebírají páry del my_dict["vek"] odebere pár "vek": 31
    • my_dictionary.keys() vrátí klíče
    • my_dictionary.values() vrátí hodnoty
    • my_dictionary.items() vrátí pár
    • my_dictionary.clear() odstraní všechny páry
    • my_dictionary.update(another_dictionary) doplní páry z jiného slovníku
    • looping přes slovníky
      • získání klíčů
        for key in my_dict:
            print(key)
        
      • získání hodnot
        or value in my_dict.values():
            print(value)
        
      • získání párů
        for key, value in my_dict.items():
            print(f"{key}: {value}")
        
        • vzhledem k tomu, že se dají hodnoty získávat i klíčem, lze výše uvedený kód zjednodušit, ale tento způsob je pomalejší a náročnější na prostředky:
          for key in my_dict:
              print(f"{key}: {my_dict[key]}")
              
          #Smyčka iteruje přes klíče, ale díky my_dict[key], lze vyjmout i hodnoty klíčů
          ##Odpovídá to výše uvedenému print(my_dict["name"])
          #Tato iterace je ale pomalejší, takže se nehodí na velké slovníky, jde totoži o to, že:
          ##Napřed probíhá iterace přes klíče
          ##Pak se pomocí hashovací tabulky vyhledávají hodnoty
          
    • Ze dvou seznamů se dá vytvořit slovník pomocí funkce zip()
    • keys = ["a", "b", "c"]
      values = [1, 2, 3]
      zipped_dict = dict(zip(keys, values))
      print(zipped_dict)  # {'a': 1, 'b': 2, 'c': 3}
      

Jak něco udělat

[editovat]
Č. Co Jak Vysvětlení
J:1 Jak nainstalovat IDLE? V Bash command line:
  1. sudo apt update
  2. sudo apt install idle
  1. Stáhne informace o balíčcích dostupných na webu
  2. nainstaluje IDLE
2 Jak dostanu seznam klíčových slov?
  1. import keyword
  2. print(keyword.kwlist)
3 Jak vyjedu seznam build-in funkcí?
4 Jak zjistím svojí verzi Pythonu? V Bash:

idle

Otevře IDE, které se vždy instaluje s Pythonem a číslo používané verze je nahoře.
5 Jak dostat výsledek dělení a zároveň modulo? V prostoru, když se něco vydělí na rovnoměrné dílce, tak mne zajímá kolik zbyde. Když mám třeba skupinu 20 osob a chci udělat trojice, tak mne zajímá jestli to vyjde, nebo bude jedna ntice. Buď musím znát dělivost čísel, nebo použiji modulo, tedy 20mod3 mi dá modulo 2, takže bude dvojice.
6 Jak vyčistit relaci? Jednoduší je to najít v IDE, než na to psát kód. Například v IDLE je to CTRL+F6.
7 Jak vyvolám nápovědu ke třídám? help(název třídy bez závorky) Např. help(type) vyvolá nápovědu ke třídě type().
8 Jak porovnat dva seznamy, jestli jsou stejné?
prvniset = {"položka1", "položka2"}
druhyset = {"položka1", "položka3"}
print(prvniset - druhyset)
Sety se pouze od sebe odečtou, v tomto případě by byl výsledek {'položka2'}.
9 Jan naimportuji proměnou do kódu ze souboru?
  1. vložím proměnou do *.txt souboru a uložím
  2. with open("data.txt", "r") as file:
  3. moje_promena = file.read()
  1. Založím například soubor data.txt
  2. napřed musím soubor otevřit pro čtení
  3. pak načtu soubor do proměné
10 Jak získat v REPL nápovědu k .mainloop()?
  1. help()
  2. tkinter.mainloop
  1. spustí nástroj help
  2. jelikož už vím, že mainloop je součástí knihovny tkinter, volám nápovědu takto
11 Jak najdu v REPL nápovědu pro .pack()? Nenajdu. Zdá se, že musím do oficiální nápovědy na docs.python.org, která obsahuje více informací než souborová nápověda zobrazitelná z příkazového řádku. I když se tato nápověda netvárí jako oficiální, oficiální de fakto je, protože tkinter, kam ? pack patří je de facto soušástí tkinter knihovny.
12 Jak hledat v help()?
  1. /řetězec
  2. ?řetězec
  3. n
  4. N
  1. Najde řetězec vpřed
  2. Najde řetězec vzad
  3. další hledání vpřed v rámci 1, nebo 2
  4. další hledání vzad v rámci 2, nebo 1

Nicméně zatím to funguje v Rstudiu v Terminálu jen někdy.

13 Jak zvětšit buffer pro kopírování souborů?
14 Jak se instaluje knihovna? Nejčastěji se knihovny instalují z příkazové řádky. Jelikož se většinou instalují balíčky z pypi.org stačí si nainstalovat například pip3 manager (v příkazové řádce Linux příkazem sudo apt-get install python3-pip) a pak v příkazové řádce zadat pip3 install název balíčku. A to funguje jak v terminálu (Linux), tak v příkazovém řádku (Windows). Jiným řešením, ovšem asi méně častým je instalace přímo z kódu pomocí modulu subprocess. Kód pro spuštění by pak vypadal nějak takto:
#Naimportuje modul subproces (a vloží ho do jmenného prostoru subprocess)
import subprocess

balicek = "base36" #Vloží do proměnné balíček řetězec base36, což je název balíčku
subprocess.run(["pip", "install", balicek]) #Vloží do příkazové řádky hodnoty ze seznamu a spustí je
15 Jak se hodnotí kvalita a bezpečnost knihoven? Prověřený kód mají pouze moduly ve Standard Python Library jejichž přehled je na stránkách docs.python.org (Python Module Index) a které má uživatel všechny staženy, pokud má nainstalovaný Python. V repozitáři PyPi.org (Python Package Index) již nejsou balíčky kontrolovány, takže se musí přistoupit k dalším způsobům hodnocení kvality a bezpečnosti jako je bohatá dokumentace, časté updaty, spolupráce s komunitou (viditelná například v GithuBu) a člověk si může také sám projít kód a zkusit zjistit, jestli neobsahuje něco škodlivého, nebo nevypadá jako špatný kód. Navíc se nedoporučuje z ostatních zdrojů stahovat, ale spíš jde asi opravdu o to, tyto balíčky dobře prověřit výše uvedenými metodami.
16 Jakým způsobem se opravuje odsazení? Buďto používám specializovaný editor, nebo to zkusím ručně rozklíčovat, nebo zkusím vytvořit jiný kód, který dělá to samé, ale je čitenější (např. zahuštěné if else podmínky lze převést do obrácené funkce). Sdružené podmínkové bloky se dají někdy zcvrknout do jednoho přes operátor and. Viz O.157.
17 Když vytvořím proměnnou v local scope, jak ji dostanu do jiného local scope?
18 Jak vložím funkcí atributy jiné funkce?
19 Jak převést float 1,5 na int? Int(hodnota, proměnná).
20 Jak vypočítat průměr z čísel 1-7?
#Průměr čísel od 1 do 7
print(int((1 + 2 + 3 + 4 + 5 + 6 + 7) / 7))


#Nebo využít funkcí sum() a len()

pole = [1, 2, 3, 4, 5, 6, 7] #Tady si vložím seznam hodnot do proměnné

vysledek = int(sum(pole) / len(pole)) #A tady napřed vypočtu sumu, pak vypoočtu délku, kterou tu sumu vidělím a následně to ještě převedu na celá čísla

print(vysledek) #Abych to tady vytiskl
21 Jak zjistím, jestli půjde řetězec převést na číslo? Například pomocí while cyklu a klíčových slov try a except.
#Převod stupňů Fahrenheit na Celsia s kontrolou správného zadání
while True:
    vstup = input("Zadejte teplotu: ") #Zde se program zastaví a čeká na uživatele, že zmáčkne enter
    
    try: #Pokud není generována chyba provede se následující kód
        cislo = int(vstup)
        break  # Ukončí cyklus, pokud lze řetězec převést na číslo
    except ValueError:#Pokud je generována chyba, provede se následující kód a je opět požadován input
        print("Musíte zadat číslovku!")

stupnu_fahrenheit = int((cislo * 1.8) + 32) #Přepočítá zadanou hodnotu na stupně Celsia a převede ji na integer

print(f"{cislo} stupňů Fahrenheit je {stupnu_fahrenheit} stupňů Celsia")
22 Jak vytvořím interovatelný objekt z čísel získaných pomocí funkce input()?
23 Jak stáhnu z webu soubor přes Python?
#Import requsts library
import requests

# URL souboru ke stažení
url = "http://" #Doplnit přesou URL

# Stáhnout soubor
response = requests.get(url)

# Zkontrolovat, zda byl požadavek úspěšný
if response.status_code == 200:#HTTP, že požadavek byl úspěně zpracován
    # Uložit soubor na disk
    with open("words.txt", "wb") as file:#Sem doplním název souboru, abych nemusel psát složitější kód
        file.write(response.content)
    print("Soubor byl úspěšně stažen!")
else:
    print(f"Chyba při stahování souboru: {response.status_code}")
24 Jak vypíši metody řetězců? print(dir(str))
25 Jak vypíši kód konkrétní metody?

Otázky

[editovat]
Č. Otázka Odpověď Příklad Poznámky
Č:1 Co je to Tcl/Tk? Knihovna v programovacím jayce tcl pro vytváření základních grafických nástrojů.
2 Co je to IDLE? Integrated Development and Learning Environment je vývojové prostředí pro Python.
3 Lze v Pythonu jedné proměnné přiřadit více hodnot? Nejde, ale existuje něco jako seznamy a n-tice, co vytváří podobný efekt?
4 Jaké typy hodnot existují?
5 Jaké datové typy mohou hodnoty nabývat?
  1. čísla
    1. celá čísla (integer, např. 10)
    2. pohyblivá řádová čárka (float, pevná desetiná čárka jen po nainstalování knihovny např. decima1) - např. 12.3 či 1.528535047e5
    3. komplexní čísla (např. 3,14k)
  2. řetězce (str, "Hello, World!")
  3. seznamy - hodnoty se mohou měnit (list, [1, "Hello", 3.14])
  4. ntice - jsou seřazené a neměnné ((1, "Hello", 3.14))
  5. sety - narozdíl on ntic jsou neseřazené a neměnné ({1, 2, 3, 4, 5})
  6. slovníky - nesařezená kolekce, která se může měnit a je indexovaná (dict, {"name": "John", "age": 30})
  7. booleova funkce (hodnoty True, nebo False) - musí být vždy zapsány takto, jinak je systém nerozezná
  8. nic - reprezentuje nulovou hodnotu (None)
Ale zdá se, že proměnných je v Pythonu ještě mnohem více.
6 Co je to funkce? Blok kódu, který provádí nějakou akci. Funkce se skládá z názvu funkce a případných argumentů uvedených v závorce (např. print("Ahoj") – v okně se objeví Ahoj; print je tedy název funkce a "Ahoj" je název argumentu odkazující na hodnotu Ahoj). V praxi je argument poslán do funkce. Každá funkce dělá něco jiného. Funkce se dělí na vestavěné a uživatelsky definované. V případě definice vlasntní funkce se musí užít klíčové slovo def.
7 Co je to argument? Argument je hodnota, která se předává funkci ke zpracování. Argumenty se dělí na poziční, klávesové, defaultní a v délce proměnné.
8 Co je to modul? Modul je soubor obsahující funkce a příkazy, tak aby se nemuseli stále opakovat.
9 Jaký je rozdíl mezi hodnotou a argumentem?
10 Co je to příkaz? Příkaz je kus kódu, která vyvoválvá nějakou operaci. Může to být přiřazení proměnné (x = 10), volání funkce (print("Hello, world!")), podmínka (if x > 5:), import modulu (import math) apod.
11 Je nějaká funkce či skript, kde by bylo návratovou hodnotou něco jiného než None?
12 Co je to objekt? Objekt je vše (proměnná, datový typ, funkce), objektu jsou nadřazeny třídy. Je to v podstatě nadřazený termín, nebo termín z jiné dimenze. Značí se object(). Nicméně tady podle videa je objekt pouze hodnota.
13 Co je to Ellipsis?
14 Co je to třída? Třída je základní, nebo nejvyšší stavební blok objektově orientovaného programování. Skládá se z objektů.
class Pes:
    def __init__(self, jmeno, vek):
        self.name = jmeno
        self.age = vek

    def stekat(self):
        print(f"{self.name} rika haf!")
V příkladu třída Pes má dvě metody: __init__ a stekat.
15 Jaké matematické operace lze provádět v Pythonu?
  1. sčítání (+) - sčítat lze čísla a řetězce
  2. odčítání (-) - odčítat lze pouze čísla
  3. násobení (*) - násobit lze čísla, nebo čísla stringy (např. 3 * "pes"pespespes, takže by bylo lepší to zadat jako 3 * " pes")
  4. dělení (/) - v podstatě klasické dělení, které dává číslo s pohyblivou řádkovou čárkou (floating point) (platí pro reálná čísla různá od nuly (tzn. i pro komplexní čísla pokud plní tuto podmínku))
  5. floor division (dělení, kdy vyjde celé číslo zaokrouhlené dolů) (//) - funkce dolní celá část znamená, že při dělení čísel, kde by mělo vyjít desetinné číslo se zapíše, pouze celé číslo. Funkci se říká dolní, protože at je desetiné číslo jakékoliv, vždy se celé číslo zaokrouhlý dolů (tzn. 2,3 bude 2, ale i 2,9 bude 2)
  6. zbytek po dělení (modulo, %)
  7. umocňování (**) - zleva jde číslo, které mocním, zprava mocnitel, takže 22 bude 2**2, kdežte 23 2**3

A další slouží spíše porovnávání:

  1. porovnání dvou hodnot (==) - výsledek je True, nebo False (např. 2==5 --> False, "pes"=="pes" -->True)
  2. negace porovnání dvou hodnot (!=) - pokud nejsou obě části stejné, vyjde True. Jedná se o obrácenou logiku k výše uvedenému porovnání v bodě 1 (tedy 2!=5 --> True, "pes"!="pes" --> False)
  3. menší než (<) a větší než (>) - porovnají dvě hodnoty a vrátí Booleovskou hodnotu (tedy 2<5True , zajímavé je srovnání řetězců, kdy "pes"<"pes"False, kdežto "pes"<"qes" by dal True. Řetězce se totiž porovnávají písmenko po písmenku, tak jak jdou jednotlivá písmenka po sobě v abecedě. Nicméně chatGPT radí používat pro porovnání řetězců spíše funkce sort() a sorted() protože u řazení jiných znaků než anglických, nebo neabecedních znaků může být těžké si pamatovat, který má jakou hodnotu (?).) Analogicky lze též vytvářet menší nebo rovno (<=) či větší nebo rovno (=>).
16 Musí být řetězec vždy v uvozovkách?
17 Co v Pythonu znamenají znaky == za sebou? Slouží k porovnávání hodnot a výsledkem je buď True, nebo False
18 Kdo vymyslel modulo?
19 Jak se modulo počítá? Nejprve je třeba si říct, jak se modulo zapisuje. Například: 15 mod 4, 9 mod 2 atd. (V Pythonu by to bylo 15%4 či 9%2) Počítá se tak, že se vezme to co je napravo a pronásobí se to něčím, aby se to přiblížilo číslu vlevo zespoda. Pokud to nestačí, tak se k tomu něco přičte a to je modulo. Takže např. 15 mod 4 je 15 = (3 * 4) + 3, takže modulo je 3, protože 15-(3 * 4), respetive 15 - 12 jsou 3. Nebo 9 mod 2 je 9 = (2*4) + 1, tedy modulo 1. A pro zajímavost 14 mod 7 je tedy 14 = (2*7) +0, tedy modulo 0, a 5 mod 8 je 5 = (0*8) + 5, tedy modulo 5.

Česky se tomu říká zbytek po dělení, protože ta výpočtová operace je následující: 15 mod 4, je 15/4, kdy to musím vidělti tak, abych dostal celé číslo odspoda, tedy jakoby 12/4 a vyjde mi 3. 9/2 je 4 a zbytek 1, 14/7 je 2 a zbytek 0 a 5/8 je jako 0/8 tedy 0 a zbytek je 5.

20 K čemu je modulo dobré? Například ke zjištění, jestli je dané číslo sudé nebo liché. Když vezmu nějaké číslo x vidělím ho 2 tak modulo rovné nule mi dává sudé číslo a modulo rovné 1 liché. Nebo převod času typu sekundy na minuty a sekundy. Tj. pokud mám nějaké číslo vyjadřující mi celkový počet sekund, tak ho napřed vidělím 60 a zbytek by mi měl dát počet sekund.
21 Jakou podobu má hlavička Pythonu?
22 Kde se nachází sys.stdout soubor? Nejedná se o skutečný soubor, ale o objekt, který vkládá obsah například do terminálu (nebo IDE konzole).
23 Jaká jsou klíčová slova ve verzi 3.10.6? False, None, True, 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 Pokud chcete aktuální výpis vizujte J2.
24 Co je to konstanta? Je to proměnná, která by se neměla měnit. Python ale nemá mechanismus, který by to zaručil. Proto se takové proměnné zapisují velkými písmeny, aby programátor věděl, že s touto proměnnou nemá hýbat. Nicméně hodí se to při volání, kdy konstantu můžeme jako konstantu volat.
...
tabulka.insert(parent= "", index = tk.END, values = ("x", "y", "z"))
...
Vkládá hodnoty xyz na konec tabulky v nějakém GUI z knihovny Tkinter.
25 Je type() třída, nebo funkce? Tak chatGPT tvrdí, že type() je zároveň funkce i třída, respetive nadtřída.
26 Co značí zkratka int? Asi integer, to je celé číslo.
27 Jaké jsou zkratky typů proměnných?
  1. int - integer - celé číslo
  2. float - float - číslo s pohyblivou desetinou čárkou
  3. str - string - řetězec
  4. list - list - seznam
  5. dict - dictionary - slovník
  6. tuple - tuple - ntice
  7. bool - boolean - Booleova hodnota (tedy True či False)
  8. NoneType - None - nic
28 Jaký je rozdíl mezi funkcí set() a tuple()? Tuple, neboli ntice je seřazená, neměnná kolekce položek.

Set je neseřazená, neměnná (ale jde položku přidat a odobrat), neindexovaná kolekce položek.

29 Co definuje způsob řazení v listu? Metoda sort(), jinak list sám bez této metody data v matici neseřadí.
30 Co je to metoda? Definic metody je vícero:
  1. vše co spadá pod objekt (obj.method())
  2. funkce definovaná v rámci třídy
  3. ?
  4. ?
31 Jaký je rozdíl mezi funkcí a metodou? Funkci uvnitř třídy se říká metoda.
32 Co značí tečka (.) v zápisu skriptu Pythonu? Tečka, neboli tečkový operátor (dot, dot operator) odděluje mateřských objekt vlevo a podřízený objekt vpravo. Jedná se vlastně o hierarchický zápis převedený do řádky. To co je v určitém dokumentu, např. knihovně uvedeno pod sebou a odsazeno tak aby bylo jasné co pod co přísluší, se v řádce může oddělit tečkou. Může se tak říkát, že nějaká metoda je na něčem (například metoda count() na řetězci, tedy S.count() na jakémkoliv řetězci spočte počet určitých znaků).
33 Jak se indexují řetězce?
34 Co je to operátor? Znak, který provádí nějaké operace s proměnnými či hodnotami.
35 Jaké známe operátory?
  1. aritmetické
    1. +
    2. -
    3. *
    4. /
    5. % (zbytek po dělení)
    6. ** (umocňování)
    7. // (dělení se zaokrouhlením vždy dolů (i 2,7 dá 2)
  2. přiřazovací
    1. = pozor, neznamená rovná se, ale přiřazení. Níže uvedené příklady typu x = x + 3 tedy nejsou rovnicemi, ale přiřazením hodnoty x + 3 proměnné x
    2. += zvýšení promměnné o nějakou hodnotu vyjádřitelnou jako x = x + 3, v tomto případě tedy o 3
    3. -= snížení hodnoty proměnné o nějakou hodnotu x = x - 3 (v kódu tedy x -= 3)
    4. *= vynásobení o
    5. /= vydělení čím
    6. %= odpovídá x = x % 3
    7. //= odpovídá x = x // 3
    8. **= odpovídá x = x ** 3
    9. &= odpovídá x = x & 3
    10. |= odpovídá x = x | 3
    11. ^= odpovídá x = x ^ 3
    12. >>= odpovídá x = x >> 3
    13. <<= odpovídá x = x << 3
  3. porovnávací
    1. == (rovná se)
    2. != (nerovná se)
    3. < (menší než)
    4. > (větší než)
    5. <= (menší nebo rovno)
    6. >= (větší nebo rovno)
  4. pouze 3 logické
    1. and ("a")
    2. or ("nebo")
    3. not ("ne")
  5. identita členství
    1. is (test identity)
    2. is not (test negace identity)
    3. in (test členství)
    4. not in (test negace členství)
  6. ostatní
    1. : (dvojtečka, používá se v Pythonu pro definici bloků kódu)
    2. , (čárka, používá se pro oddělení hodnot v seznamu nebo n-ticích)
    3. . (tečka, používá se pro přístup k atributům tříd, objektů a modulů)
    4. () (závorky, používají se pro volání funkcí a tvorbu n-tic)
    5. [] (hranaté závorky, používají se pro vytváření seznamů a přístup k jejich prvkům)
    6. {} (složené závorky, používají se pro vytváření slovníků a mnoha dalších účelů)
36 Co jsou to bílé znaky? Znaky, které vytváří mezery mezy textem a nejsou vidět. Jedná se o mezeru, odstavec (\t, z angl. tabulator), nový řádek (\n, new line), posun kurzoru na začátek nového řádku (\r, carriage return), konec stránky (\f, feed), vertikální tabulátor (\v, vetical tab).

Následující příklad interpretovaný v Linux terminálu ukazuje, k čemu se dá vertikální odsazení použít. Na místo složitého pozicování podpisu, je možné ho elegantně vydělit z toku textu posunutím o řádek dolů z aktuální pozice: print("\tJe hebká\n\tjak plyš.\n\tAle není to myš\n\t– to si piš!\vLao'C")

37 Jak fungují v Pythonu odsazení? Odsazení uvozuje blok kódu. Počet mezer zleva si mohu sám zvolit ale na každém řádku musí být stejné odsazení. Pokud dám jiné, nebo nulové, tak to hodí chybu.
38 Proč nemohu začít novou řádku v bloku kódu zadáním \n? Protože \n začíná pouze nový řádek vy výpisu řetězce, ne při zadávání. Při zadání bloku, se dá nový řádek navodit jen s použitím \.
39 Co je to import? Import je klíčové slovo, které importuje externí knihovnu nebo modul.
40 Co je to def? Def je klíčové slovo odvozené od anglického define. Používá se k definování funkcí. Další řádky kódu definované funkce musí mít stejné odsazení.
def moje_funkce(parametry): #Hlavička funkce
 Tělo funkce 
 Tělo funkce
41 Co je to metoda? Metoda je funkce, která je součástí třídy.
class Pes:
    def __init__(self, jmeno, vek):
        self.name = jmeno
        self.age = vek

    def stekat(self):
        print(f"{self.name} rika haf!")
V příkladu __init__ a stekat jsou metody třídy Pes.
42 Co je to objekt? Objekt je část kódu, která definuje vlastnosti objektu, které jsou odlišné od vlastností třídy. Jinak řečeno, do třídy se dávají všeobecné vlastnosti, které se natahuji do jednotlivých objektů tak, aby se tyto vlastnosti, nemuseli u jednotlivých objektů stále definovat.
#Tady je definovaná třída Ovce, což je nejvyšší jednotka v Pythonu. Definuje obecné vlastnosti následující objektů
class Ovce:
    def identifikace(self):
        print("\"Béé\" \v– todle je ovce " + self.name) #"\v" by mělo být horizontální odsazení, které funguje jen v konzoli (ne v Rstudio)

#Objekt 1, definuje vlastnosti odlišné od generických vlastností definovaných v segmentu třída        
o1 = Ovce()
o1.name = "Anička"

#Objekt 2, definuje specifické vlastnosti objektu 2
o2 = Ovce()
o2.name = "Emily"

o3 = Ovce()
o3.name = "Hanička"

#Představí specifickou ovci
o2.identifikace()
43 Co je to instance? Instance je samostatná existence objektu.
44 Co je to konstruktor? Nejedná se přímo o termín, ale vágní pojmenování objektů, které něco incializují či vytváří. Např. u tříd se jedná o metodu, která vytvoří její otisk.
45 Co zančí tačka (.)? Tečka (.) je operátor, který odkazuje na to, kam daný člen (např. atribut, funkce, submodul) patří.
  1. o1.name = "Anička"
  2. popup = tk.Tk()
  3. import stats.distribution
  1. name je atribut proměnné o1
  2. Tk() je funkce spadající do knihovny tk
  3. distribution je submodulem knihovny stats
46 Kde jsou uloženy knihovny, které importuju do kódu? Jsou uloženy v mé instalaci Python na PC, nebo v místě, kam se Python nainstaloval. Pokud bych chtěl použít knihovnu, která není nainstalovaná, musím ji napřed nainstalovat v terminálu jako balíček nástrojem Python Package Index (příkaz pip).
47 Co je nadřízenou jednotou třídy? Nic, takže nadřízenější jednotkou je už jen samotný skript.
48 Co je to stream? Stream je proud dat mezi programem a něčím dalším (konzole, soubor, etc.). Dělí se ne input stream, který handluje objekt sys.stdin a output streem (sys.stdout). V programu se dá nastavit, kam se data posílají, ale defaultně se posílají do konzole.
49 Co je to sys.stdout? Sys.stdout je objekt pro odchozí stream.
50 Jaký je rozdíl mezi parametry flushed a buffered? Znamená to, jakým způsobem se zpracovávají například odesílaná data ve streamu. Implicitně buffered (flush=False), to je do bufferu, ze kterého se posílají dál po nějaké době. Má to tu výhodu, že to snižuje nároky na výkon. V Pythonu je ale buffer nastavený tak, že se odesílá ne po naplnění celého bufferu, ale po zadání nové řádky.

Když je potřeba ale data poslat hned bez čekání, nastaví se parameter flush na True. Ten odešle data hned co přijdou z bufferu a nečaká na nějaký nastavený objem bufferu.

print(a * 5, b, e, a * 4, f, a, f, e, a * 4, b, f, c, e, a * 3, b, c, d, f, d, e, a * 2, b, c * 3, d, c * 2, f*2, sep="", file=miska, flush=True) Okamžitě (flush=True) vytiskne proměné af do souboru miska.txt (file=miska). Ten musí být napřed otevřen (miska = open('miska.txt', 'w')).
51 Co to znamená object(s)? Označují se tím jakékoliv objekty.
52 Co je to widget? Widget je jakýkoliv grafický prvek (viditelný i neviditelný) se kterým jde v rámci tkinter, či původního Tk GUI operovat. Takže prostý text někde v okně je widget (jakoby blok v HTML), který mohu v rámci toho okna napozicovat.
53 Co znamená tkinter? Jedná se o knihovnu, která propojuje Python s obecnou knihovnou Tk. Tk nabízí grafické rozhraní pro programovací jazyky. Znamená Tk interface, a Tk může být zkratkou z tool kit (souprava nástrojů) - původně to byly nástroje jazyka TCL. Hezčí grafiku má knihovna customtkinter, ale musí se napřed nainstalovat přes bashovský příkaz pip install customtkinter. Ale dá se "naladit" i tkinter, jen je s tím víc práce.
54 Jaké jsou druhy notací a kdy se používaj?
  1. velbloudí - někdy pro pojmenování tříd a metod (zejména v knihovnách)
  2. hadí - jména funkcí, proměnných a modulů
  1. textToInput
  2. text_to_input
  1. každé slovo s počátečním velkým písmenem vyjma prvního, používá se méně
  2. používá se více než velbloudí notace
55 Jaký je rozdíl mezi modulem a třídou? Modul je soubor obsahující kód, kdežto třída je část kódu uvozená klíčovým slovem class a ukončená řádkem, který nemá odsazení (protože vše co definuje třídu má jednotné odsazení).
56 Proč na volání nápovědy k metodě destroy z knihovny tkinter musím používat skrypt, kdežto u tříd stačí pouze help(tkinter.Třída)? Nemusím, pokud vím, že destroy je metoda třídy Tk(), můžu ji volat přes help(tkinter.Tk.destroy).
57 Jak se v Pythonu řeší dědění, následovost apod.? Dědit se dají atributy a metody od mateřské třídy. Což umožňuje dělat subtřídy. Do atributu subtřídy se pak dává volání názvu mateřské třídy, ze které bude dědit atributy a metody. Tedy pokud je mateřská třída class Animal:, pak bude subtřída class Dog(Animal):. Jedná se o tzv. jednoduchou dědičnost. Pak je tu ještě vícečetná dědičnost.

Pokud chci zobrazit co subtřída dělí od mateřské, stačí zadat do konzele kód print(help(název třídy)).

58 Co je to def show_popup(text):? Je to metoda.
59 Co znamená File "<stdin>", line 1, in <module>? stdin znamená standard input, tedy vstupní stream. Chyba je na vstupu na řádce 1 hlavního modulu v REPL.
60 Proč nefunguje nápověda k join() volaná help(join)? Protože se metoda join() nenachází v hlavní nápovědě v úrovni jedna, ale nachází se v nápovědě knihovny builtins pod oddílem str. Musím tedy volat help(builtins.str.join). A případně předtím builtins naimportovat (import builtins).
61 Jak poznám, kde se daný objekt nachází a co je to za typ?
62 Co je v nápovědě označené podtržítky (např. __builtins__)? Jedná se o magické speciální metody někdy nazývané dunder (z angličtiny double underscore). Jsou definovány v jádru Pytonu a upravují chování objektů a tříd. Nevolá je uživatel sám (i když je do kódu zapisuj), ale jsou volány automaticky při zadávání jiných objektů.
64 Co je to funkce s pozičním argumentem? Poziční argumenty jsou proměnné, které se vkládají do funkce a mají nejčasteji formu písmen (a, b či x, y). To že jsou pozičný znamená, to že jdou za sebou vždy tak jak byly do funkce vepsány. Narozdíl například keywoard arguments (name, age), kdy díky jasném pojmenování mohou být jejich hodnoty vkládány do funkce i v jiném pořadí.
65 Co je to current scope?
66 Proč mi nejde vložit libovolně dlouhý řetězec? Protože (v Rstudiu) lze kopírovat pouze 4 096 bytů. Pokud mám větši proměnou musím ji natáhnout ze souboru.
67 Jak poznám, kolik bytů má můj řetězec? Například zkopírováním do tohoto nástroje. V příkazové řádce to nemohu řešit, protože, protože tam nejde kopírovat více jak 4096 bytů.
68 Co obsahuje funkce? parametry
69 Co je to instance třídy? Známená to existence třídy.
70 Jaké jsou typy argumentů?
  1. poziční (positional): nejde je prohazovat, musí jít v určitém pořadí za sebou (zadány jsou hodnotou). Výsledkem je řetězec.
  2. klíčové (keyword): lze je prohazovat (zadány jsou např. jako name ="Vašek"). Výsledkem je řetězec.
  3. výchozí (default):
  4. libovolné argumenty (arbitrary, *args): umožňují zadat libovolné množství argumentů, výsledkem je n-tice
  5. libovolné klíčové (arbitrary keyword):
71 Co to je statement? příkaz
72 Co to je f řetězec?
73 Co to je pydoc.help? Je to systém nápovědy umístěný ve skryptu pydoc.py, které generuje nápovědu v HTML nebo textu.
74 Jak funguje nápověda? Nápověda se dá hledat přímo v pytoním REPL přes příkaz help(). Nevýhodou ale je, že člověk musí znát zařazení daného objektu do struktury, nebo vědět o jaký objekt se jedná. Například nápověda na funkci str() se dá hledat rovnou jako help(str). Nicméně, pokud je něco ve struktuře jako funkce (metoda) count() zařazeno pod třídu str, už to nejde hledat jako help(count), ale musíme zadat help(str.count). Podobně nefunguje help(pass), protože pass, není funkce ani metoda, ale klíčové slovo, které se musí zadávat v uvozovkách jako help("pass").

O tom jak funguje nápověda se dá něco zjistit při zadání help(), něco při help(help) a něco ve skriptu pydoc.py.

Jiným způsobem, je hledání nápovědy přímo v linux terminálu, ale je potřeba nainstalovat si python-dev-is-python3 (v příkazové řádce přes sudo apt install python-dev-is-python3). Sice funguje pydoc pass, tedy není nutné pass nijak jako v předchozím případě označovat, ale nefunguje pydoc count, stále musí člověk znát strukturu, tedy volat pydoc str.count.

Pokud bych chtěl znát zařazení určitého objektu, je nejlepší používat nástroj, které se vyvolá zadáním help() v Pythou. Klíčová slova není potřeba zadávat s uvozovkama a indikuje začlenění objektů do struktury (při zadání dotazu count, uvede informaci Use help(str) for help on the str class. Z čehož víme, že máme hledat str.count).

Nejlepší je tedy asi používat utilitu, kterou vyvováme v Pythonu zadáním help().
75 Jaký je rozdíl mezi help() a help(help)? help() je nástroj ve kterém je možné hledat nápovědu. help(help) je nápověda k funkci help(), která volá nápovědu pro jednotlivé objekty přes help(objekt).
76 Co je to Python modul a jaká je jeho struktura? Python modul odpovídá jednomu souboru typu *.py.
77 Co dostanu po zadání dir()? dir() mi dá aktuální seznam dostupných proměných, funkcí, modulů, tříd a dalších objektů.
78 Kdy použít jaké formátování?
  1. %: stará metoda, která se už moc nepoužívá
  2. S.format:
  3. f řetězec: novější metoda od verze 3.6, umožnují provádět aritmetické operace či měnit výstupní formát
  4. Template: třída z knihovny string, využívá se například pro dynamické vkládání překladů výcejazyčných aplikací
#Metoda s použitím modulo (%)
#Nejprve zadáme proměnné
name = "liška"
lokalita = "lese"

#poté vypíšeme řetězec, kde na místo proměnných je %s, což znamená %string (protože proměnné jsou řetězce) a za řetězce ještě odkážeme na konkrétní proměné
"Ahoj, já jsem %s, bydlím v lese %s." % (name, lokalita)
#Formátování pomocí S.format
#Obecný zápis: řetězec.format(poziční nebo klíčové argumenty)

#Příklad s pozičními argumenty
"Jmenuji se {}, žiji v {}.".format("liška", "lese")
#Příklad s klíčovými argumenty
"Jmenuji se {kdo}, žiji v {misto}.".format(misto = "lese", kdo = "liška")
#Příklad kombinující poziční a klíčové argumenty
"Jmenuji se {}, žiji v {} s mím přítelem {pritel}.".format("liška", "lese", pritel = "medvědem")
#Formátování pomocí f řetězců, přijímá pouze klíčové argumenty
kdo = "liška"
kde = "lese"
kdo2 = "medvědem"
f"Jmenuji se {kdo}, žiji v {kde} s mím přítelem {kdo2}."
#Aritmetická operace v řetězci
a = 2
b = 3
c = "medvěd"
f"V noře nás žije {a+b}. Tedy já {kdo}, můj přítel medvěd a {b} děti."
#Formátování pomocí třídy Template
from string import Template
s = Template("$kdo žije v $kde.")
s.safe_substitute(kdo = "liška", kde = "lese")
79 K čemu je dobré formátování? Formátování umožnuje jednodušší zápis řetězce. Výstup je ale stejný jak pro zformátovaný text, tak pro nezformátovaný text. Čitelnost výstupu?
80 Co je to n-tice a jaké jsou její charakteristiky? Je datový typ. Obsahuje více položek, které jsou seřazené a neměné do jedné proměné. Oddělují se čárkami (,) a uzavírají do kulatých závorek (()). ('Petr', 'Monika', 'Milan')
81 Co je to slovník a jaké jsou jeho charakteristiky? Slovník je datový typ. Jedná se o kolekci položkových párů obsahujících klíč a hodnotu (zvire="pes"), které jsou seřazené a měnitelné. Oddělují se čárkami (,) a uzavírají do složených závorek ({}). {'jmeno': 'WS, s.r.o.', 'ulice': 'U Nikolajky 5', 'obec': 'Praha 5', 'zeme': 'Česká republika'}
82 Jaký je rozdíl mezi seřazenými a neseřazenými položkami?
83 Co je to parametr? Parameter je proměnná, nebo zástupce proměnné funkce.
  1. def moje_funkce(parametry):
  2. print(parametry)
  1. uživatelsky definovaná funkce
  2. build in funkce
84 Proč se funkce pow () jmenuje pow? Asi z anglického power of, tedy mocnina. print(pow(2, 3)) Vytiskne výsledek pro
85 Co je .mainloop()? Podle chatGPT je .mainloop() metoda.
86 Co dělá .mainloop()? Spouští smyčku Tcl. Tzn. že udržuje aplikaci, živou, ale také čeká na input od uživatele.
87 Je .pack() metoda? Ano, je to metoda.
88 Ve funkci/metodě jsou atributy, nebo parametry? Parametry.
89 Proč musím odkazovat způsobem tk.Tk() a nestačí jen volat funkci Tk()? Protože při importu knihovny tkinter, se vytvoří i jmenný prostor kam se vloží funkce Tk(). Nelze ji pak volat jinak než tkinter.Tk(), respetive pokud při importu zadáme vytvoření aliasu tk (import tkinter as tk) pak ji musíme volat jako tk.Tk().

Důvodem takového strukturování je to, že některé názvy funkcí či jiných objektů v uživately vytvořených knihovnách mohou být totožné. Aby tedy nedošlo ke konfliktu jmen, volají se objekty z knihoven přes jméno jmenného prostoru, který jim klíčové slovo import vytvoří.

90 Co je to lambda? Lambda je bezejmená jednořádková funkce. Pokud člověk někde potřebuje funkci, která se neopakuje a dá se zapsat na jeden řádek, může napsat klíčové slovo lambda, za které dá tělo funkce. Pokud naopak potřebuje složitější funkci a volá ji z různých částí kódu, měl by ji pojmenovat a definovat klíčovým slovem def.
#Natáhne tkinter knihovnu a vložim ji do jmenného prostoru tk
import tkinter as tk 
#Vytvoří jmenný prostor ttk pro submodul ttk
from tkinter import ttk

#Hlavní okno (widget)
okno = tk.Tk()
okno.geometry("500x600")

#Tlacitko, které po stisknutí a zavření vytiskne na obrazovku "čau", místo definice funkce je použita jednořádková funkce lambda
tlacitko3 = ttk.Button(master = okno, text = "Pokusne tlacitko", command = lambda: print("čau")).pack()

#Spouštěcí code
okno.mainloop()
91 Co se děje, když importuju knihovnu?
  1. Knihovna se hledá v path
  2. Knihovna je schována do bytecodu a zakešována
  3. vytvoří jmenný prostor pro knihovnu (tzn. pokud importuji knihovnu math, vytvoří se jménný prostor math a všechny funkce této knihovny pak tahám jako math.foo())
  4. spustí se inicializační kód
  5. vytvoří se odkaz na knihovnu (tak že např. math skutečně volá funkce z knihovny math)
92 Jak fungují jmenné prostory? Jmenné prostory vytváří de facto prefix pro knihovnu a do něj se uloží, veškerý obsah knihovny. Název prefixu buď odpovídá názvu knihovny (např. import math vytvoří prefix math), nebo tomu jak to zadáme při volání (import tkinter as dog, pak dog bude prefix). Následně se všechny funkce volají přes tento prefix a tím se zajistí, že název funkce z knihovny nekoliduje například s názvem build in funkce. Funkce pak voláme jako math.foo(), či dog.foo().

Platí, že název funkce nesmí být klíčové slovo, build in funkce, nebo modul, apod. - prostě tak aby to nekolidovalo s build in věcma. U submodulů knihoven, musíme funkci volat ve formátu ns:submodul:funkce (např. dog.ttk.foo()). Abysme zjednodušili zápis můžeme submodulu vytvořit také jmenný prostor, tzn., že opakujeme import pro submodul (from tkinter import ttk) a pak můžeme volání zjednodušit na ttk.foo(). I submodulu jde přiřadit alias: from tkinter import ttk as cat.

92 Je nějaký důvod dávat definice vlastních funkcí na začátek? Je to přehlednější.
92 Jaký je třetí kanál (pokud mám stdin a stdout)? stderr - proud chyb, zobrazující chyby
91 Kde a jak se dá umístit komentář? Komentář začíná mřížkou (#) a končí koncem řádku. Dá se umístit kamkoliv, například i mezi atributy funkce. Pokud tedy chceme umístit komentář někam do kódu, musíme následně kód odasdit na další řádek, aby koment skutečně začínal hashtagem a končil koncem řádku. Pokud chceme hash v kodu zobrazit, zapisujeme ho jako řetězec a tudíž ho musíme obalit uvozovkami ("#").


Často se používá i termín víceřádkový komentáře, který se používá i pro dokumentační *.py soubory. Nejedná se ale o komentáře v pravém smyslu, nýbrž o zformátovaný řetězec pomocí třech nebo čtyřech jednodých či složitých závorek ("""foo"""). Více viz 122.

92 Má hashtag (#) jinou funkci, než začátek komentáře? Nemá.
93 Jaké jsou způsoby strukturování kódu? Tak například co třída to jeden soubor, nebo všechny importy nahoře (1). Dále dokumentace, která se může dělat různými způsoby. Struktura celého projektu (může zahrnovat strukturu souborů) a pak je tady vnitřní struktura.
94 Co je to víceřádkový komentář? Víceřádkový komentář je lidové označení pro řetězec na více řádcích začínající třemi nebo čtyřmi jednoduchými, nebo složenými závorky, který je ukončen také třemi nebo čtyřmi jednoduchými či složenými závorkami. Pro Python je to ale stále jeden řádek a neinterpretuje to jako komentář, nýbrž jako řetězec - string literal.
text_with_quotes = """
He said, "Hello!"
'Single quotes' are also fine here.
"""

print(text_with_quotes)
Výše uvedený kód je příkladem vícenásobného řetězce, který lze vložit do proměnné text_with_quotes a následně ho normálně vytisknout v té podobě, v jaké ho vidíme, tedy na 2 řádcích. Pro Python, je to ale jeden řádek.

Pravé vícenásobné komentáře, lze tedy dělat pomocí mřížek, kdy je na každé řádce komentáře mřížka (#).

"""
Víceřádkový komentář.

Toto je příklad víceřádkového komentáře. Pro Python je to sice stále jeden řádek, ale uživatel to vidí na několika řádcích
"""
95 Co umí klíčové slovo return?
Bez return je hodnota po spočítání zahozena
Vrací výslednou hodnotu po zpracování funkcí volajícímu (v tomto případě mocnina(5) (a REPL to vytiskne na obrazovku (předá do streamu stdount)). Bez použití return by byl výsledek v tomto případě po spočítání zahozen.
S použitím return je výsledná hodnota vrácena do volajícímu. Odtud se to může dostat k uživateli či do proměné
def mocnina(x):
  x*x
  
mocnina(5)
def mocnina(x):
  return x*x
  
mocnina(5)
V prvním případě je číslo 5 odesláno do parametru x funkce cube a následně je pronásobeno. Tím vše končí. Výsledek je po ukončení výpočtu smazán a není nikde prezentován.

Ve druhém případě je ale výsledek poslán do volajícího (angl. caller, v tomto případě mocnina(5)). To zajištuje klíčové slovo return. V REPL pak tuto hodnotu (výsledek) přepošle do stdout. Kdyby to bylo ve skriptu, musel by se volající poslat do funkce print(), tedy print(mocnina(5)).

96 Jaká jiná prostředí vedle REPL existují? REPL je pouze nadstavba nad Python shell. Nadstaveb může být mnoho. Například editor Jupyter má také svojí nadstavbu. Každá nadstavba má jiné vlastnosti, kterými většinu zjednodušuje práci uživateli.
97 Co to znamená volání funkce? Znamená zapsání jména funkce, která má být spuštěna. Například prosté print("něco"), volá vestavěnou funkci print() s tím, že do ni posílám argument, který funkce zpracuje.

Podobně, kdybych si sám definoval vlastní funkci, pak ji budu volat zmíněním. Zmínit ji mohu na vlastním řádku, nebo v atributech jiné funkce.

98 Jak se obecně říká tomu co je v závorce funkce? Argumenty
99 Znamená parameter něco konkrétního? Ne, je to je název parametru.
100 Co je to bit masking?
101 Jakej je rozdíl mezi lambda: něco a lambda event: něco? lambda: něco je základní zápis, lamda event: něco, nebo prostě lambda cokoliv: něco se používá v případech, kdy jsou do lambdy posílána nějaká data a tato data je tedy potřeba vložit do proměnné (která se v našem případě jmenuje event, nebo cokoliv).
...
okno.bind("<KeyPress>", lambda event: print("Něco bylo stisknuto"))
...
V této ukázce kódu posílá do lambdy metoda bind() blok dat a to i přesto, že nejsou přímo volána. Proto je potřeba tuto funkci přiřadit do proměné (event). Malou úpravou funkce bysme takový blok dat získaly: okno.bind("<KeyPress>", lambda event: print(f"Blok informací je: {event}."))
102 Mohu volat proměnou event z otázky 101. Ne, proměná event funguje pouze v oblasti dané funkce, nikde jinde.
103 Co je to zápis combo["items"], kde combo je proměná? Je to zápis specifický pro knihovnu Tkinter. Například v kódu:
polozky = ("Zmrzka", "Pizza", "Mrkev")
combo = ttk.Combobox(master = okno)
combo["values"] = polozky
combo.pack()
vybírá možnost values, všechny hodnoty z ntice polozky.
104 Jaké jsou vlastnosti řetězců? Zpřehledňují čitelnost kódu, ale při nadměrném užívání zesložiťují debugování. Řetězit se dá kde co například metody (car.turn_on().drive().stop()), iterátory, operátory (1 < x < 10) či porovnávače (a == b == c).

V případě řetězení metod nelze danný řetěz přiřadit proměnné, pokud poslední část vrací prázdnou hodnotu. Vždy musí vracet něco konkrétního. Například segment cudlik = ttk.Button(okno, text = "Čudlík").pack() mi do promene cudlik nic nenapíše protože metoda pack() nic nevrací. Za to vykrik = "co děláš".capitalize().split(), již vrátí seznam ['Co', 'děláš'] zpracované. To jestli daná metoda něco vrací musím zjistit v d dokumentaci.

Nevýhodou řetězení metod je to, že když jedna selže mohou selhat i následující v řetězu. Některé metody nejsou navrženy na fungování v řetězcích (jako výše uvedená pack()), protože jinak nic nevrací.

105 Jaký je důvod pro vytváření tříd?
106 Co jsou to iterátory? Iterátor vzniká po aplikaci funkce __iter__() na iterovatelném objektu. To jestli je objekt iterovatelný se dá zjistit takto: print(dir(objekt v proměnné)). Většinou jsou iterovatelné objekty, které obsahují sekvence (seznamy, n-tice, apod.). Interovatelná je skupina čísel, ale ne jedno číslo).

V případě volání print(dir(objekt v proměnné)) na iterovaném objektu zjišťujeme, že má vedle funkce __iter__() i funkci __next__(). Jedná se tedy o iterátor. Ten je volán smyčkami tak dlouho, než je kód aplikován na všechny položky sekvence a pak se automaticky vypne. Iterátor je tedy v určitém slova smyslu přechodný objekt.

Iterace je opakovaní určité metody na různých objektech, tedy v případě Pythonu a smyček existuje buď konečná iterace (definite iteration) na smyčce for, protože dataset je omezený a pak existuje ještě nekonečná iterace (indefinite iteration) na smyčce while, která by mohla běžet nekonečně dlouho (respetive do zastavení podmínkou False).

107 Co umí knihovna random? Pracuje s náhodou a libovolnosti. Má metodu na generování náhodných položek, jejich výběr apod.
108 Co umí submodulu choice knihovny random? Vybírá jakoukoliv položku z neprázdné sekvence (např. ze seznamu). Nejedná se o submodul, ale funkci (viz 110).
109 Co to znamená for i in range(100):? Znamená to, spouštěj na každé hodnotě v rozsahu 0-99 (range(100)) kód který bude následovat za : s tím, že každá hodnota spuštění se přechodně uloží do proměnné i (tzn. že v kodu nemusí být i, ale jakékoliv jiné platné označení proměné). Tzn. do i se uloží hodnota po zpracování kódu na hodnotě 0, pak bude zahozena a uloží se tam hodnota po zpracování 1 a tak dále až do zpracování hodnoty 99. Výsek kódu může tedy vypadat: for dog in range(100):. Range() je build-in funkce, která generuje čísla v daném rozsahu. For loop tedy mohou zpouštět i na proměnné, kterou definuji jinde for dog in dogs:
110 Je choice submodul? Není, je to funkce.
111 Co je to loop for? Je to loop, který spouští stejný kód pro každou položku.
112 Jaké typy loopů existují?
  • for - spouští stejný kód pro každou položku (list, n-tice, řetězec, rozsah)
  • while - opakuje stejný kód do doby, než nastane podmínka False (jinak je True)
113 Co je to loop? Loop je proces který běží stále dokola, dokud není splněna nějaká podmínka.
114 Jaké objekty jsou iterovatelné a proč? Objekty, které mají metodu __iter__() jsou iterovatelné. Jestli mají metodu iter zjistím následovně: print(dir(objekt v proměnné)).
115 Co znamená podtržítko v parametrech funkce (např. def vyber_polozky(_):)? Znamená to funkci s prázdným parametrem, který Python nijak nezpracovává. Dává se to tam k indikaci toho, že je záměr tam v budoucnu nějaký parametr dát.
116 V jakých situacích se vyplňují parametry funkce a v jakých ne?
117 Co dělá klíčové slovo global? Jak ho používat? global označuje proměnou za globální. Za normálních okolností, jsou proměnné ve funkci lokální a je možné s nimi pracovat pouze v aktuálním rozsahu (current scope). Když se nějaká proměná označí za globální, tak je možné ji měnit odkudkoliv.
118 Jaký typ uvozovek (znaků) se používá u víceřádkového komentáře? Nejprve je třeba říci, že v Pythonu nic jako víceřárkové komentáře neexistuje. Někdy se ale víceřádkovému komentáři říká možnost rozdělit řetězec pro uživatele pomocí třech či čtyřech závorek. Dokud uživatel nedodá další tři nebo čtyři závorky, Python to chápe jako jednu řádku, byť je to pro uživatele zobrazeno na více řádcích.
119 Co jsou to string literals? Řetězcový literál je řetězec, obalený v uvozovkách. "foo" je řetězcový literál.
120 Mohu mít víceřádkový řetězcový literál? Ne, Python nemá víceřádkové string literals. Pro uživateld je lze různými způsoby rozdělit na více řádků pro lepší čitelnost, ale Python je stále chápe jako jednu řádku. Viz 122.
121 Rozlišuje Python něco jako konec řádku? Ne, konec řádku se pozná vložením nového řádku (např. značkou \n).
122 Představuje následující kód jednu, nebo více řádek?
tlacitko = ttk.Button(
  master = okno,
  text = "Prostě tlačítko",
  command = vstup_vystup
  )
Pro uživatele je to 5 řádek, pro Python 1. To že je možné uživateli zobrazit jednu řádku na pěti je dáno použitím párových závorek (()). Tedy dokud se závorka neuzavře, jedná se pro interpret o jednu řádku.

Podobně se chovají i jiné znaky, které dokáží uživateli zobrazit jednu řádku na více řádcích. Jedná se o:

  • zpětné lomítko (\) - dá se použít pro zformátování a lepší čistelnost dlouhého řetězce (textu)
  • trojité a čtyřnásobné uvozovky ('''foo'''/"""foo""", ''''foo''''/""""foo"""") - se používají podobně jako zpětné lomítko. Výhodou je lepší čitelnost řetězce a možnost vložení dalších formátovacích znaků. Nevýhodou je to, že některé systémy je interpretují odlištně (např. knihovna reticulate v Rku), takže využívání tohoto systému pro komentování může přinášet problémy. Přesto se tento systém široce používá pro vytváření víceřádkových komentářů a v dokumentačních *.py souborech.
  • různé typy závorek ((), [], {}) v některých situacích - kulaté (()) obsahují parametry funkcí nebo n-tice; hranaté ([]) seznamy; složené ({}) slovníky a sety. Například matematická funkce typu y = (x + 5) nepůjde rozdělit do více řádků bez narušení schopnosti ji identifikovat jako jeden řádek. Dále nepůjde asi rozdělit seznam ve slovníku; problémy mohou být i u indexů a řezání.
123 Co je to "rb" a jak zapadá do struktury? "rb" znamená read binary, tedy otevřít soubor pro čtení v binárním modu. Je to tedy mód funkce open(), která je build-in funkcí.
124 Co je to open()? Open() je build-in funkce otevírající soubory. Nese jedeno povinný argument a tím je cesta k souboru uložená do proměnné.
125 Jaké loopy existují a jaký je mezi nimi rozdíl? Loopy obecně zajišťují repetitivní akce. Existují dvě základní funkce:
  • for - používá se na iterovatelné objekty, což jsou většinou sekvence. Končí v momentě, kdy projde veškeré položky. V překladu to znamená pro, takže většinou se to zadává jako "pro něco udělej něco".
  • while - spouští blok kódu, tak dlouho pokud je podmínka True, v momentě, kdy je False, tak se vypne. Druhým způsobem vypnutí je použití klíčového slova break, které loop zastaví. V angličtině může slovo while označovat trvání, proto se to dobře hodí pro tuto situaci, která trvá po určitou dobu.
while True:
            data = file.read(65536)  
            if not data:
                break
            sha1_hash.update(data)
While spouští blok kódu, pokud je podmínka True. V tomto případě je ukončen klíčovým slovem break.
126 Co je to kontextový manager? Je to soubor funkcí, který zajistí všechny prostředky např. pro otevření souboru (metodou __enter__()) a zavření souboru (metodou __exit__()). Jde totiž o to, že byť existuje funkce open(), kterou lze také otevřít a uzavřít soubor, tak někdy může být potřeba nechat soubor otevřený do určité doby. Navíc k otevření a uzavření souboru může být potřeba provést řadu věcí - jako vyhradit na to prostředky v paměti apod., což by mohlo být pro programátora těžké, protože se to zjednodušuje předpřipravenými metodami a příkazem with vloženým do kontextového manageru.
127 Jaké typy managerů v Pythonu existují?
128 Break je klíčové slovo? Ano.
129 Co to znamená otevření a uzavření souboru. Otevření souboru znamená propojení programu a souboru na disku a uzavření odpojení.
130 Jaký je rozdíl mezi scope a context? Scope je místo, kde jsou definovány proměnné a je k ním přístup. Context je místo, ve kterém je blok kódu, který umožňuje řídit zdroje.
131 Co je to with?
132 Proč len(row) slouží k počítání sloupců?
133 Existuje nějaký validátor kódu, který by mi prošel kód označil případné hrozby?
134 Co dělá metoda os.walk()? Generuje názvy souborů procházením stromu souborů v určitém adresáři. Odtud název walk.
135 K čemu slouží modul os? Umožňuje operace se soubory.
136 Co znamená for root, _, files? Často se spojuje s metodou os.walk() (tedy jako for root, _, files os.walk()), která prochází soubory v adresáři a přiřazuje jednotlivým proměnným (root a files) ntice hodnot. Pozice za for loop označují:
  1. aktuální adresář
  2. subadresáře
  3. jednotlivé soubory.

Druhá pozice nemá název proměnné, ale pouze podtžítko (_). Tím se v Pythonu označuje nezájem o danou proměnou a její hodnotu.

137 Je notace _ běžná jen pro submodul os? Ne využívá se obecně v Pythonu k označení toho, že se něco nepoužije.
138 Co je filename a file?
139 Jaké jsou způsoby definování proměných?
  1. přiřazení přes =
  2. mnohočetné přiřazení přes =
  3. rozbalováním (například ntice)
  4. list comprehension
  5. rozbalením slovníku
  6. přiřazení přes loop
x = 10 #tedy proměnné x přiřazujeme hodnotu 10
name1, name2, name3 = "Petr", "Marie", "Lucie"
ntice = ("modrá", "bílá", "červená")
a, b, c = ntice
mocniny = [x**2 for x in range(5)]
kocka = {"jmeno": "Lady", "plemeno": "britská krátkosrstá"}
jmeno, plemeno = kocka["jmeno"], kocka["plemeno"]

#Volám proměnnou jmeno, nebo plemeno
for root, _, files in os.walk(directory_to_search):
Ve 4
140 endswidth() je metoda kterého modulu? Jádra Pythonu.
141 Proč jsou v tomto kódu dvě závorky: if filename.lower().endswith(('.jpg', '.jpeg')):?
142 Co je to conditional statement? Podmínečný příkaz
143 Které datový typy posloupnosti a mapování lze do sebe zařadit?
  • seznamy v seznamech
  • slovník v seznamu
  • seznam ve slovníku
  • ntice v seznamu
  • slovník ve slovníku
#Seznamy v seznamech
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

#Slovníky v seznamech
kocky = [
    {"name": "Daisy", "age": 20},
    {"name": "Lady", "age": 5},
    {"name": "Maky", "age": 30}
]

#Seznamy ve slovníku
zvirata = {
    "kocky": ["Daisy", "Lady", "Maky"],
    "psi": ["Azor", "Puňťa", "Blacky"]
}

#Ntice v seznamu
souradnice = [(1, 2), (3, 4), (5, 6)]

#Slovník ve slovníku
kočka = {
    "name": "Lady",
    "info": {
        "age": 5,
        "plemeno": "britská krátkosrstá"
    }
}
144 Jak fungují fiktivní proměnné (dummy variables)?
145 Kde zjistím, jak se můj Python kód bude chovat ve Windows a MacOS?
146 Jak funguje os.path.join()? Spojí dva řetězce, které mohou být uvedeny například formou proměné v parametrech metody.
147 Co znamenají hranaté závorky za proměnou? Např. if sha1_hash == csv_hashes[file_path] Jedná se o klíč slovníku. Tzn. že proměnná obsahuje hodnotu typu slovník a to co je v hranatých závorkách je klíč, tedy to co se má ze seznamu vybrat.
148 Co dělá os.path.splitext(path)? Rozdělí název souboru na název a koncovku a vloží je jako řetězce do ntice. Například pes.txt rozdělí na pes a txt, výsledek v kódu bude ('pes', '.txt').
149 Jaký je rozdíl mezi knihovnou, modulem a balíčkem? Modul je kód, který je reprezentován jedním souborem. Moduly se mohou skládat do knihoven či balíčků. Jde totiž o to, že termíny balíček a knihovna se často v Pythonu používají pro to samé. K tomu se nám ještě vyskytují submoduly, které jsou de facto také jednotlivé soubory, které jsou součástí nějakého balíčku a často ho nějakým způsobem rozšiřují. Například balíček tkinter obsahuje modul tkinter a submodul ttk. Modul a submodul jsou tedy v tomto případě soubory kódů a důvod, proč ttk je označen za modul je ten, aby odkázal na to, že nějaký způsobem obohacuje původní skript.
150 Jak fungují testovací kódy? Tak někteří navrhují pyramidální testování dynamické, kde úplně dole je to nejdůležitější a zároveň nejjednoduší testování. Nicméně, tím že je např. Python modulární, tak ani tyto testy nemusí objevit všechny chyby a doporučení, že kód má být krátký (protože se testuje funkcionalita, ne délka kódu). Jedná se o:
  1. unit test (česky jednotkový test), kdy se kód testuje po jednotlivých segmentech a v některých prostředích se nevyžaduje jeden test, ale test všech možných zcénářů, což může být časově značně náročné. Jedná se o white-box-testing, protože programátor ví, co v programu je. Problém s tímto typem testování ale je, že si ho programátoři často zjednoduššují a testují jen na jeden zcénář. Správně by ale měli testovat na všechny.
  2. test komponent, který zahrnuje to jak například kod komunikuje s databází. Dělá se to třeba tak, že se místo databáze vloží jiný prvek. V základu ale jde, že spolu jednotlivé jednotky, testované v předchozím kroku, dobře komunikují.
  3. integrační test, kde může propojení jednotlivých částí textovat někdo jiný než vývojář, nebo je kód umístěn na jiný server či do jiného prostředí, aby se vidělo, jestli to běhá správně i jinde.
  4. end-to-end test, kde se zjišťuje jak to funguje z front endu. Jsou na to služby (QA, UAT), trvají hodně dlouho, takže se hodí, jen pro větší aplikace, které se často nemění.
  5. V poslední úrovni je manuální testování. Dělá se tehdy, pokud se něco nedá automatizovat, protože obecným postupem je testovat spíš automatizovaně.

Takže testovací kód je kus kódu, který testuje samotný skrypt. Dalším typem testování je statické testování, kam patří kontrola syntaxe a překlepů. Pasivní testování zahrnuje kontrolu výstupů programu, tedy jestli například log či databáze neobsahují, nějaké anomálie.

151 Lze nějak zvalidovat kód? Ano, existuje řada online i IDE validátorů. Nicméně neřeší to vše.
152 Co to je 3-Alpha development status na pypi.org? Jedná se o klasický Alfa status, číšlo 3 je pouze informativní, že se jedná o třetí možný krok. Alfa status znamená, že software ještě netestovali ani developeři. Následuje Beta status, kde ho začínají testovat uživatelé. V alfa statusu může tedy software mít vážné závady.
153 Co umí knihovna pytest? Knihovna obsahující různé metody a nástroje pro jednotkový test (unit testing).
154 Lze zjistit, kolikrát byla určité knihovna zmíněna v nějaké odbornější diskusi (např. na Stack Exchange) a vidět to nějak v průběhu času? V podstatě jednoduše asi ne, člověk musí použít různé klasické vyhledávací služby typu Google.
155 Jakým způsobem spustit Python kód v kontajneru a dostat zprávu jen když chce použít nějakou komponentu, která není v kontajneru?
156 Co znamená chyba IndentationError: unexpected indent? Nějaká chyba v odsazení.
157 Jak poznám blok kódu, pokud mám špatně odsazeno? Musím být schopen v kódu definovat blok. Bloky jsou:
  1. funkcí - je tvořen řádkou definice funkce, která končí dvojtečkou (:) a vše co má na následujících řádkách stejné odsazení (doporučují se čtyři mezery) k funkci patří
  2. podmínek (if, elif, else) - na prvním řádku je podmínka, na řádku druhém je zadání, které se plní, pokud je podmínka pravdivá
  3. loopů (for, while) - na prvním řádku je zadání loopu zakončené dvojtečkou (:) a pokračují věci, které loop řeší se stejným odsazením
  4. bloky vyjímek (try, except, finally) - neodsazené je vždy klíčové slovo a řádek je zakončen dvojtečkou, následující kód je odsazen
  5. prázdný - na řádku odsazení jsou komentáře vyplňující místo, kam se v budoucnu vloží kód, nebo je zde klíčové slovo typu pass

Dalším hlediskem je vnořování bloků do sebe, což může opticky vytvářet zig zag odsazení, nebo jde odsazení stále doprava. Zde je potřeba umět správně identifikovat co k čemu patří.

#1) FUNKCE
def base36_to_binary(base36_hash):
    binary_data = base36.loads(base36_hash)
    return binary_data
2) BLOK PODMÍNEK
if len(row) == 1:
    base36_hash = row[0]
    csv_hashes.append(binary_data)
else:
    print("Chyba. CSV soubor musí obsahovat pouze jeden sloupec.")
#3) LOOP
for root, subdirs, files in os.walk(directory_to_search):
    print(root)
    print(subdirs)
    print(files)
#4) VYJÍMKY
try:
    result = 10 / 0
except ZeroDivisionError:
    print("Division by zero error occurred")
finally:
    print("Cleanup code executed")
#5) PRÁZDNÝ
if condition:
    # Zde bude kód
else:
    pass
158 Je return vždy součástí bloku funkce? Ne, může být součástí i bloku podmínky.
159 Jak se používá klíčové slovo and?
160 Jaké scopes (oblasti) existují? Každá funkce vytváří svojí lokální oblast. Nad tím je globální oblast a build-in oblast. Když se ale funkce do sebe zanořují, tak se do sebe zanořují i lokální oblasti. Jeden script tak může mít mnoho oblastí. S oblastmi pak souvisí i proměnné a jejich volání. Jde o to, kde je proměnná umístěna a odkud je volána. Pokud je například proměnná v lokální oblasti, dá se volat pouze z lokální, nikoliv globální oblasti. Pro přesun proměnné do globální oblasti se používá klíčové slovo global, které se vepíše před proměnou:
def moje_funkce():
    global x
    x = 5
    print(x)
moje_funkce()

print(x)
Takto se to dá ale řešit jen tehdy, pokud je proměnná neměná. Jiné slovíčko, které umožňuje posouvat proměnou je nonlocal.
  • build in - to co je zde funguje na vše níže
  • global - funguje v rámci celého skryptu
  • local - funguje pouze v daném místě


Klíčovým slovem nonlocal se dá proměnná vyjmout z lokální oblasti, pokud je v zanořené funkci. Pouze se před proměnou dá toto klíčové slovo. Tato proměná se pak ale nenachází v žádné oblasti. Při použití zobrazí hodnotu proměnné ve vnořené funkci, kde se použije slovo nonlocal.

161 Jak se přesouvají proměnné mezi oblastmi?
162 Co je moje_funkce() v
def moje_funkce():
    x = 5
    print(x)
moje_funkce()
?
Část kódu, která spouští funkci.
163 Jsou parametry funkce datovým typem? Nejsou, ale dá se s ními pracovat jako se slovníkem.
164 Ve kterých situacích je důležité pečlivé umístění kódu? V podstětě vždy, protože interpretr čte kód odshora dolů. Pokud například neimportuji knihovny a volám něco co je v těchto, knihovnách pak to nebude fungovat. Zmást mě může psaní kódu v nějakém pokročilém IDE (jako např. Rstudio), kde by to bude fungovat za všech okolností. Tedy např. i za situace, kdy bude import modulu na konci mého kódu.
165 Co umí random.randint(), tedy metoda randint() z modulu random? Generuje libovoné číslo (proto randint jako random integer) v zadaném rozsahu. Pokud mám tedy random.randint(1, 10) vygeneruje libovolné číslo z tohto rozsahu včetně okrajových hodnot.
166 Co dělá funkce map()?
167 Elif je něco jako or if? V podstatě ano. Používá se s podmínkou if v těch případech, kdy je více možností.
#1) DVĚ PODMÍNKY 
def prepinac():
  global hlidac_zobrazeni
  
  if hlidac_zobrazeni:
    znacka.pack_forget()
    hlidac_zobrazeni = False
  else:
    znacka.pack(expand = True)
    hlidac_zobrazeni = True
    

#widgety
hlidac_zobrazeni = True 
...
#2) VÍCE PODMÍNEK
...
operacni_system = platform.system()

if operacni_system == "Windows":
    print("Váš operační systém je Windows.")
elif operacni_system == "Linux":
    print("Váš operační systém je na bázi Linuxu.")
elif operacni_system == "Darwin":
    print("Váš operační systém je MacOS.")
else:
    print("Nepodařilo se mi zjistit Váš operační systém.")
...
V prvním případě porovnávám dvě možné hodnoty proměné hlidac_zobrazeni. Pokud je hodnota True, děje se něco, pokud je False, děje se něco jiného. Stačí mi tedy pouze dva podmínky if a else.

Ve druhém příkladě je více možností, pro které se vkládá elif. Znamená to, že bud nastane možnost na řádku 5, nebo 7, nebo 9 a nebo 11.

168 Jaké jsou hodnoty metody platform.system() a jakým operačním systémům to odpovídá?
  • Linux - Linux a odvozeniny jako Ubuntu a další
  • Windows - Windows
  • Darwin - MacOS
  • Java - Python v rámci Java Virtual Machine (JVM). To se obvykle děje v programování, kdy je cílem spojit vlastnosti těchto jazyků. Todle platí i v případech, že někdo integruje Python do HotSpot JVM, což je součást OpenJDK. Ovšem pozor v případě open Javy je někdy hodnota Java jindy Jython.
  • FreeBSD - FreeBSD
  • AIX - AIX (IBM server OS)
  • SunOS - Oracle Solaris
169 Existuje nějaký otevřený web, kde by se dal Python zkoušet na různých operačních systémech?
170 Co dělá funkce repr()? Funkce vypíše řetězec reprezentující hodnotu objektu, který je do ni poslán. Můžu tak zjistit podobu konkrétní hodnoty v čitelné podobě.
171 Je možné passnout lambda funkci?
172 Jak přesunu lambda funkci do definice vlastní funkce?
173 Jak vím, kdy potřebuje funkce parametr a kdy ne? Funkce potřebuje parametr pokud do funkce posílám z venčí hodnotu. Zjednodušený příklad:
#Někde získám telefonní číslo a funkce mi přidává předčíslý, potřebuju z venčí do funkce poslat proměnnou čísla
def cislo_s_predvolbou(cislo):
    print(f"+420 {cislo}")

cislo_s_predvolbou("748 562 954")
cislo_s_predvolbou("604 259 355")
174 Co dělá funkce super()? Funkce super() volá nějakou metodu z nadřazené třídy (superclass). Nejčastěji se používá pro volání konstruktor __init__(). Pokud mám kód:
class NoveOkno(tk.Toplevel):
  def __init__(self):
    super().__init__()
pak tk.Toplevel je nadřazená třída nově vytvářené třídě NoveOkno. tk.Toplevel třída sama obsahuje konstruktor __init__(), který by vytvořil její otisk (instanci), tj. tk.Toplevel(). Tím, že ale není zapsána jako instance, ale spíše jako odkaz v parametru, tak se tento konstruktor nespustí a je ho třeba přes super().__init__() do nové třídy natáhnout.
175 Jaké jsou dohody pro tvorbu názvů funkcí a tříd? Funkce dodržují hadí notaci (například moje_funkce) a třídy velbloudí (MojeTrida).

Speciální funkce neboli metody jsou obklopeny dvoumi podtržítky a nazývají se proto dunder methods (__init__, , __repr__). Ještě existuje dohoda o privátních názvech metod, která začínají jedním podtržítkem, což má ostatním programátorům indikovat, že tato metoda se má používat jenom v místě kde je a nemá se volat z venčí (_internal_data, _internal_method).

176 class je klíčové slovo? Ano.
177 Co je to podtřída? Podtřída je obecné označení třídy, které se vytváří v závislosti na jiné třídě. Například class NoveOkno(tk.Toplevel): vytváří třídu NoveOkno, která je ale podtřídou tk.Toplevel, protože tk.Toplevel je ve zdrojovém kódu modulu tkinter (zde ve jmenném prostoru tk) také třídou.

Podtřídy se nijak neoznačují (tak jako se třídy označují klíčovým slovem class) a abych byl schopen něco označit za třídu, musím vědět, že je to skutečně hierarchicky podřazeno nějaké třídě.

177 Mají třídy svůji lokální oblast (local scope)? Ano, říká se ji oblast třídy (class scope). Od lokální oblasti funkcí se liší tím, že proměné lze využívat mimo jen při uvedení jména třídy. Jinak řečeno nejde je tedy využít s použitím klíčového slova global.
178 Co dělá a umí __init__() metoda? Říká se jí také konstruktor, protože ladí prostředí a vytváří otisk třídy.
179 Jak poznám co je třída?
180 Jak funguje funkce __class__? Není to funkce, ale atribut objektu.
190 Jaký typ objektu je self? self je dohodnutý název pro otisk (instanci) třídy. Dohodnutý znamená, že se sice může používat jakékoliv slovo, které není klíčovým slovem, ale programátoři se dohodli, že budou používat právě self.

Podobně je na tom v knihovně Tkinter event. Event je v tomto případě proměnná, ale dohodnutá. Tzn., že i zde je možné použít různých názvů, ale dohoda zní, že hodnoty lambda funkcí se budou zachycovat do proměnné event.

191 Jaký typ objektu je parent? PŘEPRACOVAT (spíš je parent dohodnutou hodnout, master = parent) parent je další dohodnuté slovo jako self, které definuje nějakého rodiče. Funguje to podobně jako atribut master (např. master = okno) v knihovně Tkinter.

V níže uvedeném kódu zařazuje parent, widget inicializovaný ve třídě Menu pod widget definovaný ve třídě App. class Menu(ttk.Frame): pouze znamená, že tato třída bude případné vlastnosti přebírat z rodičovské třídy ttk.Frame.

Rodičovský widget se pozná tak, že obsahuje instanci třídy, ve které je uvedeno slovo parent. V tomto případě je tedy rodičovským widgetem třída App, protože obsahuje instanci třídy Menu (self.menu = Menu(self)). Zároveň třída Menu obsahuje označení parent, které udává, kdo bude tím rodičem
class App(tk.Tk): 
  def __init__(self, nazev, rozmer): 
    super().__init__() 
    self.title(nazev) 
    self.geometry(f"{rozmer[0]}x{rozmer[1]}") 
    self.minsize(rozmer[0],rozmer[1])
    
    
    #Widgety
    self.menu = Menu(self) 
    
    self.mainloop()
    
    
class Menu(ttk.Frame):
  def __init__(self, parent):
    super().__init__(parent)
    ttk.Label(self, background = "red").pack(expand = True, fill = "both")
192 Jaké dohodnuté názvy existují a co dělají?
  • self - povinný první parametr u všech otiskových metod třídy (což je třeba __init__()). Jeho funkcí je vyvolat otisk celé třídy při volání její metody, aby mohla metoda používat vše co potřebuje
  • cls - poviný první parametr u všech metod tříd. Zajišťuje přístup metody k parametrům zadání třídy.
193 Jaké typy metod existují?
  • otiskové (instanční) - metoda otisku se pozná tak, že má ve svém zdrojovém kódu v definici celé třídy dohodnuté jméno self. V případě volání dané metody z kódu, pak self zajistí natažení celého kódu třídy do paměti (tzv. vytvoření otisku či instance) a díky tomu je pak možné spustit konkrétní metodu. Výhodou je to, že mohu jednu třídu či její metodu využít několikrát jinak. Proto volám vždy její otisk a podle potřeby si tento otisk dále upravuji. Například pokud obsahuje třída atributy, které chci upravit, tak je mohu upravit.
  • metody tříd - stejně jako statické, nepotřebují instanci třídy a je možné je spouštět rovnou. Označují se dekorátorem @classmethod a prvním dohodnutým parametrem je cls. Díky parametru cls mají přístup k atributům třídy. Jde totiž o to, že i instanční metody mají přístup k parametrům, ale pouze u otisků. Toto oddělení je šikovné v tom smyslu, že metody tříd mohou přistupovat k původním neupraveným parametrům, kdežte instační metody mohou operovat s upravenými parametry na instancích (otiscích).
  • statické - statické metody se musí označit ve třídě dekorátorem @staticmethod. Následně je lze spouštět bez vytváření otisku třídy. Tedy nemají v sobě ono self, které ten otisk vyvolává. Nemají přístup k atributům třídy.
194 Jak funguje dědění? Jedna třída může dědit vlastnosti druhé třídy. Řeší se to tak, že se do závorky nové třídy - dědičná třída - se zapíše název rodičovské třídy. Obvykle se dědí jen z jedné třídy (jednoduchá dědičnost). Při dědění z vícero tříd (vícečetná dědivost) hrozí, že se tam bude něco mlátit.

Vedle dědění (inheritence) existuje, ještě kompozice, kdy třída B obsahuje instanci třídy A. V tomto případě lze převzít z instance jen některé metody. Na rozdíl od dědění se tedy ušetří výpočetní kapacita.

#1) JEDNODUCHÁ DĚDIČNOST
class SuperClass:
    #kód třídy
    
class SubClass(SuperClass):
    #kód třídy
#2) VÍCEČETNÁ DĚDIČNOST
class Pes:
    #kód třídy

class Kocka:
    #kód třídy
    
class Zvirata(Pes, Kocka):
    #kód třídy
195 Co je to dekorátor? Dekorátor je funkce, která rozšíří funkcionalitu jiné funkce. Volá se tak, že před definici samotné funkce se dá zavináč a název funkce dekorátoru.
196 Jaké typy dekorátorů existují? Dekorátory si mohu definovat, ale existují i vestavěné dekorátory:
  • @staticmethod - označuje metody, které ke spuštění nepotřebují self a tedy nepotřebují otisk celé třídy ani svůj a fungují. Prostě se napíše kód metody do třídy a před něj se umístí dekorátor @staticmethod.
  • @classmethod - dekorátor metod tříd, které nepotřebují ke spuštění instanci třídy a zároveň mají přístup přes dohodnutý parametr cls k atributům třídy.
  • @property - definuje metodu jako vlastnost (property)...
  • @abstractmethod -
197 Co je to atribut třídy? Jakýkoliv kód v třídě, který není metodou. Tudíž je přístupný všem metodám. Buď přes otisk třídy u metod instancí (tyto metody mají dohodnutý parametr self), nebo metodám tříd díky dohodnutému parametru cls.
198 Co je to vlastnost? Nejedná se o typ objektu, ale o způsob vytvoření metody, která se chová jako atribut. Takže metodu musím označit dekorátorem @property.
199 Co je to getter a setter?
200 V jaké oblasti (scopu) jsou atributy třídy? V oblasti třídy. Jde k nim přistupovat buď přímo zapsáním názevu třídy a názvu atributu (print(MojeTrida.muj_atribut)). Nebo z metod dané třídy:
  • u metod tříd přes dohodnutý parametr cls
  • u metod otisků z jejích otisků.
201 Jaké typy tříd existují?
202 Jak by vypadal příklad nějaké kompozice? V následujícím příkladě se nachází jedna kompozice a sice na řádku self.motor = Motor(), kde je do třídy Auto vložena instance třídy Motor a přebírají se pouze metody __init__() a spustit().
203 Musí mít definice třídy za sebou závorku? Nemusí, pokud nic nepřijímá z nadtřídy, tak nemusí.
204 Jak funguje kompozice, aby se načetly pouze ty atributy, které jsou potřeba? V případě kompozice načte interpret celý blueprint třídy a pokud jsou v kódu volány jednotlivé metody, tak následně větvoří instanci pouze k těm metodám
205 Lze využít pouze některé atributy třídy a nevytvářet jejich instance? Ano, lze je zdědit metodou super(). Sice interpret načte celou nadtřídu, ale může využít jen některé její atributy.
206 Jaký je rozdíl mezi instancí a kompozicicí tříd? Instance tříd může být složitější pro zápis a zatěžuje více paměť. U Kompozic je to jednodušší v tom smyllu, že kompozici vložím jedním zápisem.
207 Jak se pozná, která třída je rodičem (parent) a která potomkem (child)? Rodičovská třída bývá v parametrech třídy potomka.
208 Jaké vztahy v Pythonu existují?
209 Jaké typy dědičnost existují? Základními typy jsou dědičná (dětí se z jedné natřídy) a multičetná (dědí se z vícero nadtříd) dědičnost.

Dědičnost ale může vytvářet různé způsoby větvení, např.:

  • vertikální - třída B dědí od třídy A a třída C od B
  • stromová - B i C dědí od A
  • kombinovaná - B i C dědí od A, ale D dědí od B i C

Jak je ale vidět na posledním případě s narůstajícím počtem tříd může narůstat i způsob forem dědění. Nicméně je to vždy buď jednoduché dědění (dědí se jedna třída), nebo vícečetné dědění (dědí se více tříd).

#1) VERTIKÁLNÍ DĚDĚNÍ

class A:
    #kód
    
class B(A):
    #kód
    
class C(B):
    #kód
#2) STROMOVÉ DĚDĚNÍ

class A:
    #kód
    
class B(A):
    #kód
    
class C(A):
    #kód
#3) KOMBINOVANÉ DĚDĚNÍ

class A:
    #kód
    
class B(A):
    #kód
    
class C(A):
    #kód
    
class D(B, C):
    #kód
210 Jaká je posloupnost zpracování kódu?
  1. import knihoven a modulů
  2. zpracování kódu vyjma kódů označeních jako def a class
  3. zpracování kódů def a class pokud jsou z kódu volány (2) a to v momentě, kdy jsou volány
211 Mohou být def a class umístěny kdekoliv v kódu? Ne, musí být umístěny před místem kde jsou volány. Tzn. že nemusí být umístěny po importech knihoven a modlů jak je obvyklé, ale mohou být i jinde. Ovšem vždy před místem volání.
212 Kdy musí mít funkce uvedeny parametry? Pokud je ve funkci zpracovává. Například funkce
#Definice uživatelské funkce
def pozdrav():
    print("Čau, já jsem tvůj program!")
    
#Volání uživatelské funkce
pozdrav()
nezpracovává, žádné parametry, tudíž, nemusí být uvedeny ani v samotné funkci. Když ale funkce nějaké parametry zpracovává, tak je to nastaveno tak, že se musí uvést i do funkce.
213 Jak Python definuje pracovní adresář? Pracovní adresář je ten, kde byl Python spuštěn. Tzn. pokud spouštím Python z jiného adresáře (např. z adresáře home přes python3 diskD/Python/Tkinter/"muj skript.py") a volám v kódu nějaký soubor prostým odkazem na soubor, pak bude skript tento soubor hledat v adresáři home, nikoliv v diskD/Python/Tkinter/ kam sem si ho umístil.

Pokud bych skript spouštěl v IDE, tak to si může definovat vlastní adresář, kde to spustí. Je proto dobré definovat ve skriptu pracovní adresář, nebo udávat cesty k adresáři.

214 Jaká jsou pravidla shlukování tříd?
215 Jaké jsou způsoby přebírání kódu z jiných tříd?
  1. kompozice - do třídy A vložím otisk třídy B
  2. import (modulární programování) - třídu A importuju do kódu z jiného souboru pomocí klíčového slova import
  3. dědění - pokud je v parametrech třídy A název třídy B, dědí třída A vše ze třídy B a může to buď rozšířit, nebo přepsat
  4. třída mixin
  5. funkce nebo metody jako argumenty (de facto části tříd)
216 Co je to uzávěra (closer)? Funkce definovaná uvnitř jiné funkce a má přístup k proměným zvenčí této funkce. Např.:
def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function

closure = outer_function(10)
print(closure(5))  # Prints 15
217 with open as je co? Jedná se o kontextový manager, který má následující obecnou podobu:
with výraz as proměnná:#"as promměnná je nepoviné
    # blok kódu
Takové managery se využívaj ke správě zdrojů, jako jsou soubory, síťová spojení nebo zamykání a odemykání při práci s vlákny. Kontextový manager with vrací objekt ve výrazu a může ho přiřadit proměnné. Např.
with open('ttkFrame_to_tkMisc.txt', 'w') as file:
Vrací objekt souboru ttkFrame_to_tkMisc.txt otevřený pro zápis a ukládá ho pod proměnou file. Následně se dá použít třeba metoda write(), která do souboru něco zapíše: file.write("text").
218 Co je to dictionary comprehension?
219 Lze spustit skrypt odkudkoliv bez nutnosti zadávat cestu? Lze to. Pokud není adresář python scriptů v PATH, tak se tam musí napřed přidat, pak se na začátek python scriptu vloží shebang a souboru se scryptem se udělí práva.
220 Jak vývojáři pracují s různýma verzema Pythonu?
221 Jaký je rozdíl v použití if a elif? Když se používá více podmínek na bázi if, tak se musí každá vyhodnotit, což může zatěžovat výkon. Naopak elif funguje tak, že pokud podmínka je pravdivá, tak už se ostatní nevyhodnocují. Nicméně pokud bych do sebe if podmínky vnořil, pak to funguje podobně jako elif, jen to může být složitější a mohou vznikat problémy se správným odsazením.
222 Pokud funkce netiskne výsledek, musím použít return, aby se objekt vrátil, protože jinak je ve scopu funkce? Ano je to tak. Pokud ve funkci nepoužíváme funkci print(), kterou bysme hodnotu vytiskli, ale potřebujeme ji třeba přiřadit do nového proměnné, pak je potřeba použít klíčové slovo return, které vrátí objekt hodnoty a ten pak může být vložen do nové proměnné.
def soucet(a, b):
    secteno = a + b #Do proměné vloží součet a + b jejichž hodnoty přijme zvenčí
    return secteno #Vrací objekt hodnoty proměnné sečteno
    
dohromady = soucet(5, 2) #Do funkce soucet posle dva poziční parametry 5 a 2 a získá objekt hodnoty sečteno, který vloží do proměnné dohromady
Důležité je si uvědomit, ž proměnná sečteno je v lokálním scopu funkce. Aby se dala použít v globálním scopu, používá se klíčové slovo return, které ji vrátí ven.
223 Jak funguje funkce return v podmínkách if, elif a else? Po prvním provedení return už se dále nepokračuje v testování dalších podmínek. Je tedy jedno, jestli kód vypadá následovně:
def payement(hours, rph):
    if hours <= 45:
        normal_pay = hours * rph
        return normal_pay
    if hours > 45:
        hard_worker = ((hours - 45) * (5 * rph)) + (45 * rph)
        return hard_worker
Nebo takto:
def payement(hours, rph):
    if hours <= 45:
        normal_pay = hours * rph
        return normal_pay
    elif hours > 45:
        hard_worker = ((hours - 45) * (5 * rph)) + (45 * rph)
        return hard_worker
Pokud bude platit první podmínka, return vrátí hodnotu a další části funkce se nebudou vyhodnocovat.

Jinak return může vracet objekt konkrétní proměné, číslo, výsledek operace (např. return a + b) či hodnotu None při prostém zadání return bez ničeho. To se třeba využije pro potřeby vrácení funkce bez jakékoliv hodnoty.

224 Jak vytvořit smyčku bez použití klíčových slov for a while?
  • rekurze - funkce volá sama sebe a trvá tak dlouho, dokud může probíhat
  • s použitím generátoru - to je systém který generuje něco
#1) REKURZE
def odpocet(n):
    if n > 0:
        print(n)
        odpocet(n - 1)

odpocet(5)
#2) GENERÁTOR
def odpocet(n):
    while n > 0:
        yield n
        n -= 1

for cislo in odpocet(5):
    print(cislo)
yield je klíčové slovo, které přeruší funkci, vrátí objekt hodnoty a následně může funkce pokračovat.
225 Co znamená kód: [print(n) for n in range(5, 0, -1)]?
226 K čemu se používá klíčové slovo yield? Umožňuje vracet více hodnot funkce, tzn. funkci pozastaví, vrátí hodnotu a umožní pokračování ve funkci. Je to tak varianta ke slovu return, které vrátí hodnotu, ale funkce už dále nepokračuje.
def cisla_do_nekonecna():
    n = 0
    while True:
        yield n
        n += 1

# Vytvoříme generátor
generator = cisla_do_nekonecna()

# Vytiskneme prvních 5 čísel
for _ in range(5):
    print(next(generator)) #Next() vybírá další hodnotu z opakovače
227 Jak funguje funkce next()? Získává další hodnotu z opakovače (iterátoru).
223 Které typy hodnot lze iterovat a nelze prohazovat? ntice a množiny.
224 Co znamená print(n, end=' ')? Funkce print vytiskne proměnou n a za ni vloží mezeru. Parameter end specifikuje, co bude vloženo za vytištěné řetězce. Default je nový řádek (\n), ale to lze změnit právě vložením parametru end.
225 Co je end v print(n, end=" ")? Jedná se o pojmenovaný argument, neboli parametr. Existují ještě parametry sep a file. Sep definuje vlasní znak pro odělení více tištěných výrazů:
jmeno1 = "Petr"
jmeno2 = "Pavel"
jmeno3 = "Marie"

#Defaultně se vloží mezi jednotlivé segmenty mezera
print(jmeno1, jmeno2, jmeno3)
#Případně mohu pomocí parametru určit, že se jednotlivé segmenty spojí pomocí +
print(jmeno1, jmeno2, jmeno3, sep="+")
#Zde je parameter sep zbytečný protože imituje výchozí funkci
print(jmeno1, jmeno2, jmeno3, sep=" ")
#Naopak pokud je sep prázdný, tak spojí jednotlivé segmenty
print(jmeno1, jmeno2, jmeno3, sep="")
Parameter file pak odešle výstup do souboru. Default je sys.stdout, tedy výstup do konzole. Před odesláním výstupu do souboru je samozřejmě potřeba soubor otevřít v režimu zápisu:
jmeno1 = "Petr"
jmeno2 = "Pavel"
jmeno3 = "Marie"

with open("/home/~/print-do-souboru.txt", "w") as f:
    print(jmeno1, jmeno2, jmeno3, sep="+", file=f)
227 Funkce open() nezaloží neexistující soubor? Funkce open() nový soubor pokud existuje založí. Většina souborových systémů totiž při žádosti o zápis nebo připojení neexistující soubor založí.
228 Co dělá klíčové slovo continue? continue se používá zejména ve smyčkách for a while a umožňuje přerušit iteraci a vrátit zpracování na začátek smyčky (odsazeného bloku). Od klíčového slova break se tedy liší tím, že zpracování smyčky může pokračovat. Klíčové slovo break by smyčku zcela ukončilo a zpracovával by se kód pod ni.
for i in range(5):
    if i == 2:
        continue  # Ukončí zpracování smyčky (odsazeného bloku) pokud je i rovnou 2 a vrátí zpracování na první řádek odsazeného bloku
    print(i)
229 Jak se jmenuje systém ve kterém spolu spolupracují dva systémy, ale nejsou propojeny přes proměnou, tak jako to ukazuje následující příklad?
pocet = 0
for x in [3, 41, 12, 9, 74, 15]:
    pocet = pocet + 1
print('Počet prvků seznamu: ', pocet)
Proměnná x a začátek smyčky for x... může představovat jedno ozubené kolo, které se točí tak dlouho dokud jsou prvky v seznamu. Odsazený kód začínající proměnou pocet se pak automaticky provádí tak dlouho dokud jsou prvky v seznamu výše. Tím, že se zde ale nepracuje vůbec s proměnou x můžeme hovořit o jiném ozubeném kole, které se otáčí díky otáčení prvního.
Jedná se o oddělení, neboli decoupling. Také by se dalo hovořit o indirektní komunikaci, nezávislé iteraci či referenční transparentnosti. Vlevo uvedený příklad se dá ale zjednodušit a proměnou x vyjmout, protože se v kodu vůbec nepoužívá:
pocet = 0
for _ in [3, 41, 12, 9, 74, 15]:
    pocet = pocet + 1
print('Počet prvků seznamu: ', pocet)
Lze to též chápat také tak, že ozubené kolečko smyčky for má vlastní pohon a začne se samo točit, kdežto kolečko řádku 3 ho nemá a je tedy pasivně otéčeno kolečkem for.
230 Má způsob počítání terací níže uvedeném příkladu nějaký generický název?
pocet = 0
for _ in [3, 41, 12, 9, 74, 15]:
    pocet = pocet + 1
print('Počet prvků seznamu: ', pocet)
Dalo by se to nazvat, jako akumulace hodnoty. Nejednoduší je v těchto případech přičítat.
231 V jakých případech platí následující kód: if largest is None or itervar > largest:? Kód bude platit pokud alespoň jedna podnímka bude pravdivá. To znamená:
largest is None itervar > largest largest is None or itervar > largest
True True True
True False True
False True True
False False False

V logice se jedná o logickou disjunkci.

232 Které logické operace mají v Pythonu klíčové slovo?
  • and - konjunkce, vrací True pokud jsou obě podmínky True
  • or - disjunkce, vrací True pokod je alespoň jedna za dvou podmínek True
  • not - negace, vrací opak logické hodnoty (tedy True --> False a False --> True)


Jelikož jiné operace jako negativní or (nor) neexistují, musím vyjít z toho co mám. nor mi vlastně ze dvou False podmínek dává výsledek True. Mohu tedy negovat disjunkci: if not (a > 0 or b > 0)

233 Co je to vlajka a k čemu se používá? Vlajka je hodnota je logická hodnota, nebo prázdná množina, která definuje nějaký počáteční stav, od kterého se program odpichuje (či označuje část kódu, proto vlajka). Může tedy být booleovská hodnota True či False a případně binární ekvivalenty 0 a 1, anebo prázdná hodnota typu None či prázdné struktury jako prázdný seznam [], prázdný řetězec "", prázdný slovník {}, či prázdná ntice (). Používá se k:
  • sledování stavu programu
  • řízení toku programu
  • jednorázové akce a kontrola výsledků
224 Co je to fruit[index], pokud je fruit = "apple" a index = 0? Je to volání proměnné do indexu, takže výsledek by byl "a".
225 Proč tento skrypt vytiskne jednotlivá písmena?
slovo = "traktor"
for pismeno in slovo:
    print(pismeno)
Protože řetězec je iterovatelná hodnota a interpret rozkládá iterovatelné hodnoty automaticky na jednotlivé prvky a umožňuje je iterovat. Iterovatelné hodnoty jsou většinou sekvenční. Například řetězec je sekvence písmen.
226 Které typy proměných v jsou v Pythonu iterovatelné? Jedná se o typy:
  1. řetězec (string)
  2. seznam (list)
  3. ntice (tuple)
  4. slovník (dictionary) - lze iterovat přes klíče, hodnoty, nebo i kombinace klíč-hodnota. Výchozí iterace je po klíčích
  5. množina (set)
  6. frozenset
  7. bajty (bytes)
  8. pole bajtů (bytearray)
  9. memoryview

Dále podporují iteraci některé objekty jako:

  • rozsah (range)
  • souborový objekt
  • iterátor
  • generátor
1) ITERACE ŘETĚZCE
for pismeno in "traktor":
    print(pismeno)
2) ITERACE SEZNAMU
for item in ["Petr", "Xaver", 3]:
    print(item)

#Výsledek bude Petr, Xaver, 3, každý na separátní řádce
4) ITERACE SLOVNÍKU

for x in my_dict:
    print(x)  # x bude klíč, protože defaultně iterujeme přes klíče

for val in my_dict.values():
    print(val)  # val bude hodnota, protože iterujeme přes hodnoty pomocí values()

for k, v in my_dict.items():
    print(k, v)  # k a v budou klíč
227 Jaký je rozdíl mezi string[0] a string[:1]? Rozdíl je v metodách, pomocí string[0] se dá vybrat vždy jen jeden znak a jedná se o indexaci (indexing). Na druhou stranu string[:1] je řezání (slicing) a dá se vybrat celý rozsah. Výsledek bude stejný jen s jednou vyjímkou a to pokud na pozici 0 bude prázdný znak. V takovém případě nahlásí string[0] chybu IndexError, protože prázný znak, není znak a tudíž nemá index. V případě řezání [:1] bude ale prázdný znak vybrán, protože pokud není označen začátek nebo konec řezání, tak je řezáno do nekonečna.
228 Jak s říká zhuštění kódu na jeden řádek? Jednořádkový, nebo hustý kód.
229 Proč nemusím při použití funkce open() zapisovat právo read? Protože, je to výchozí nastavení?
230 Proč při iterování přes řetězec funkce print() vloží další řádek na konce řádků, takže tam mám text jakoby přes řádek? Jde o to, že textové soubory vlastně obsahují jeden řetězec, respetive pro Python je to několik řetězců - sekvence oddělených \n (znak pro nový řádek). Zároveň ve výchozím nastavení funkce print() na svůj konec vkládá také escape character pro nový řádek. Pokud tedy iteruji přes textový soubor, smyčka vyjme každý řetězec a novou řádku, print() tam ale přidá také novou řádku. Řešení je tedy použít funkci rstrip(), která zprava každého řetězce odstraní znak \n, nebo využít prázdného atributu end a zbavit se tak defaultního nastavení funkce print() (tedy print(promena, end = "")).
240 Co znamená traceback? Zpětná stopa.
241 Které typy souborů umí otevřít funkce open()? open() umí otevřít většinu typů souborů. Funkce open pracuje se systémovým API pro práci se soubory. Spíše jde o to, jak se s těmi soubory pak pracuje.
242 Kdy se používá hranatá závorka za proměnnou?
  1. Přístup k prvkům podle indexu (indexování) - číslo v hranaté závorce udává znak, který se má vyříznout
  2. Výřez dat ze sekvence (slicing) - klíč k výřezu je [start:stop:step]
  3. Přístup ke klíčům ve slovníku
  4. Aktualizace nebo přidání hodnot do slovníku
1) Indexování
text = "Žádost: Začernění osobních údajů"
pismeno = text[0]
print(pismeno)  # Výstup: 'Ž'
2) Slicing
text = "Pythomio"
cast = text[0:5] + "n"
print(cast)  # Výstup: 'Python'
3) Přístup ke klíčům ve slovníku
243 Proč se používá hranatá závorka za proměnnou, má to něco společného se seznamem?
244 Jak funguje str.punctuation()? sting.punctuation je konstanta (tedy bez závorky) obsahující řetězec všech interpunkčních znamínek.
245 Co je string.translate? Je to metoda z knihovny string, která mění znaky v řetězci a případně je i odstraňuje. Ke své činnosti potřebuje překladovou tabulku, která se vytváří funkcí str.maketrans(). Metoda se používá pro čištění textu (naříklad pro odstranění interpunčkních znamének) a přemapovávání znaků. Oproti metodě replace() umožňuje změnit více znaků naráz.
text = "abcde"
table = str.maketrans("abc", "123")
result = text.translate(table)
print(result)
246 Musí se v dokumentaci psát funkce se závorkami? Nemusí, ale v lepších textech se tak dělá. V kódu je to nutné vždy, protože se jedná o volání dané funkce, které je buď prázdné, nebo plné.
247 Co je str.maketrans? Jedná se o funkci, který vytvoří překladový slovník v unicode. Takže například str.maketrans("abc", "123"), kde a má být 1, b 2 a c 3 mi vytvoří překlad {97: 49, 98: 50, 99: 51}. Ten pak může použít funkce str.translate která najde určité znaky v zadaném řetězci a ty změní požadovaným způsobem. Znaky lze i odebírat, str.maketrans do překladové tabulky vloží None. Tedy str.maketrans("", "", "abc") mi dá {97: None, 98: None, 99: None}.

Hodnoty se do str.maketrans() zadávají buď jako řetězce (příklady výše), nebo jako slovník: str.maketrans({"a": "1", "b": "2", "c": "3"}).

V případě zadávání řetězců má str.maketrans jasně dané pozice. Na prvním místě jdou původní znaky, pak znaky, kterými to bude nahrazeno a nakonci znaky, které se mají odstranit. To znamená, že to může vypadat takto: str.maketrans(fromstr="abc", tostr="XXX", delstr="d"), což je totéžné s tímto: str.maketrans("abc", "XXX", "d") a při aplikaci na řetězci "abcde" bude vypadat překladová tabulka takto: {97: 88, 98: 88, 99: 88, 100: None}.

text = "abcde"
table = str.maketrans("abc", "123")
result = text.translate(table)
print(result)
248 Co jsou to "comprehensions"? Je to zjednodušený zápis smyček na jeden řádek. Není vhodné to používat u složitých smyček, ale pouze u jednoduších pro přehlednost. Mívá to i rychlejší zpracování kvůli zpracování na úrovni interpretu. Například vytvoření seznamu druhých mocnitelů v řadě 0-9 se dá ze smyčky:
squares = []#vytvoří prázdný seznam
for x in range(10):#range dodá do x řadu 0-9 a smyčka se tak spustí 9x
    squares.append(x**2)#funkce append() připojí druhé mocniny čísel do seznamu squares

print(squares)
#Vytiskne: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
se dá zjednodušit na:
squares = [x**2 for x in range(10)]

print(squares)
249 Jak se využívají slovníky pro počítání? Využívá se systém histagramu a toho, že v tabulce (slovník je vlastně jednorozměrnou tabulkou) dají zapsat čárky (tak jako vrchní v hospodě píše čárky k pivům) respetive frekvence výskytů.
# Vstupní seznam hodnot, kde chceme spočítat frekvence slov. Seznam můžeme udělat rozložením řetězce textu
slova = ["apple", "banana", "apple", "orange", "banana", "apple"]

# Prázdný slovník pro počítání
counter = {}

# Iterace přes seznam
for item in slova:#Vezme první položku v seznamu a spustí následují kód
    if item in counter:
        counter[item] += 1  # Zvýšíme hodnotu, pokud klíč existuje
    else:
        counter[item] = 1   # Inicializujeme hodnotu, pokud klíč neexistuje

print(counter)
Kód funguje tak, že prochází seznam slov a počítá počet výskytů párů. Platí totiž to, že pokud pár neexistuje, tak se vytvoří celý, tzn. sekce else vytváří páry typu "apple": 1. Když ale pár existuje tak tento typ kódu pouze updatuje hodnotu v tomto případě připočítává jedničku za každé protočení smyčky.

Build in nápověda

[editovat]

S.count(sub[, start[, end]]) -> int

[editovat]

Získáno přes help(str.count).

  • ->: se dá v nápovědě Pythonu přeložit jako . Čili když správně zadám to co je vlevo, tak mi to dá to co je vpravo, tedy integer - číslo (počet znaků v poli)
  • int: zkratka pro integer, tedy číslo
  • count(sub[, start[, end]]): zjednodušeně count() je funkce, respetive metoda, když je připojená pod třídu str
  • S.count(...): znamená, že je metoda volaná na řetězec. S je označení pro třídu str, nebo proměnou, která je za řetězec považována.
  • (sub[, start[, end]]): jedná se o parametry metody, ty které jsou mezi hranatými závorkami ([])jsou volitelné. Takže v tomto případě jediným povinným parametrem je sub. Vzhledem k tomu, že end má separátní závorku znamená to, že mohou být zvoleny jen atributy sub a start, nebo jen sub a možné i jen end. Otázka je, jestli takovédle nestování markapu je správně použité pro účel, ke kterému má sloužit?
    • sub: substring, tedy podřetězec
    • start: podkud je zadán, určuje index, odkud se bude podřetěz vyjímat. Pokud není zadán, subřetěz se bere zleva zezačátku. Počáteční index se zahrnuje do výběru.
    • end: určuje koncový index pro výběr řetězce. Pokud není zadán vybírá se až do konce. Koncový index se do výběru nezahrnuje.

Jednoduchý příklad

[editovat]
neco = "alabama" # Do proměne neco vkládáme řetězec, to že je to datový typ řetězec je dáno uvozovkami
print(neco.count("a"))       # Takže metoda "count()" je připojená na proměnou, která je vlastně řetězcem (tedy "neco.count()"). Do metody "count()" vkládáme subřetězec "a" a začátek ani konec subřetězce není určen, takže to bude hledat všechny "a" v řetězci "alabama" a díky funkci "print()" vytiskne na obrazovku jejich počet, tedy 4
print(neco.count("a", 1, 4)) # V tomto případě již řezáním určíme, v jakém řetězci se má počítat počet subřetězců "a". Je to od pozice 1 včetně, tedy "l", do pozice 4, což není včetně, tedy "a". Konkrétně prohlížíme subřetězec "lab" a v tom je jen jeden subřetězec "a", takže počet je 1
print(neco.count("a", -6, -3)) # výše uvedený výpočet z výřezu by šel dělat i přes negativní indexy

Výsledky řádků 2, 3, 4 = 4, 1, 1

isalpha(self, /)

[editovat]
  • Todle není syntax, ale nadpis, proto to možná není zapsáno jako S.isalpha(...)
  • isalpha(self, /): nicméně je to tedy metoda pro řetězce, která nese nějaké parametry
  • self: první parametr funkce ve třídě (nemusí se tomu říkat self). Zatím tomu moc nerozumím.
  • /: značí posunutou pozici, argumenty před (tj. vlevo od /) musí být volány tak, jak jdou po sobě, kdežto, případné argumenty napravo od / se už mohou na svých pozicích prohazovat. V tomto případě je vždy self na první pozici a nejde tedy napsat isalpha(/, self).

str(object='') -> str

[editovat]
  • ->: to říká, že to vlevo mi dá to vpravo. Tedy nějak definovaná třída vlevo mi ná řetězec
  • str: je zkratka pro string, tedy řetězec
  • str(object=''): je v tomto případě třída, které obsahuje nějaký objekt, jehož hodnotou je řetězec
#Řetězec
text = "Hello, World!"
print(text) # Výsledek Hellow, World!
print(text.count("l")) # Výsledek 3

#Objekt řetězce
text_object = str("Hello, World!")
print(text_object) # Výsledek Hellow, World!
print(text_object.count("l")) # Výsledek 3

Výše uvedený obecný zápis tedy odkazuje na převod řetězcového objektu na řetězec.

str(bytes_or_buffer[, encoding[, errors]]) -> str

[editovat]
  • ->: to co je vlevo mi dá to co je vpravo
  • str: řetězce
  • str(bytes_or_buffer[, encoding[, errors]]): třída a její parametry
  • (bytes_or_buffer[, encoding[, errors]]): to co je v hranatých závorkách je nepoviné, poviné je tedy pouze bytes_or _buffer.
  • bytes_or_buffer: obsahuje bajty nebo buffer, které chceme převést na řetězec
  • encoding: nepovinný parametr určuje, jaké kódování bude použito při převodu, pokud není uvedeno použije se default
  • errors: definuje, jak budou při převodu zpracovány chyby, pokud není zadáno, použije se defaul
bytes_data = b'\xc4\x8d\xc3\xad\xc5\xa1\xc5\xa5'
text = str(bytes_data, encoding="utf-8")
print(text)

Obecně se tady dá říct, že třída str převádí i jiné typy hodnot na řetězce, např. integers. U integers ale není potřeba řešit kódování, ani chyby.

num = 5 #Tady je to integer
otazka = (str(num)) #Tady to převádím na str object
print(type(otazka)) #Tady se ptám jaký typ proměnné to obsahuje a dostávám "str"

S.format(*args, **kwargs) -> str

[editovat]
  • ->: to co je vlevo dá napravo zase řetězec, tj. metoda vrací hodnotu typu řetězec
  • str: řetězec
  • S.format(): metoda připojená na řetězec, string, formátuje řetězce
  • (*args, **kwargs): parametry funkce
  • args: pozicionální argumenty, které mohou být předány do metody
  • kwargs: klíčové argumenty, které mohou být přednány do metody
  • *:
  • **:

Orientace v dokumentaci docs.python.org

[editovat]

Zdá se, že pro porozumění Pythonu je důležitější orientovat se v oficiální dokumentaci, nežli být schopen volat a rozumět build in nápovědě z příkazového řádku. Díky tomu, že se v nápovědě nedá hledat jako ve slovníku pojmů, ale musí člověk znát zařazení určitého prvku, tak často nemůže v příkazové řádce nic najít. Podobně složité je to ale na docs.python.org. Zatím se tedy jeví, že nejlepší je využívat chatGPT a pak si zbytek dohledávat právě třeba v docs.python.org.

Jak něco v dokumentaci najít

[editovat]
Č. Co se hledá Jak se to hledá Výsledek
1 Informace k metodě place(). Jdu do tkinter — Python interface to Tcl/Tk, CTRL+F a hledám place(). Nenalezeno.
Zadám do vyhledávacího pole place() a zmačknu enter. Vypadne mi mraky odkazů, zběžně jich pár projdu, ale nic nenacházím.
Index:Full index on one page:CTRL+F (place s funkcí Match a word). Nenalezeno
Zadám do Google "place()" site:docs.python.org. Nenalezeno.
Pročtu tkinter nápovědu a hledám něco co by tomu odpovídalo. Dozvídám se, že jsou výše odkázány podrobnější dokumentace, takže vybírám Tk commands (předchozí jsou neúplné a zastaralé).
2 Informace k metodě place() v Tk commands. Vidím place v seznamu. Proklikávám se k nápovědě.

Matematika

[editovat]
Č. Předmět Vysvětlení Příklady
M1 pohyblivá řádová čárka (floating-point arithmetic) Pohyblivá řádová čárka znamená, že jedno číslo můžeme zapsat různými způsoby, jen s pohybem řádové čárky. Například číslo 152853,5047 lze zapsat jako 1,528535047×105 (a v Pythonu pak jako 1.528535047e5 (zde je tečka místo čárky, protože v angličtině se tam dává tečka - odtud floating point)). Důvodem, proč se u počítačů tento způsob zavedl je, nemožnost ukládat neomezené množství polí čísla (32 bitové počítače mají jen 23 míst). Pokud je počet míst omezený, s hodně velkými či hodně malými čísly by nebylo možné pracovat, proto se u nich hýbe s desetinou čárkou a uvádí se jako násobek menšího čísla krát deset na něco.

Druhým důvodem může být to, že pokud se pracuje s menšími čísly, nežere to takový výpočetní výkon. Počítače totiž musí převádět čísla do binární soustavy a tak i malé číslo v desetinné soustavě se může v binární stát velkým. Nevýhodou pohyblivých čárek je ale to, že vznikají početní chyby. Například člověk když sečte 1/3+1/3+1/3, tak dostane 1, kdežto počítač něco jako 0,99999999, protože si to ve skutečnosti převádí na 0,33333.... a to když se sečte dá skutečně 0,99999.... Nicméně chyba vzniká i u klasických desetiných čísel. To lze řešit buď zaokrouhlením, nebo využitím knihovny decima1, která operuje s pevnou čárkou.

2 Jak vypočtu nejvhodnější rozdělení skupiny, pokud chci, aby byl zbytek po dělení co nejnižší?
3 Jak udělám škálu viz M2, kde budu mít dělence seřazeny od nejmenšího po největší pro jejich zbytek po dělení?
4 Jaká je priorita matematických operací, jak jdou za sebou?
  1. závorky (od vnitřní po vnější)
  2. mocnění a odmocňování
  3. násobení a dělení (zleva doprava)
  4. sčítání a odčítání (zleva doprava)
  5. absolutní hodnota,
  1. závorky mají nejvyšší priritu
5 Jaká jsou pravidla pro používání závorek?
  1. kulaté závorky (()) určují pořadí operací, mohou se do sebe vnořovat
  2. hranaté závorky ([]) se používají pro intervaly, matice a seznamy
  3. složenými závorkami ({}) se definují množíny
6 Co je to absolutní hodnota? Absolutní hodnota měří vzdálenost čísla od nuly. Takže |5| = 5, |-5| = 5 a |0| = 0. Využívá se například pro stanovení vzdálenosti mezi body na číselné ose. Například |-5-3| je 2.
7 Proč odčítáním záporných čísel měříme vzdálenost bodů na číselné ose? Protože vždy při odčítání měříme vzdálenost bodů na číselné ose. 5-3 jsou 2, jinak řečeno 2 dílky ze 3 do 2, tedy 2+3 je 5. Pak tedy platí, že 5-(-3) je 8 a -3+8 je 5.
8 Co je to pí a k čemu se využívá? Pí (π) vyjadřuje poměr obvodu kruhu, ke svému průměru. Například obvod kruhu se vypočte jako 2πr, kde "r" je poloměr kruhu. Pomáhá též s výpočty trigonometrických funkcí (sinus, cosinus) a teoreticky tedy může pomoci ve statistice, pokud zde máme nějakou distribuci, kam se dá prolnout kruh, nebo jeho část.
9 Co je to přirozený logaritmus?
10 Co je to konstanta tau?
11 Co je to logaritmus? Logaritmus je obrácená funkce mocnění, definuje mocnitel. Máme-li , můžeme to převést na . Takže platí:

Nicméně po svém objevení se logaritmus používal ke zjednodušení násobení, dělení a odmocňování tak, že se vytvořila tabulka s řadami čísel (později vydávaná jako logaritmická tabulka) a násobení se převedlo na sčítání, dělení na odčítání a odmocňování na zlomky. Mechanismus výpočtu by byl následující:

Skok Geometrická

progrese

S. Aritmetická

progrese (logaritmus)

Násobení gp Sčítání ap Dělení gp Odčítání ap gp Dělení ap
3 1 1 0
3 1
9 2 9---> 2
27 3 27---> 3 27 <---3
81 4 81---> 4 81 <---4
243 5
729 6 729---> 6
2187 7 2187 <---7
6561 8
19683 9 19683---> 9 (a 9/3)^
Logaritmická tabulka
Vysvětlení (násobení na sčítání): Udělám si dva sloupce. V jednom mám čísla o jakýkoliv skok (v tomto případě 3) ve druhém o skok 1. Když se rozhodnu vynásobit, jakákoliv dvě čísla z geometrické progrese, najdu analogická čísla v aritmetické progresi. Ty sečtu a z pozice čísla součtu, se podívám, jaké číslo tomu odpovídá v geometrické progresi. Tedy 3 + 4 = 7 a sedmičce odpovídá 2187. 27 * 81 = 2187. Pro potřeby počtů s jakýmkoliv číslem pak vznikly logaritmické tabulky.

Vysvětlení (dělení na odčítání): stejně se pracuje při převodu z dělení na odčítání a zpátky. 729 / 9 je skutečně při kontrole v kalkulačce 81. Vysvětlení (odmocňování): v gp si vyberu jedno číslo a určím si při jakém základu z ho budu odmocňovat. Pak najdu korespondující číslo v ap a to vydělím z.

12 Co je to radián? Jednotka pro měření úhlu.
13 Co je to faktoriál? Faktoriál je funkce určená pro výpočet součinu čísel, ze kterých se číslo skládá. Pokud například chceme faktoriál 5, vypočteme součin jednotlivých čísel jako 5*4*3*2*4=12. Takže !4 = 4*3*2*1 = 24 a !0 = 1 což je konvence.
14 Co je to slovní úloha? Slovní úloha je popis reálné, nebo nerálné situace u které se předpokládá, že ji převedete do matematického zápisu a spočítáte požadovanou neznámou. Mnoho slovních úloh je ale špatně postavených, nepřesných, či nekonzistentních. Některé jsou napsány technickým jazykem, bez jehož znalosti těžko úlohu někdo vyřeší.
15 Pokud někdo nerozumí slovním úlohám, znamená to, že nerozumí matematice? Neznamená, slovní úlohy nejsou matematika.

Gramatika Pythonu

[editovat]

Slovníček pojmů

[editovat]
Č. Pojem anglicky Česky Vysvětlení Příklad
1 >>> Znamená to, že interaguji s interpretrem Pythonu. Vše co zadám za >>> by mělo odpovídat pravidlům Pythonu. Interpret očekává vložení kódu.
2 ...
    1. Sekundární vložení kódu v terminálu, tzn. po stisknutí enteru se na další řádce objeví..., pokud:
      1. Klíčové slovo a na konci řádku dvojtečka (tj. otevření bloku kódu).
      2. Umístění otevřené závorky do prvního řádku ([, {, nebo () bez doplnění uzavřené.
      3. po obráceném lomítku (\)
    2. Terminál po kliknutí na enter nabízí další řádek se sekundárním vložením:
      1. Vložením prázdné řádky, takže defakto stiskem klávesi ENTER.
      2. Uzavření analogické závorky
      3. Nezadáním obráceného lomítka na konec řádku mi jde ale někdy do chyby, ale když tam zadám něco co tam má být tak se to uzavře (např. text = "Petr je\lotr"). Což je i u bodu 1. Když se tam zadá, něco co tam má být, tak se to uzavře, jinak to jde do chyby.
  1. Výpustka (Ellipsis) v kódu znamená cokoliv.
3 REPL Znamená read, evaluate, print, loop (synonymě language shell) je prostředí programovacího jazyka, který od programátora přebírá kód (read), zpracuje ho (evaluate), vytiskne ho na obrazovku (print) a případně ho zacyklí (loop).
4 statement příkaz Blok kódu.
  • x = 5
  • nula = x - x

Označení syntaxe

[editovat]
  • [] - to co je uprostřed není povinné
  • / - to co je předtím vlevo musí být použito či voláno na pozici či pozicích na který je to zapsáno
  • -> - znamená, že něco z něčeho plyne, nebo se stává. To co je vlevo většinou vytváří to co je vpravo
  • , - oděluje jednotlivé parametry
  • "" nebo '' - text mezi jednoduchými či složenými závorkami označuje hodnoty typu řetězec
  • = - značí přiřazení (matematické rovná se by bylo ==)
  • . - operátor označující příslušnost. To co je vpravo od tečky, přísluší k tomu co je vlevo od tečky. Při hledání nápovědy je potřeba vědět, k čemu se některé objekty přiřazují.

Funkce

[editovat]
Č. Funkce Co udělá
P1 exit() Opustí Python v příkazové řádce
2 len() Vrací délku (anglicky length), respetive počet položek objektu.
3 object() Funkce, která vytváří prázdný objekt, tudíš nepřijímá argumenty. Prázdný objekt po vytvoření může vypadat následovně: <object object at 0x7f95d83ff120>, kde 0x7f95d83ff120 je hexadecimální výpis identifikátor objektu.
4 type()

Skripty

[editovat]

cow.py

[editovat]

V terminálu jako python3 cow.py.

#!/usr/bin/env python

a, b, c, d, e, f, g, h, i, j, k = "(", "_", ")", "o", "/", "-", "\\", "|", "*", " ", "\n"
print(j * 11, a, b * 2, c, k, j * 11, a, d * 2, c, k, j*4, e, f*7, g, e, k, j*3, e, h, j*7, h*2, k, j*2, i, j, h, j*7, h*2, sep="")

duplicatefinder

[editovat]

Cílem je vytvořit nástroj, který porovná offline soubory s těmi na Commons a označí případné duplikáty v offline verzi. Bude pracovat na bázi porovnávání sha1 hashů, které sice mohou občas vytvořit duplicitní hash pro dva různé soubory, ale přijde mi to zatím lepší řešení, než se pokoušet srovnávat časové značky.

  1. vytvořit sha1 hashe u souborů z určitého adresáře a jeho podadresářů a uložit je do nějakého slovníku (hashe by měli být v Base36)
  2. v Petscanu si vytvořit výpis souborů s hashi a stáhnout ho ve formátu csv, pak to okleštit pouze na seznam hashů
  3. porovnat obě tabulky a duplicity označit například přidáním do názvu souboru DUPLIKÁT

Analýza chybových zápisů

[editovat]
Č. Kód Chyba Řešení Vysvětlení
1
def moje_funkce():
    nonlocal x
    x = 5
    print(x)
moje_funkce()

print(x)
 nonlocal x
    ^^^^^^^^^^
SyntaxError: no binding for nonlocal 'x' found
2