Praktikum 9¶

Allolevad ülesanded on kursuse "Sissejuhatus programmeerimisse Pythoni baasil" YFX0500 praktikumis koos kursusega ja kodus iseseisvalt lahendamiseks. Kuidas lahendada allolevaid ülesandeid? Uuri ja kasuta loengus kommenteeritud süntaksi näiteid, abiinfot (Pythoni sisseehitatud funktsioon help, jne.), Internetti ja enda aju. Küsimuste korral, mis tekivad praktikumi ajal, pöördu õppejõu või õppejõudude poole. Iganädalaselt peale praktikumi toimumist avaldatakse ülesannete lahendused kursuse kodulehel.

Viimati uuendatud 26.10.2025.

Inimintellekti loodud ülesanded¶

Ülesanne 0:

Silu kood. Mis on valesti? Mitu erisust või viga on võimalik leida. Mis erisus või erisused tõstatuvad?

vanus = {'juulius'=24, 'juulia'=26}
print(vanus['juulius'])

Vastus: Viga: SyntaxError.

Ülesanne 1:

Silu kood. Mis on valesti? Mitu erisust või viga on võimalik leida. Mis erisus või erisused tõstatuvad?

vanus = {'Juulius': 24,
         'Juuli': 24
         'Juulia': 43
        }

print(f'Juulia on {vanus["juulia"]} aastat vana. Preili käest vanust ei küsita!')

Vastus: Erisused SyntaxError ja KeyError, vigased koodiread leia ise.

Ülesanne 2:

Silu kood. Mis on valesti? Mitu erisust või viga on võimalik leida. Mis erisus või erisused tõstatuvad?

def solve_quadratic(a, b, c):
    # Calculate the discriminant
    D = b**2 - 4*a*c

    # Initialize the solutions
    if D > 0:
        # Two real solutions
        x1 = (-b + D**0.5) / (2 * a)
       x2 = (-b - D**0.5) / (2 * a)
    elif D == 0:
        # One real solution
        x1 = x2 = -b / (2 * a)
    else:
        # Complex solutions
        real_part = -b / (2 * a)
        imaginary_part = (-D**0.5) / (2 * a)
        x1 = (real_part, imaginary_part)
        x2 = (real_part, -imaginary_part)

    return x1, x2

# Example usage
a, b, c = -1, 2, 3
solutions = solve_quadratic(a, b, c)
print(f"The solutions are: x1 = {solutions[0]}, x2 = {solutions[1]}")

Vastus: Viga IndentationError, vigase või vigased koodiread leia ise.

Ülesanne 3:

Eksponent funktsiooni $f(x) = {\rm e}^{x}$ Taylori rittaarendus kohal $x$ on kujul:

$$ {\rm e}^{x} \equiv \exp x = \sum_{n=0}^{\infty} \frac{x^{n}}{n!} = 1 + x + \frac{x^{2}}{2!} + \frac{x^{3}}{3!} + \frac{x^{4}}{4!} + \cdots ,$$

kus $n \in \mathbb{Z}$ on astmerea liikmete arv. Siinus funktsiooni $f(x) = \sin x$ Taylori rittaarendus kohal $x$ on esitatav kujul:

$$ \sin x = \sum_{n=0}^{\infty} (-1)^{n} \frac{x^{2n+1}}{(2n+1)!} = x - \frac{x^{3}}{3!} + \frac{x^{5}}{5!} - \frac{x^{7}}{7!} + \cdots ,$$

kus $n \in \mathbb{Z}$ on astmerea liikmete arv. Allpool kasutatakse eelmainitud definitsioone eksponentfunktsiooni ja siinuse väärtuste leidmiseks. Programmeerija on huvitatud funktsiooni:

$$ f(x) = \frac{\sin(0.32 x)}{\exp(\alpha)} , $$

väärtustest arvutatuna lõigul $x \in [0, 1, 2, \dots, 27, 28, 29]$, kolme erineva eksponendi $\alpha$ väärtuste puhul. Eksponendi $\alpha$ väärtused on $\alpha_1 = 660$, $\alpha_2 = 760$ ja $\alpha_3 = 860$. Seega:

$$ f_1(x) = \frac{\sin(0.32 x)}{\exp(\alpha_1)}, $$

$$ f_2(x) = \frac{\sin(0.32 x)}{\exp(\alpha_2)}, $$

$$ f_3(x) = \frac{\sin(0.32 x)}{\exp(\alpha_3)}, $$

kusjuures funktsioon $\sin(x)$ väärtused leitakse kasutades $50$ astmerea liiget ja funktsioon $\exp(x)$ väärtused leitakse kasutades $500$ realiiget. Programmeerija kirjutas programmi:

def taylor_sin(x, n_terms):
    """Approximate sin(x) using n terms of the Taylor series."""
    result = 0
    sign = 1  # Alternates between + and -
    factorial = 1
    power = x  # start with x^(2*0+1) = x

    for n in range(n_terms):
        # Compute factorial for (2n+1)
        if n > 0:
            factorial *= (2*n) * (2*n + 1)
            power = x ** (2*n + 1)
        result += sign * power / factorial
        sign *= -1  # alternate sign

    return result


def taylor_exp(x, n):
    """Approximate e^x using n terms of the Taylor series."""
    if n < 1:
        raise ValueError("Number of terms must be greater then 0.")
    
    result = 0
    factorial = 1  # start with 0! = 1
    
    for k in range(n):
        if k > 0:
            factorial *= k  # compute k! iteratively
        result += (x ** k) / factorial
    
    return result


def ascii_plot(lst, height=13, x_spacing=1, point_char="o"):
    """ASCII vertical graph plotter using a customizable character for data points.
    Automatically scales to data range, shows a zero line, 
    and adds spacing between x-axis points.

    Args:
        lst (list[int|float]): data values
        height (int): vertical height of the graph
        x_spacing (int): spaces between data points horizontally
        point_char (str): character used for plotting data points
    """
    
    if not lst:
        print("(empty list)")
        return

    mn, mx = min(lst), max(lst)
    if mn == mx:
        mn -= 1
        mx += 1

    def value_to_row(v):
        ratio = (v - mn) / (mx - mn)
        return int(round((1 - ratio) * (height - 1)))

    cols = len(lst)
    rows = height
    width = cols * (x_spacing + 1)

    grid = [[" " for _ in range(width)] for _ in range(rows)]

    # place points
    for i, v in enumerate(lst):
        r = value_to_row(v)
        c = i * (x_spacing + 1)
        grid[r][c] = point_char

    # zero line (if 0 is within range)
    zero_line_row = value_to_row(0) if mn <= 0 <= mx else None
    label_w = max(len(str(mx)), len(str(mn)))

    # draw top to bottom
    for r in range(rows):
        if r == 0:
            label = str(mx).rjust(label_w)
        elif r == rows - 1:
            label = str(mn).rjust(label_w)
        elif zero_line_row is not None and r == zero_line_row:
            label = "0".rjust(label_w)
        else:
            label = " " * label_w

        line = []
        for c in range(width):
            ch = grid[r][c]
            if zero_line_row is not None and r == zero_line_row:
                line.append(point_char if ch == point_char else "-")
            else:
                line.append(ch)
        print(f"{label} ┤" + "".join(line))

    # x-axis labels
    x_axis = " " * (label_w + 2)
    for i in range(cols):
        x_axis += str(i % 10) + " " * x_spacing
    print(x_axis)


def plot_3_functions(*alpha_values):
    for alpha in alpha_values:
        amp = 1 / taylor_exp(alpha, 500)
        data = [amp * taylor_sin(0.32 * x, 50) for x in range(30)]
        ascii_plot(data)
        print('\n')


alpha1 = 660
alpha2 = 760
alpha3 = 860
plot_3_functions(alpha1, alpha2, alpha3)    

Programmeerija kasutab funktsiooni ascii_plot leitud väärtuste kuvamiseks. Programmeerija kood ei tööta täies ulatuses. Midagi läheb valesti kui püütakse arvutada funktsiooni $f_3(x)$ väärtusi. Nimelt tõstatakse erisus OverflowError. Kasuta plokki try-except ning halda erisust väljastades kasutajale sobiva teate ja erisuse asemel sõne 'infty' mis tähistab lõpmatust.

