Praktikum 8¶

Allolevad ülesanded on kusrsuse "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 20.10.2024.

Ülesanne 1:

Järjesta loend a tähestikulisse järjekorda. Esita loend b kahanevalt.

a = ['Mari', 'Mai', 'Kalle', 'Aune']
b = [23, 65, 77, 1, 34, 99, 854]

Ülesanne 2:

Järjesta loend a tähestikulisse järjekorda. Lisa iga nime ette sõne "Natsi-".

a = ['Mari', 'Bella', 'Kalle', 'Aune']

Oodatav tulemus:

['Natsi-Aune', 'Natsi-Bella', 'Natsi-Kalle', 'Natsi-Mari']

Ülesanne 3:

Leia ja esita uues loendis loendi arvud arvud mis on keskmisest väiksemad. Tulemuse leidmiseks kasuta sisseehitatud funktsiooni filter. Etteantud loend:

arvud = [1, 2, 3, 4, 5, 6, 7, 3.3, 6.6, 4.4, 8.9]

Ülesanne 4:

Kasutades ainult ühte rida koodi, kirjuta programm mis filtreerib järgmist listi:

nimed = ['juulia', 'juulius', 'silver', 'mare', 'juku', 'arno']

Jäta alles nimed mis algavad tähega "j". Muuda nime esimene täht suureks. Lisa nimedele perekonnanimi "Tipikas".

Oodatav tulemus:

['Juulia Tipikas', 'Juulius Tipikas', 'Juku Tipikas']

Ülesanne 5:

Andmed on esitatud listis kujul:

lst = ['', [], 'a', (1,), 0, False, True, 100]

Leia kõik mittetriviaalsed listi elemendid. Salvesta leitud listiliikmed uude listi. Funktsiooni bool kasutamine on keelatud. filtreeri välja mittertiviaalsed objektid

Oodatav tulemus: ['a', (1,), True, 100].

Ülesanne 6:

Andmed on esitatud listis kujul:

data = ['x', -1, -2.5, 3, 4.5, 5, 6.7, [1, 2, 3], 'y', 'g']
  1. Filtreeri välja sõned ja järjesta need uues listis tähestikulisse järjekorda, prindi loodud list konsooli.
  2. Filtreeri välja numbrid mis jäävad negatiivseks peale seda kui neile on liidetud arv üks ja neid on ümardatud kasutades funktsiooni round. Salvesta leitud ja muudetud arvud uude listi.

Oodatav tulemus:

  1. ['g', 'x', 'y']
  2. [-2.5]

Ülesanne 7:

Andmed on esitatud kujul:

lst = ['', [], 'a', (1,), 0, False, True, 100]

Tuvasta listis lst olev (tühi) list ja lisa sellele listi lst kõik muud elemendid.

Oodatav tulemus: ['', ['', 'a', (1,), 0, False, True, 100], 'a', (1,), 0, False, True, 100].

Ülesanne 8:

Leia ringi pindalad erinevate raadiuste jaoks kasuta funktsiooni map ja enda defineeritud funktsiooni pindala mis leiab ringi pindala. Ringi pindala valem on kujul: $$A = \pi r^2,$$ kus $r$ on raadius. Leia $\pi$ väärtus kasutades enda lemmikut $\pi$ aproksimatsioonivalemit, vt. nt. https://mathworld.wolfram.com/PiApproximations.html

Etteantud raadiused:

raadius = [1, 2, 3, 4, 5, 6, 7.5, 9, 23.3]

Ülesanne 9:

Kirjuta programm mis palub kasutajal sisestada tehte kujul: 1 + 8 * 8 * 9. Kui kasutaja sisestab tehte õigesti, tervita kasutajat sõnega kujul:

'Tubli! Sinust saab hea käsutäitja! Teretulemast natsipartei liikmeks.'

Kui kasutaja teeb vea tehte sisestamisel (eeldame, et suvalist teksti ei sisestata) siis vasta sõnega kujul:

