1. Napište funkci say_hello(name), která vypíše pozdrav pro uživatele se zadaným jménem. (Anglicky, abychom nemuseli skloňovat...)
In [2]:
def say_hello(name):
    print("hello", name)
In [3]:
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
  1. Napište funkci je_sudé(n), která vrací True nebo False podle toho, jestli je zadané přirozené číslo n sudé. Analogicky napište funkci je_liché(n), která využívá předchozí funkci.
In [4]:
def je_sudé(n):
    if n % 2 == 0:
        return True
    return False
In [1]:
def je_liché(n):
    if je_sudé(n):
        return False
    else:
        return True
In [1]:
# alternativně:
def je_liché(n):
    return not je_sudé(n)
In [8]:
n = int(input("Zadej číslo:"))
print(je_sudé(n), je_liché(n))
True False
  1. Napište funkci je_dělitelné(n, d), která vrací True nebo False podle toho, jestli je zadané přirozené číslo n dělitelné číslem d.
In [9]:
def je_dělitelné(n, d):
    if n % d == 0:
        return True
    return False
In [9]:
# alternativně:
def je_dělitelné(n, d):
    return n % d == 0
In [13]:
n = int(input("Zadej číslo:"))
for i in range(1,n):
    print(je_dělitelné(n,i),end = " ")
True True True False False 
  1. Napište funkci počet_dělitelů(n), která spočítá a vrátí počet dělitelů přirozeného čísla n. Využijte funkci naprogramovanou v předchozím příkladu.
In [1]:
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        
In [16]:
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
  1. Napište funkci vypiš_dělitele(n), která vypíše všechny dělitele přirozeného čísla n.
In [20]:
def vypiš_dělitele(n):
    for i in range(1,n+1):
        if je_dělitelné(n,i):
            print(i, end = " ")
In [22]:
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 
  1. Napište funkci bmi(hmotnost, výška), která ze zadaných parametrů spočítá index BMI a vrátí výsledek jako číselnou hodnotu.
In [24]:
def bmi(hmotnost, výška):
    return hmotnost / (výška**2)
In [31]:
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.
  1. Naprogramujte funkci součet_číslic(n), která spočítá součet číslic v desítkovém zápisu přirozeného čísla n.
In [43]:
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
  1. Naprogramujte funkci remove(n, digit), která z desítkového zápisu zadaného přirozeného čísla n odstraní všechny číslice, které se rovnají hodnotě digit. Např.:

    • remove(123, 2) → 13
    • remove(243132, 3) → 2412
In [ ]:
 

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¶

  1. 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).
In [2]:
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
  1. Upravte předchozí funkci do tvaru ano_ne(otázka, počet_pokusů), kde číslo počet_pokusů omezí maximální počet opakování cyklu.
In [2]:
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
  1. 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.
In [3]:
# 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
In [4]:
# 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
In [5]:
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é¶

  1. Napište funkci prvociselny_rozklad(n), která vypíše prvočíselný rozklad přirozeného čísla n.
In [9]:
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 
  1. Napište funkci je_prvocislo(n), která vrátí True, pokud přirozené číslo n je prvočíslo. Jinak vrátí False.
In [10]:
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.
  1. Napište funkci vypis_prvocisla(n), která vypíše všechna prvočísla menší než přirozené číslo n.
In [10]:
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 
Out[10]:
True
  1. Napište funkci kte_prvocislo(k), která spočítá a vrátí k-té prvočíslo.
In [26]:
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 
  1. Napište funkci nsn(a, b), která spočítá a vrátí nejmenší společný násobek přirozených čísel a a b.
In [ ]:
 

Odhady, aproximace¶

  1. 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 hodnotou math.exp(1) zhodnoťte, na kolik desetinných míst je výsledek přesný.
In [6]:
import math
def eulerovo_cislo(n):
    return (1 + 1/n)**n
In [8]:
odhad = eulerovo_cislo(1000)
vzor  = math.exp(1)
chyba = abs(odhad-vzor)

print(vzor, odhad, chyba)
2.718281828459045 2.7169239322355936 0.0013578962234515046
  1. Čí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ý.

In [ ]:
 
  1. 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}}} $$

In [ ]:
 
  1. 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ý.
$$ \pi = 4\sum^\infty_{k=0} \frac{(-1)^k}{2k+1} = \frac{4}{1}-\frac{4}{3}+\frac{4}{5}-\frac{4}{7}+\frac{4}{9}-\cdots $$
In [ ]: