Výpis shrnutí
Řízení výpočtu
Podtémata
Řízení výpočtu
Program v Pythonu se skládá z více příkazů, které vhodným způsobem kombinujeme:
- Sekvence příkazů znamená, že prostě voláme příkazy jeden po druhém. Věnujeme při tom pozornost jejich výběru a řazení.
- Podmíněný příkaz nám umožňuje některé příkazy vykonat, jen pokud je splněna zadaná podmínka.
- Cyklus for a while využíváme pro opakované spouštění příkazů. Každý z těchto cyklů má trochu jiné použití a je dobré si důkladně procvičit oba dva.
- Řídicí struktury můžeme do sebe vnořit, např. mít podmínku uvnitř cyklu. Samostatně vyčleněné máme téma vnořené cykly, protože to je oblast, se kterou začátečníci typicky bojují.
- Programy dělíme do funkcí, které nám umožňují části kódu opakovaně používat.
Pro úplné začátečníky v Pythonu může být užitečné si jako rozcvičku projít cvičení na základy algoritmického myšlení, kde je možné si základy použití cyklů a podmínek procvičit formou grafického programování.
NahoruPodmíněný příkaz (if) v Pythonu
Podmíněné vykonání příkazu zapisujeme pomocí if. Jako
podmínku můžeme použít libovolný logický
výraz. Podmíněně můžeme vykonat také více příkazů. Blok příkazů
vyznačujeme odsazením:
if answer != 42: # příkazy se vykonají pouze, pokud je podmínka splněna:
print("Bad answer") # vypíšeme text
answer = 42 # a navíc změníme proměnnouElse větev
Můžeme také říct, co se má stát, když podmínka splněna není. K tomu
slouží příkaz else, který je následovaný odsazeným blokem
příkazů:
if x < 10:
print("small") # provede se, pokud podmínka je splněna
else:
print("big") # provede se, pokud podmínka není splněnaJednotlivým variantám výpočtu říkáme větve a podmíněný příkaz můžeme také označovat jako větvení.
Vícenásobné větvení
Pokud chceme testovat více možností, můžeme použít konstrukci
if / elif / else. V některých programovacích jazycích se pro vícenásobné větvení používá příkaz switch. Tento příkaz
v Pythonu nemáme, vystačíme si s využitím elif.
Příklad:
if age < 6:
print("předškolák")
elif age < 18: # testuje se, pokud neplatí předchozí podmínka
print("školák")
elif age < 65: # testuje se, pokud neplatí ani jedna předchozí podmínka
print("dospělý ")
else: # provede se, pokud neplatí ani jedna předchozí podmínka
print("důchodce")Z if/elif větví se provede maximálně jedna z nich – ta
první, u které je splněna podmínka. Pokud v uvedeném příkladě je v proměnné age uložena hodnota 15, vypíše se pouze text
„školák“. Podmínka age < 65 je sice také splněna, ale k jejímu vyhodnocování již nedojde.
Vnořené větvení
Podmíněné příkazy můžeme i zanořovat, tj. některá z větví můžem mít další větvení. U následných větví pak musíme zvýšit odsazení. Můžeme tedy psát například:
if choice == "tea":
if money >= 10:
print("ok")
else:
print("refuse")
else:
print("not available")
if n % 2 == 1:
if x > 13:
print("Win!")V některých případech je však jednodušší a přehlednější místo vnořeného kódu použít jednoduchý podmíněný příkaz s podmínkou využívající logické operace. Například druhý uvedený příklad můžeme zjednodušit takto:
if n % 2 == 1 and x > 13:
print("Win!")Cyklus for v Pythonu
Cykly při programování využíváme pro opakování skupiny příkazů.
Opakování označujeme často pojmem iterace. Cyklus
for využíváme při průchodu předem danou posloupností
hodnot, například pokud chceme provést známý počet opakování. Pokud
počet opakávání řídí podmínka, potřebujeme cyklus
while.
Jednoduchý for cyklus
Základní využití cyklu for je pro prosté opakování sady
příkazů. Pomocí for i in range(10) zopakujeme 10× sadu
příkazů. Příkazy, které se mají opakovat, musíme odsadit. Takto tedy
vypíšeme desetkrát Ahoj:
for i in range(10):
print("Ahoj")Řídící proměnná
V průběhu cyklu se mění hodnota řídící proměnné (ve výše uvedeném
příkladu je to i). V každém opakování cyklu tak můžeme
provést něco trochu jiného v závislosti na aktuální hodnotě této
proměnné. Jakých hodnot řídící proměnná nabývá, určuje část za
in. Pokud použijeme základní range, bude se řídící proměnná postupně zvětšovat o jedničku. Tento cyklus například
vypíše čísla od 0 do 9:
for i in range(10):
print(i)V rámci cyklu můžeme využívat více proměnných, pouze u řídící proměnné se však hodnota mění automaticky. Uvažme tento příklad:
y = 1
z = 2
for x in range(10):
y = x + y + z
print(x, y, z)Řídící proměnnou cyklu je x, jehož hodnota se tedy bude
postupně měnit (od 0 po 9). U proměnné y se bude hodnota
měnit, protože v rámci cyklu máme přiřazovací příkaz do y.
Hodnota proměnné z zůstane ve všech opakováních stejná,
protože z není řídící proměnná ani do ní v cyklu nic
nepřiřazujeme.
Využití range
Při základním použití kombinujeme for cyklus s funkcí
range, která vrací interval čísel, a řídící proměnná
následně nabývá hodnot z tohoto intervalu.
Pozor: V informatice často počítáme od nuly (nikoliv
od jedničky jako normální lidé). Na to narážíme i zde:
range(n) vrací hodnoty od 0 do
n-1.
Pokud funkci range zadáme dva parametry, tj. voláme
range(a, b), dá nám interval čísel od a do
b-1. Můžeme zadat i třetí parametr, který udává délku
skoku. Příklady:
for x in range(5, 13): print(x, end=" ") # 5 6 7 8 9 10 11 12
for x in range(5, 16, 3): print(x, end=" ") # 5 8 11 14
for x in range(8, 0, -1): print(x, end=" ") # 8 7 6 5 4 3 2 1For cyklus se dá využít nejen ve spojení s range, ale i obecněji. Můžeme například použít seznamy:
for x in [3, 7, 10]:
print(x)Ukázky použití for cyklu
Sudá a lichá
Výpis informace o sudosti a lichosti prvních n
čísel:
n = 20
for i in range(1, n+1):
if i % 2 == 0:
print(i, "je sudé")
else:
print(i, "je liché")Součet řady čísel
Výpočet součtu čísel od 1 do n:
n = 10
s = 0
for i in range(1, n+1):
s = s + i
print("Součet od 1 do", n, "je", s)Mocniny dvojky
Výpis informace o prvních n mocninách dvojky:
n = 10
for x in range(1, n+1):
print("Dvojka umocněna na", x, "je", 2**x)Materiál k tisku: čtení kódu
Kromě níže uvedených interaktivních cvičení je k dispozici také materiál k tisku (cvičení na rozlišování mezi podobnými kódy, u kterého se hodí dělat si poznámky na papír):
Cyklus while v Pythonu
Cykly při programování využíváme pro opakování skupiny příkazů.
Opakování označujeme často pojmem iterace. Cyklus
while využíváme, pokud dopředu nevíme, kolikrát se bude
cyklus opakovat. Pokud počet opakování známe, využíváme cyklus
for.
Základní použití
While cyklus se opakuje tak dlouho, dokud je splněna řídicí
podmínka cyklu (v následující ukázce jde o
n > 0). Tělo cyklu (příkazy, které se mají opakovat) vyznačujeme odsazením.
n = 5
while n > 0:
print("Tohle se vypíše pětkrát.")
n = n - 1Tímto cyklem vypisujeme mocniny dvou, dokud nepřekročí stovku:
n = 1
while n < 100:
print(n)
n = n * 2Nula i nekonečno opakování
Podmínka se vyhodnocuje ještě před prvním vykonáním těla cyklu. Pokud není splněna, tak se tělo while cyklu neprovede ani jednou:
n = 200
while n < 100:
print("Tohle se nevypíše.")Může se stát, že while cyklus neskončí nikdy. Tento program vypisuje donekonečna jedničky:
n = 1
while n < 100:
print(n)Takový nekonečný cyklus většinou znamená chybu v programu. Typickou chybou je, že zapomeneme v těle cyklu měnit hodnotu proměnné vystupující v podmínce cyklu. Tuto situaci označujeme jako „zacyklení programu“.
Ukázky použití while cyklu
Mocniny dvojky
Výpis všech mocnin dvojky menších než 1000:
n = 1
while n < 1000:
print(n)
n *= 2Sčítačka
Následující program načítá čísla od uživatele a průběžně je sčítá. Výpočet se ukončí, když uživatel zadá číslo 0.
total = 0
value = int(input())
while value != 0:
total += value
print("Current sum:", total)
value = int(input())
print("Final sum:", total)Materiál k tisku: čtení kódu
Kromě níže uvedených interaktivních cvičení je k dispozici také materiál k tisku (cvičení na dobré rozlišení mezi několika podobnými kódy, u kterého se hodí dělat si poznámky na papír):
Vnořené cykly v Pythonu
K opakování příkazů slouží základní cyklus for a cyklus while.
V těle cyklu mohou být nejen základní příkazy, ale třeba i další cyklus – ten nazýváme vnořený cyklus. Pro jeho použití nepotřebujeme žádný nový příkaz. Prostě jen cyklus zapíšeme (a odsadíme) uvnitř jiného cyklu. Vnořené cykly se ovšem vyplatí trénovat, jsou častým zdrojem problémů.
Příklad:
n = 5
for i in range(n):
for j in range(n):
print(i+j, end=" ")
print()Tento program vypisuje tuto tabulku:
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8Vnitřní cyklus (s řídící proměnnou j) vypisuje
jednotlivé řádky. Vnější cyklus (s řídící proměnnou i) pak
zařídí vypsání celé tabulky. Na tomto příkladu je dobře vidět důležitá
role správného odsazení. Příkaz print() způsobuje
odřádkování – používáme jej v programu vždy po výpisu kompletního
řádku.
Co by se stalo, kdybychom příkaz print() odsadili
více či méně?
- Kdybychom
print()odsadili o úroveň více:- Byl by součástí vnitřního cyklu, takže by se odřádkování provedlo po každém čísle.
- Výstupem programu by pak byla řada čísel pod sebou.
- Kdybychom
print()odsadili o úroveň méně:- Byl by zcela mimo cykly, takže by se odřádkování provedlo jen jednou, až úplně nakonec.
- Výstupem programu by pak byla řada čísel v jednom řádku.
Kromě níže uvedených interaktivních cvičení jsou k dispozici také materiály k tisku (cvičení na dobré rozlišení mezi několika podobnými kódy, u kterého se hodí dělat si poznámky na papír):
Funkce v Pythonu
Funkce je pojmenovaný blok příkazů. Funkcím můžeme předávat argumenty. Funkce vrací návratovou hodnotu.
Definice funkce
Python nabízí celou řadu vestavěných funkcí, tedy takových, které
jsou již připravené tvůrci jazyka. Příkladem je třeba funkce
len, která počítá délku řetězce.
Vlastní funkci definujeme pomocí klíčového slova
def:
def say_hello(name):
print("Hello", name)Tímto jsme definovali funkci say_hello, která má
parametr name. Funkce může mít i více parametrů.
Volání funkce
Tím, že definujeme funkci, se ještě nevykoná. Aby se funkce vykonala, musíme ji zavolat. To uděláme tak, že napíšeme jméno funkce a do závorek předáme konkrétní argument:
say_hello("Alice") # vypíše Hello Alice
say_hello("Bob") # vypíše Hello BobNěkteré funkce jsou bez parametrů. U jejich volání musíme závorky
stále uvést, např. say_goodbye().
Návratová hodnota
Funkce může vracet návratovou hodnotu pomocí klíčového slova
return. Následující funkce vypočítá a vrátí faktoriál.
def factorial(n):
f = 1
for i in range(1, n+1):
f = f*i
return fTakováto funkce sama o sobě nic neprovede, pouze vrátí hodnotu, se kterou můžeme dále pracovat.
factorial(5) # vypočítá hodnotu faktoriálu z 5, ale pak se tato
# hodnota nijak nepoužije
print(factorial(4)) # tentokrát výsledek výpočtu vypíšeme
x = factorial(6) # výsledek výpočtu se uloží do proměnné
print(x) # a pak třeba můžeme hodnotu proměnné vypsatPříkaz return ukončuje provádění funkce. Při volání
následující funkce se tedy vypíše pouze foo:
def test():
print("foo")
return 0
print("bar")Rozdíl return a print
Častý zdroj problémů u začátečníků je správné rozlišování mezi
použitím print a return ve funkcích.
Použití print způsobí okamžitý výpis hodnoty, nelze však
s touto hodnotou nijak dál pracovat.
Použití return ukončí funkci a vrátí hodnotu. Ta se automaticky nevypíše, ale můžeme ji přiřadit do proměnné a dále s ní
pracovat.