'Ei oska trükkida vä? Kas su isa teab, et sa oled jobu!'

Korda protsessi kuni õige tehe on sisestatud või kuni kolm korda. Kui kasutaja on valemi kolm korda valesti sisestanud siis ja ainult siis teavita kasutajat järgmisest:

'Fuihhh, sa ei ole nats, milline kergendus.'

Kasuta sisseehitatud funktsiooni eval ja while-else tsükklit.

Ülesanne 10:

Keegi kirjutas pythoni koodi:

code = '''
x = 'Juulius'
y = 'Tipikas'
z = ' '
nimi = x + z + y
for i in range(2, 5):
    print(f'{nimi} on {i}-kordne luuser.')
print('Keegi ei armasta mind!')
'''

Kes see võis küll olla? Hiljem keegi teine (ka luuser) kirjutas samasse skoopi koodi:

x, y, z = 1, 2, 3 
exec(code)  # Huvitav mida see teeb?
vastus = x + z + y
assert vastus == 6, 'Vastus peab olema: x + z + y = 6'

Miks tõstatub koodi interpreteerimisel erisus AssertionError?

Ülesanne 11:

Kontrolli kas listi

lst_1 = [None, False, 0, {}, [], '', 0j, 0+0j, 0.0, not True]

kõik elemendid omavad tõeväärtust False.

Vihje: Kõik elemendid on juhtumisi triviaalsed Pythoni andmetüüpide esindajad.

Ülesanne 12:

On antud list kujul:

lst = ['a', 'b', '', [], 1.1, 2.1, 3, 8, 3, 8, -8, 2+3j, 8+8j, None, False]

Veendu selles, et:

  1. vähemalt üks listis lst olevatest täisarvudest on paaris;
  2. kõik listis lst olevad paaris täisarvud on positiivsed.

Ülesanne 13:

Vasta ilma interpreteerimiseta, kas allolev kood teostab real 3 oleva funktsiooni print väljakutse.

nimi = 'Mary'
assert nimi == 'Mari', f'Nimi on {nimi} see peaks olema Mari.'
print(f'Minu nimi on {nimi}.')

Interpreteeri eelolev lähtekood. Seleta konsooli väljastatud tulemus.

Ülesanne 14:

Kasuta loengus tutvustatud dekoraatorit cacheit ning rakenda seda funktsioonile mis leiab arvu faktoriaali rekursiivselt. Rekursiivne faktoriaali eeskiri ja funktsioon on kujul:

def recursive_factorial(n):
    if n <= 1:
        return 1
    return recursive_factorial(n - 1) * n

Veendu, et dekoraator töötab.

Ülesanne 15:

Kontrolli allolevate funktsioonide fib ja rec_fib töökorrektsust kasutades võtmesõna assert ning tingimust:

fib(n) = rec_fib(n) = <tulem>

Teosta kontroll vähemalt kolme n väärtuse korral. Etteantud funktsioonid fib ja rec_fib on kujul:

def fib(n):
    '''Leian fibonacci n-da jada liikme.'''
    if n <= 2:
        return 1
    f1 = f2 = 1
    for i in range(n - 2):
        f1, f2 = f2, f1 + f2
    return f2

def rec_fib(n):
    '''Leiab n-da fibonacci jada liikme rekursiivselt.'''
    if n <= 2:
        return 1
    return rec_fib(n - 2) + rec_fib(n - 1)

Soovitus: Loo funktsioon.

Ülesanne 16:

Kasuta funktsiooni sulundi (function closure) konstruktsiooni. Loo funktsioon salasona kuhu on sulustatud parool: Parool123456.

Oodatav tulemus: Väljakutse salasona() peab printima konsooli parooli Parool123456.

Ülesanne 17:

Defineeri funktsioon mis leiab sellele etteantud kolme arvu summa. Loo dekoraator mis muudab äsjamainitud funktsioonile etteantud negatiivsed argumendid positiivseks. Mis tähendab, et dekoreeritud funktsioon leiab arvude absoluutväärtuste summa.

