Python/Juandev
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 čárkouseznam_ptakovin = ["ptakovina 1", "ptakovina 2", "pt 3"]
, nebociselny-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:
- existují, ale například listy
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ě
- 3 vnořené listy, by se tedy zapsaly jako
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 seznami, 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) )
- a pak ještě n-matice ( s), které se chovají stejně jako seznami, pole se ohraničuje závorkami
- více proměných lze vytvořit i naráz:
x = y = z = 123
- u stejných proměnnýchx, 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čkuprint("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 kdybysme 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ýmpython3 *.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.")
- 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
- parametr je proměnná
- když je použita hodnota None, tak ji vypíše pouze funkce. Tedy
z = None
,z
nedá nic, aleprint(z)
dá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íší hodnotyPes
,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ýstupNone 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 hodnotouNone
(tomu se říká návratová hodnota). Když se pak interperetuje vnější funkceprint(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
, ab
, mohu je prohodit následovněa, b = b, a
CTRL + P
my v konzoli zapíšepython3
, 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 |
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 2
až 10.
- 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
- 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
- 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:
#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í
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 BooleanTrue
neboFalse
[]
označují index operátorstring.count()
je metoda třídy string, proto zapisované obecně jakoS.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 jakoevent
,lambda event:
nemusí být event ale cokoliv. stejně takself
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ý placeholderself
- 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
- u metod třídy používá Python parameter
- datové typy posloupností (seznami, 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 integer2
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
- indexovat, mohu ale i znaky z vnořených ntic. Pokud například mám
- 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)
- todlecto je užitečné v případě prohazování hodnot:
- 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
- Pro podmíněné větvení kódu:
- 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
- Import modulů
- 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)
Jak něco udělat
[editovat]Č. | Co | Jak | Vysvětlení |
---|---|---|---|
J:1 | Jak nainstalovat IDLE? | V Bash command line:
|
|
2 | Jak dostanu seznam klíčových slov? |
|
|
3 | Jak vyjedu seznam build-in funkcí? | ||
4 | Jak zjistím svojí verzi Pythonu? | V Bash:
|
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 seznami, 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? |
|
|
10 | Jak získat v REPL nápovědu k .mainloop() ?
|
|
|
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() ?
|
|
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")
|
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 seznami a n-tice, co vytváří podobný efekt? | ||
4 | Jaké typy hodnot existují? | |||
5 | Jaké datové typy mohou hodnoty nabývat? |
|
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? |
A další slouží spíše porovnávání:
|
||
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? |
|
||
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:
|
||
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? |
|
||
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: |
||
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ří.
|
|
|
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 |
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é a až f 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? |
|
|
|
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 |
||
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ů? |
|
||
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í 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 Pokud bych chtěl znát zařazení určitého objektu, je nejlepší používat nástroj, které se vyvolá zadáním |
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í? |
|
#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. |
|
|
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 |
||
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? |
|
||
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ř. |
||
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 ("#" ).
|
||
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)
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 ?
|
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.
|
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ě |
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()
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 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á |
||
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í 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 |
||
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í? |
|
||
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:
|
||
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:
|
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í:
Druhá pozice nemá název proměnné, ale pouze podtžítko ( |
||
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? |
|
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? |
|
#Seznami 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}
]
#Seznami 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:
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:
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)
|
||
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á |
168 | Jaké jsou hodnoty metody platform.system() a jakým operačním systémům to odpovídá?
|
|
||
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__()
|
||
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 ( |
||
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 |
||
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 |
||
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 . 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čemclass 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í? |
|
||
193 | Jaké typy metod existují? |
|
||
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:
|
||
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:
|
||
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ř.:
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? |
|
||
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()
|
||
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? |
|
||
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
with open('ttkFrame_to_tkMisc.txt', 'w') as file:
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
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
return vrátí hodnotu a další části funkce se nebudou vyhodnocovat.
Jinak |
||
224 | Jak vytvořit smyčku bez použití klíčových slov for a while ?
|
|
#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). |
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 dá. Č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 číslocount(sub[, start[, end]])
: zjednodušeněcount()
je funkce, respetive metoda, když je připojená pod třídustr
S.count(...)
: znamená, že je metoda volaná na řetězec.S
je označení pro třídustr
, 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 jesub
. Vzhledem k tomu, žeend
má separátní závorku znamená to, že mohou být zvoleny jen atributysub
astart
, nebo jensub
a možné i jenend
. 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ězecstart
: 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é parametryself
: 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ždyself
na první pozici a nejde tedy napsatisalpha(/, self)
.
str(object='') -> str
[editovat]->
: to říká, že to vlevo mi dá to vpravo. Tedy nějak definovaná třída vlevo mi ná řetězecstr
: je zkratka pro string, tedy řetězecstr(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 vpravostr
: řetězcestr(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 pouzebytes_or _buffer
.bytes_or_buffer
: obsahuje bajty nebo buffer, které chceme převést na řetězecencoding
: nepovinný parametr určuje, jaké kódování bude použito při převodu, pokud není uvedeno použije se defaulterrors
: 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 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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? |
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5 | Jaká jsou pravidla pro používání závorek? |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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í:
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 | ... |
|
||
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. |
|
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.
- 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)
- 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ů
- 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
|
||