Vajadusel muuda või täiusta funktsiooni plot_3_functions. Kuidas seda teha peaks olema arusaadav kui uurid vastuse näidet.

Oodatav tulemus:

 6.761076547650774e-277 ┤        o o o                                   o o         
                        ┤      o       o                               o     o       
                        ┤    o                                       o         o     
                        ┤                o                         o             o   
                        ┤  o               o                                         
                        ┤                                        o                 o 
                      0 ┤o-------------------o---------------------------------------
                        ┤                                      o                     
                        ┤                      o                                     
                        ┤                                    o                       
                        ┤                        o                                   
                        ┤                          o       o                         
-6.738018244885622e-277 ┤                            o o o                           
                         0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 


 2.5130438759567016e-307 ┤        o o o                                   o o         
                         ┤      o       o                               o     o       
                         ┤    o                                       o         o     
                         ┤                o                         o             o   
                         ┤  o               o                                         
                         ┤                                        o                 o 
                       0 ┤o-------------------o---------------------------------------
                         ┤                                      o                     
                         ┤                      o                                     
                         ┤                                    o                       
                         ┤                        o                                   
                         ┤                          o       o                         
-2.5044732694644476e-307 ┤                            o o o                           
                          0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 


Läks piirajasse: integer division result too large for a float
 1.0 ┤                                                            
     ┤                                                            
     ┤                                                            
     ┤                                                            
     ┤                                                            
     ┤                                                            
   0 ┤o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-
     ┤                                                            
     ┤                                                            
     ┤                                                            
     ┤                                                            
     ┤                                                            
-1.0 ┤                                                            
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 

Ülesanne 4:

Lae kursuse kodulehelt alla moodul L9_Ul4.py. Ava moodul integreeritud arenduskeskkonna tarkvaras (Spyder või mõni muu). Silu kood. Mis on valesti? Mitu erisust või viga on võimalik leida. Mis erisus või erisused tõstatuvad?

Vastus: Süntaksiviga TabError, vigase või vigased koodiread leia ise.

Ülesanne 5:

Silu kood. Mis on valesti? Mitu erisust või viga on võimalik leida. Mis erisus või erisused tõstatuvad?

def fun(a, b):
    print(a, b)
    
fun(a=1, 2)

Vastus: Süntaksiviga SyntaxError.

Ülesanne 6:

Leia kõik süntaksivead ilma lähtekoodi interpreteerimiseta.

for i in range(4):
    print i

Vastus: Süntaksiviga SyntaxError.

Ülesanne 7:

Leia kõik süntaksivead ilma lähtekoodi interpreteerimiseta.

def mySum(a,b):
c=a+b
return c

print(mySum([2,3.75]))

Vastus: Erisused IndentationError ja TypeError.

Ülesanne 8:

Leia kõik süntaksivead ilma lähtekoodi interpreteerimiseta.

x = 2.2
if x<0
    print('negative')
elif x>0
    print('positive')
else
    print('zero')

Vastus: Süntaksiviga SyntaxError.

Ülesanne 9:

Leia kõik süntaksi vead ilma lähtekoodi interpreteerimiseta.

y = 1.0/x if x != 0: else: 0
print (x)
print (y)

Vastus: Süntaksiviga SyntaxError.

Ülesanne 10:

Leia kõik süntaksivead ilma lähtekoodi interpreteerimiseta.

x = 2.2
y = -6.6

negative = -1
if x > 0 and y > 0:
    print(not negative)
elif x < 0 and y < 0:
    print('both negative')
elif x == 0 or y == 0:
    print('one is zero')
elif x == 0 and y == 0:
    print('both are zero')
else:
    print('one is positive, one is negative')

Vihje: Loogikaviga.

Ülesanne 11:

Silu funktsiooni perenimi.

andmed = {"nimi": "Juulius Tipikas", "amet": "maskott"}

def perenimi(): 
    return andmed["perenimi"]

perenimi()
print("Maskoti perekonnanimi on {}".format( perenimi() ))

Ülesanne 12:

Ajarändur ilmub järsku meie klassiruumi. Allolev programm teretab ajarändurit olenevalt tema päritolu aastast. Leia vead.