Ülesanne 18:

Defineeri funktsioon mis leiab sellele etteantud teadmata arvu arvude summa. Loo dekoraator mis muudab äsjamainitud funktsioonile etteantud negatiivsed argumendid positiivseks. Mis tähendab, et dekoreeritud funktsioon leiab etteantud arvude absoluutväärtuste summa.

Ülesanne 19:*

Kasutades funktsiooni sulundi (function closure) konstruktsiooni. Loo funktsioon korrutaja_arvuga(<number>) mis omakorda väljastab sellesse pesastatud arvuga arv korrutava funktsiooni ja sulustatud argumendi arv väärtuse.

Seo pesastatud funktsioon funktsiooninimedega korruta_neljaga ja korruta_viiega nii, te allolevad neli rida koodi töötaks nagu loodetud:

korruta_neljaga = korrutaja_arvuga(4)
korruta_viiega = korrutaja_arvuga(5)

print('4 * 9 =', korruta_neljaga(9))  # --> 4 * 9 = 36
print('5 * 9 =', korruta_viiega(9))   # --> 5 * 9 = 45

Seega viimased kaks rida peavad genereerima konsooli tulemuse kujul:

4 * 9 = 36
5 * 9 = 45

Programm peab teostama korrutustehted $4 \cdot 9$ ja $5 \cdot 9$ automaatselt.

Ülesanne 20:

Kasutades pesastatud for tsüklit ja eelmises ülesandes loodud funktsiooni korrutaja_arvuga genereeri uued korrutustehteid teostavad funktsioonid ning kasuta neid korrutustabeli trükkimiseks.

Oodatav tulemus:

1 * 1 = 1
2 * 1 = 2
3 * 1 = 3
4 * 1 = 4
5 * 1 = 5
6 * 1 = 6
7 * 1 = 7
8 * 1 = 8
9 * 1 = 9

1 * 2 = 2
2 * 2 = 4
3 * 2 = 6
4 * 2 = 8
5 * 2 = 10
6 * 2 = 12
7 * 2 = 14
8 * 2 = 16
9 * 2 = 18

jne.

Ülesanne 21:

Kasutades funktsiooni map teisenda loendis ilm toodu temperatuuriskaala ${}^\circ F \to {}^\circ C$. Esita loend samas vormingus. Teisenduse tegemiseks kasuta valemit: $${}^\circ C = \frac{5 ({}^\circ F- 32)}{9}.$$

Andmed kus temperatuur on esitatud Fahrenheitides on kujul:

ilm = [('Tallinn', 47),
       ('Riiga', 41),
       ('Helsinki', 40),
       ('Stockholm', 39)]

Ülesanne 22:*

Järjesta kasvavalt loendis planeedid olevad ennikud kolmanda tulba järgi. Kasuta funktsiooni sorted nimega argumenti key. Etteantud loend:

planeedid = [
    ('Mercury', 0.382,  0.06),
    ('Venus',   0.949,  0.82),
    ('Earth',   1.00,   1.00),
    ('Mars',    0.532,  0.11),
    ('Jupiter', 11.209, 317.8),
    ('Saturn',  9.449,  95.2),
    ('Uranus',  4.007,  14.6),
    ('Neptune', 3.883,  17.2)]

Teine tulp on planeedi diameeter mis on normeeritud planeedi Maa diameetrile ja kolmas tulp on planeedi mass mis on normeeritud planeedi Maa massile.

Ülesanne 23:

Defineeri funktsioon mis leiab sellele meelevaldse arvu etteantud numbrite summa. Loo dekoraator mis eemaldab äsjamainitud funktsioonile etteantud positiivsed arvud kui negatiivseid on rohkem ja vastupidi. Juhul kui positiivseid ja negatiivseid argumente on võrdne arv eemaldab dekoraator kõik argumendid. Arv null pole ei positiivne ega negatiivne.

















☻   ☻   ☻