- Napište funkci
say_hello(name)
, která vypíše pozdrav pro uživatele se zadaným jménem. (Anglicky, abychom nemuseli skloňovat...)
def say_hello(name):
print("hello", name)
say_hello("zuzka")
say_hello("john")
for i in range(5):
say_hello(i)
hello zuzka hello john hello 0 hello 1 hello 2 hello 3 hello 4
- Napište funkci
je_sudé(n)
, která vracíTrue
neboFalse
podle toho, jestli je zadané přirozené číslon
sudé. Analogicky napište funkcije_liché(n)
, která využívá předchozí funkci.
def je_sudé(n):
if n % 2 == 0:
return True
return False
def je_liché(n):
if je_sudé(n):
return False
else:
return True
# alternativně:
def je_liché(n):
return not je_sudé(n)
n = int(input("Zadej číslo:"))
print(je_sudé(n), je_liché(n))
True False
- Napište funkci
je_dělitelné(n, d)
, která vracíTrue
neboFalse
podle toho, jestli je zadané přirozené číslon
dělitelné číslemd
.
def je_dělitelné(n, d):
if n % d == 0:
return True
return False
# alternativně:
def je_dělitelné(n, d):
return n % d == 0
n = int(input("Zadej číslo:"))
for i in range(1,n):
print(je_dělitelné(n,i),end = " ")
True True True False False
- Napište funkci
počet_dělitelů(n)
, která spočítá a vrátí počet dělitelů přirozeného číslan
. Využijte funkci naprogramovanou v předchozím příkladu.
def počet_dělitelů(n):
pocet = 0
for i in range(1,n+1):
if je_dělitelné(n,i):
pocet += 1
return pocet
for i in range(10):
print(i, počet_dělitelů(i))
0 0 1 1 2 2 3 2 4 3 5 2 6 4 7 2 8 4 9 3
- Napište funkci
vypiš_dělitele(n)
, která vypíše všechny dělitele přirozeného číslan
.
def vypiš_dělitele(n):
for i in range(1,n+1):
if je_dělitelné(n,i):
print(i, end = " ")
for i in range(10):
print(i, ": ", end="")
vypiš_dělitele(i)
print("")
0 : 1 : 1 2 : 1 2 3 : 1 3 4 : 1 2 4 5 : 1 5 6 : 1 2 3 6 7 : 1 7 8 : 1 2 4 8 9 : 1 3 9
- Napište funkci
bmi(hmotnost, výška)
, která ze zadaných parametrů spočítá index BMI a vrátí výsledek jako číselnou hodnotu.
def bmi(hmotnost, výška):
return hmotnost / (výška**2)
hmotnost = float(input("Zadej svou hmotnost v kg:"))
výška = float(input("Zadej svou výšku v m:"))
bmi_výsledek = bmi(hmotnost, výška)
print(bmi_výsledek)
print(f"Vaše bmi je {bmi_výsledek:.1f}.")
23.437499999999996 Vaše bmi je 23.4.
- Naprogramujte funkci
součet_číslic(n)
, která spočítá součet číslic v desítkovém zápisu přirozeného číslan
.
def součet_číslic(n):
součet = 0
while(n > 0):
součet += n % 10
n //= 10
return součet
print(součet_číslic(456))
15
Naprogramujte funkci
remove(n, digit)
, která z desítkového zápisu zadaného přirozeného číslan
odstraní všechny číslice, které se rovnají hodnotědigit
. Např.:remove(123, 2)
→13
remove(243132, 3)
→2412
Pro procvičení můžete dále zkusit upravit libovolný příklad z předchozích cvičení a definovat v něm vhodnou funkci.
Příklady¶
Pro každou funkci v následujících příkladech napište vhodný docstring.
Ano/ne¶
- Napište funkci
ano_ne(otázka)
, která uživateli položí zadanou otázku a zeptá se ho na odpověď "ano" nebo "ne". Pokud je odpověď "ano", funkce vrátíTrue
, pokud je odpověď "ne", funkce vrátíFalse
. Pokud je odpověď něco jiného, program vypíše chybu a zeptá se znovu (uvnitř cyklu).
def ano_ne(otázka):
"""
Funkce položí uživateli otázku "otázka", a zeptá se na odpověď.
Pokud je odpověď "ano", funkce vrátí True, pokud je odpověď "ne",
funkce vrátí False. Pokud je odpověď něco jiného, program vypíše chybu
a zeptá se znovu
otázka
Textový řetězec s otázkou, např. "Je ti více než 18 let?"
ruturn
True (pro odpověď "ano") / False (pro odpověď "ne")
"""
while True:
s = input(otázka)
if s == "ano" :
return True
elif s == "ne":
return False
else:
print("Chyba: Zadej pouze 'ano' nebo 'ne'.")
odpoved = ano_ne("Bydlíš v Praze?")
print(odpoved)
odpoved = ano_ne("Bydlíš v Ostravě?")
print(odpoved)
Chyba: Zadej pouze 'ano' nebo 'ne'.
True
Chyba: Zadej pouze 'ano' nebo 'ne'.
False
- Upravte předchozí funkci do tvaru
ano_ne(otázka, počet_pokusů)
, kde číslopočet_pokusů
omezí maximální počet opakování cyklu.
def ano_ne(otazka, pocet_pokusu=3):
while pocet_pokusu > 0:
s = input(otazka)
if s == "ano" :
return True
elif s == "ne":
return False
else:
print("Chyba: Zadej pouze 'ano' nebo 'ne'.")
pocet_pokusu = pocet_pokusu-1
print("Nedal jsi jednoznačnou odpověď.")
odpoved = ano_ne("Bydlíš v Praze?",5)
print(odpoved)
odpoved = ano_ne("Bydlíš v Brně?")
print(odpoved)
Chyba: Zadej pouze 'ano' nebo 'ne'.
Chyba: Zadej pouze 'ano' nebo 'ne'.
Chyba: Zadej pouze 'ano' nebo 'ne'.
Chyba: Zadej pouze 'ano' nebo 'ne'.
Chyba: Zadej pouze 'ano' nebo 'ne'. Nedal jsi jednoznačnou odpověď. None
Chyba: Zadej pouze 'ano' nebo 'ne'.
Chyba: Zadej pouze 'ano' nebo 'ne'.
Chyba: Zadej pouze 'ano' nebo 'ne'. Nedal jsi jednoznačnou odpověď. None
- Upravte předchozí funkci tak, aby parametr
počet_pokusů
byl volitelný a pokud při použití funkce není zadaný, tak opakování může probíhat nekonečně dlouho.
# trochu ošklivé řešení přes math.inf:
import math
def ano_ne(otazka, pocet_pokusu=math.inf):
while pocet_pokusu > 0:
s = input(otazka)
if s == "ano" :
return True
elif s == "ne":
return False
else:
print("Chyba: Zadej pouze 'ano' nebo 'ne'.")
pocet_pokusu = pocet_pokusu-1
print("Nedal jsi jednoznačnou odpověď.")
odpoved = ano_ne("Bydlíš v Praze?",5)
print(odpoved)
odpoved = ano_ne("Máš rád psy?")
print(odpoved)
True
False
# elegantní řešení s defaultní hodnotou -1:
import math
def ano_ne(otazka, pocet_pokusu=-1):
while (pocet_pokusu <= -1) or (pocet_pokusu > 0):
s = input(otazka)
if s == "ano" :
return True
elif s == "ne":
return False
else:
print("Chyba: Zadej pouze 'ano' nebo 'ne'.")
pocet_pokusu = pocet_pokusu-1
print("Nedal jsi jednoznačnou odpověď.")
odpoved = ano_ne("Bydlíš v Praze?",5)
print(odpoved)
odpoved = ano_ne("Máš rád psy?")
print(odpoved)
True
False
def ano_ne(otazka, pocet_pokusu=None):
i = 0
while (pocet_pokusu == None) or (i < pocet_pokusu):
s = input(otazka)
if s == "ano" :
return True
elif s == "ne":
return False
else:
print("Chyba: Zadej pouze 'ano' nebo 'ne'.")
i = i + 1
print("Nedal jsi jednoznačnou odpověď.")
odpoved = ano_ne("Bydlíš v Praze?")
print(odpoved)
odpoved = ano_ne("Bydlíš v Ostravě?",3)
print(odpoved)
Chyba: Zadej pouze 'ano' nebo 'ne'.
Chyba: Zadej pouze 'ano' nebo 'ne'.
Chyba: Zadej pouze 'ano' nebo 'ne'.
Chyba: Zadej pouze 'ano' nebo 'ne'.
True
Chyba: Zadej pouze 'ano' nebo 'ne'.
Chyba: Zadej pouze 'ano' nebo 'ne'.
Chyba: Zadej pouze 'ano' nebo 'ne'. Nedal jsi jednoznačnou odpověď. None
Dělitelé¶
- Napište funkci
prvociselny_rozklad(n)
, která vypíše prvočíselný rozklad přirozeného číslan
.
def prvociselny_rozklad(n):
d = 2
while n > 1:
if n % d == 0:
print(d, end = " ")
n = n // d
else:
d = d + 1
n = 2 * 2 * 3 * 3 * 5
prvociselny_rozklad(n)
2 2 3 3 5
- Napište funkci
je_prvocislo(n)
, která vrátíTrue
, pokud přirozené číslon
je prvočíslo. Jinak vrátíFalse
.
def je_prvocislo(n):
if n <= 1:
return False
else:
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
cislo = int(input("Zadejte celé kladné číslo: "))
print(cislo, "je prvočíslo.") if je_prvocislo(cislo) else print(cislo, "není prvočíslo.")
78 není prvočíslo.
- Napište funkci
vypis_prvocisla(n)
, která vypíše všechna prvočísla menší než přirozené číslon
.
def vypis_prvocisla(n):
if n <= 1:
return False
else:
for i in range(2,n):
if je_prvocislo(i):
print(i, end = " ")
return True
vypis_prvocisla(24)
2 3 5 7 11 13 17 19 23
True
- Napište funkci
kte_prvocislo(k)
, která spočítá a vrátík
-té prvočíslo.
def kte_prvocislo(k):
if k <= 0:
return None
n = 1
while k >= 1:
n+=1
if je_prvocislo(n):
k -= 1
return n
for i in range(0,4):
print(kte_prvocislo(i),end = " ")
None 2 3 5
- Napište funkci
nsn(a, b)
, která spočítá a vrátí nejmenší společný násobek přirozených čísela
ab
.
Odhady, aproximace¶
- Napište funkci
eulerovo_cislo(n)
, která spočítá a vrátí odhad Eulerova čísla $e$ pomocí $n$-tého členu posloupnosti $(1 + \frac{1}{n})^n$. Pomocí srovnání s hodnotoumath.exp(1)
zhodnoťte, na kolik desetinných míst je výsledek přesný.
import math
def eulerovo_cislo(n):
return (1 + 1/n)**n
odhad = eulerovo_cislo(1000)
vzor = math.exp(1)
chyba = abs(odhad-vzor)
print(vzor, odhad, chyba)
2.718281828459045 2.7169239322355936 0.0013578962234515046
Číslo $\sqrt{2}$ lze zapsat pomocí nekonečného řetězového zlomku:
$$ \sqrt{2} = 1 + \cfrac{1}{2 + \cfrac{1}{2 + \cfrac{1}{2 + \ddots}}} $$
Napište funkci
odmocnina_2(n)
, která spočítá odhad čísla $\sqrt{2}$ pomocí řetězového zlomku s $n$ jmenovateli. Zhodnoťte, na kolik desetinných míst je výsledek přesný.
Napište funkci
zlatý_řez(n)
, která spočítá odhad zlatého řezu $\varphi$ pomocí řetězového zlomku s $n$ jmenovateli. Také zhodnoťte, na kolik desetinných míst je výsledek přesný.Zlatý řez:
$$ \varphi = \cfrac{1 + \sqrt{5}}{2} = 1 + \cfrac{1}{1 + \cfrac{1}{1 + \cfrac{1}{1 + \ddots}}} $$
- Napište funkci
ludolfovo_číslo(n)
, která spočítá a vrátí odhad Ludolfova čísla $\pi$ pomocí součtu prvních $n$ členů Leibnizovy řady. Zhodnoťte, na kolik desetinných míst je výsledek přesný.