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.
Ü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']
- Filtreeri välja sõned ja järjesta need uues listis tähestikulisse järjekorda, prindi loodud list konsooli.
- 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:
['g', 'x', 'y']
[-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:
- vähemalt üks listis
lst
olevatest täisarvudest on paaris; - 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.