aasta == int.input("Tervist! Mis aastast sa tuled? '))

if aasta <= 1900
    print('Wow'd, tere nimevik!')
elif year > 1900 && year < 2020:
    print("Tere oleviku inimene!")
elif:
    print ("Tere tuleviku inimene, kas sa räägid Hiina keelt?")

Ülesanne 13:

Paranda süntaksivead.

greeting = input("Hello, possible pirate! What's the password?)
if greeting in ["Arrr!"):
    print("Go away, pirate.")
elif
print("Greetings, hater of pirates!")

Ülesanne 14:

Halda erisusi. Kasuta konstruktsiooni try/except.

a = 'Hello World!'
a + 10

Vihje: Erisus TypeError.

Ülesanne 15:

Halda erisusi. Kasuta konstruktsiooni try/except.

lst = [5, 10, 20]
print(lst[5])

Vihje: Erisus IndexError.

Ülesanne 16:

Tutvu loengus esitatud funktsiooni jaga üldistatud kujuga (esitatud koodirakus 30). Veendu, et kõik erisused on hallatud, s.t., et Pythoni interpretaator ei tõstata erisusi.

import math

def jaga(a, b):
    try:
        return a / b
    except TypeError:
        try:
            a, b = float(a), float(b)  # Proovin numbriks teisendada.
            return jaga(a, b)
        except ValueError as e:
            print('Ei teisene numbriks:', e)
            return None
        except TypeError as e2:
            print('Sellised sisendid pole lubatud:', e2)
            return None
    except ZeroDivisionError:
        print('Teade: Läheneb sellele suurusele või võimatu.')
        return a * math.inf  # Argumenti a kasutame märgi jaoks.

Vihje: Testi funktsioon.

Ülesanne 17:

Miks tõstatub erisus ZeroDivisionError?

import math

def jaga(a, b):
    try:
        return a / b
    except TypeError:
        try:
            a, b = float(a), float(b)  # Proovin numbriks teisendada.
            return jaga(a, b)
        except ValueError as e:
            print('Ei teisene numbriks:', e)
            return None
        except TypeError as e2:
            print('Sellised sisendid pole lubatud:', e2)
            return None
    except ZeroDivisionError:
        print('Teade: Läheneb sellele suurusele või võimatu.')
        return a * math.inf  # Argument a on märgi jaoks. Läheneb sellele suurusele.


print(jaga(1 / 0))

Vihje: Puudub.


Koos kursusega¶

Ülesanne 18:

Silu kood kasutades arenduskeskkonna Spyder (või mõne muu) silurit (graafiline kasutajaliides).

k = {0:'kaua', 1:'kauem', 2:'igavesti'}

def elagu(num):
    i = 0
    while i < num:
        text = k[i]
        print('Ta elagu {}!'.format(text))
        i += 1


diplomeid = 'viis'
kaitsmisi = 'viis'
nimi = 'Juulius Tipikas'

print('Käib koolis {}.'.format(nimi))
print('Juba aastaid käib ta koolis.')
print('Diplomeid on kirjutanud {}.'.format(diplomeid))
print('Edukalt kaitsnud on ta {}!'.format(kaitsmisi))

elagu(3)

Oodatav tulemus:

Käib koolis Juulius Tipikas.
Juba aastaid käib ta koolis.
Diplomeid on kirjutanud viis.
Edukalt kaitsnud on ta null!
Ta elagu kaua!
Ta elagu kauem!
Ta elagu igavesti!

Ülesanne 19: *

Ava moodul L9_Ul19.py. Silu failist leitud lähtekood. Kui selleks on vajadus siis kasuta Pythoni silurit. Tutvu ülesandega kaasaskäiva artikliga. Veavaba kood peab looma artikli Joonisel 2 kujutatud kõverate graafikud.

Artikkel veebis: http://www.sciencedirect.com/science/article/pii/S0196890413000277
Artikkel (kohalik koopia, lühendatud): artikkel.pdf

Ülesanne 20:

Silu kood. Programm peaks väljastama konsooli neli ASCII graafikut.

def ascii_plot(lst, height=20, x_spacing=2, point_char="o"):
    """
    ASCII vertical graph plotter using a customizable character for data points.
    Automatically scales to data range, shows a zero line, 
    and adds spacing between x-axis points.

    Args:
        lst (list[int|float]): data values
        height (int): vertical height of the graph
        x_spacing (int): spaces between data points horizontally
        point_char (str): character used for plotting data points
    """
    
    if not lst:
        print("(empty list)")
        return

    mn, mx = min(lst), max(lst)
    if mn == mx:
        mn -= 1
        mx += 1

    def value_to_row(v):
        ratio = (v - mn) / (mx - mn)
        return int(round((1 - ratio) * (height - 1)))

    cols = len(lst)
    rows = height
    width = cols * (x_spacing + 1)

    grid = [[" " for _ in range(width)] for _ in range(rows)]

    # place points
    for i, v in enumerate(lst):
        r = value_to_row(v)
        c = i * (x_spacing + 1)
        grid[r][c] = point_char

    # zero line (if 0 is within range)
    zero_line_row = value_to_row(0) if mn <= 0 <= mx else None
    label_w = max(len(str(mx)), len(str(mn)))

    # draw top to bottom
    for r in range(rows):
        if r == 0:
            label = str(mx).rjust(label_w)
        elif r == rows - 1:
            label = str(mn).rjust(label_w)
        elif zero_line_row is not None and r == zero_line_row:
            label = "0".rjust(label_w)
        else:
            label = " " * label_w

        line = []
        for c in range(width):
            ch = grid[r][c]
            if zero_line_row is not None and r == zero_line_row:
                line.append(point_char if ch == point_char else "-")
            else:
                line.append(ch)
        print(f"{label} ┤" + "".join(line))

    # x-axis labels
    x_axis = " " * (label_w + 2)
    for i in range(cols):
        x_axis += str(i % 10) + " " * x_spacing
    print(x_axis)
    
    
    def tul(data, dx):
        res = []
        for i in range (len(data)-1):
            tv = (data[i+1]-data[i])/dx
            res.append(tv)
        return res
    
    
    siire = [1, 2, 4, 6, 6, 4, 3, 1, 0, -1, -2, -1, 0, 2, 3, 4, 5, 5, 5, 4]
    dx = 0.1
    
    kiirus = tul(siire, dx)
    kiirendus = tul(kiirus, dx)
    iiveldus = tul(kiirendus, dx)

    ascii_plot(siire, 8, 1, 'o')
    print()
    ascii_plot(kiirus, 8, 1, 'o')
    print()
    ascii_plot(kiirendus, 8, 1, 'o')
    print()
    ascii_plot(iiveldus, 8, 1, 'o')

Vihje: Kontrolli kas globaalses skoobis luuakse muutujad siire, kiirus, jne.

Autor: Meriliin Arusalu, 2025


Tehisintellekti loodud ülesanded¶

Järgnevad ülesanded on loodud 26.10.2025 juturoboti OpenAI ChatGPT (GPT-5) poolt.

Ülesanne TI-1

Validating user input with assert

Create a function get_age(age) that:

  • Uses assert to check that the age is a positive integer less than 120.
  • Uses try-except to catch AssertionError and print a message: "Invalid age entered!".

Ülesanne TI-2

Debug the safe_divide function

Below is a buggy implementation of safe_divide(a, b). Your job: find and fix the bugs so the function:

  • Attempts to convert inputs to numbers (allow strings like "10" or "3.5").
  • Uses try/except to handle:
    • division by zero,
    • invalid numeric conversion,
    • other unexpected errors.
  • Uses an assert to ensure the denominator is not zero (so you can demonstrate catching AssertionError).
  • Returns the quotient as a float when successful; on error, returns None.
  • Prints clear, user-friendly error messages for each failure case.

Buggy Code (Do Not Copy as the Final Answer)

def safe_divide(a, b):
    try:
        a = float(a)
        b = float(b)
        assert b > 0
        return a / b
    except ZeroDivisionError:
        print("You tried to divide by 0")
    except TypeError:
        print("Type error")

What's Wrong

  • assert b > 0 wrongly rejects valid negative denominators and raises AssertionError instead of protecting against zero only.
  • ZeroDivisionError will never be raised after assert blocks zero the way it's written.
  • TypeError won't catch ValueError from float() conversion.
  • The function doesn't return None explicitly on error and messages are not descriptive enough.

















☻   ☻   ☻