Järjendid ja tsükkel. Failist järjendisse lugemine
Järjendi üksiku elemendi kasutamine
Tegutseme nüüd järjendi konkreetse elemendiga. Võtame näiteks järjendi a = [12, 23, 34, 45, 56]
elemendi, mille indeks on 3. Näeme, et a[3]
väärtus on 45. Me võime elementi a[3]
(ja samalaadselt kõiki teisi elemente) kasutada küllaltki iseseisvana. Näiteks saame neid kasutada avaldistes või muuta nende väärtusi:
a = [12, 23, 34, 45, 56] print(a[3]) print(type(a[3])) print(a[3] - 32) a[3] = 1 print(a[3])
Me näeme, et indeksi võib leida ka arvutuse tulemusena. Oluline on vaid tagada, et indeks ei jääks järjendi piiridest väljapoole.
Järjend ja while-tsükkel
Järjendi struktuurist on eriti kasu juhul, kui me tahame selle elemente (või mingit osa neist) üheskoos kasutada.
Olgu meil ülesandeks trükkida järjendi kõik elemendid järjestikustele ridadele. Selgelt on see tsükliline tegevus, milleks saame kasutada while-tsüklit:
a = [12, 23, 34, 45, 56] i = 0 while i < len(a): print(a[i]) i += 1
Kuna viimase elemendi indeks on ühe võrra väiksem kui järjendi pikkus, siis on selline tsükli tingimus sobiv.
Olgu meil uus ülesanne: nullida kõik elemendid, mille väärtus on suurem kui 30:
a = [12, 23, 34, 45, 56] i = 0 while i < len(a): if a[i] > 30: a[i] = 0 i += 1 print(a)
Järjend ja for-tsükkel
Sageli on meil vaja järjendit just elementhaaval töödelda. Selle jaoks on sobiv for-tsükkel, mis võtab igal sammul fookusesse järjendi ühe elemendi.
a = [12, 23, 34, 45, 56] for el in a: # el asemel on ka teised nimed lubatud print(el)
Joonis 1. For-tsükliga elementide väljastamine
Muutuja el
saab igal tsükli sammul väärtuseks järjendi a
järgmise elemendi. Olemuselt on for-tsükkel while-tsükliga sarnane. Esimesel real on päis, mis määrab, millal tsükkel lõpetatakse. Järgneb taandreaga määratud keha (ehk sisu), mida igal sammul täidetakse. Tsüklit korratakse niipalju kordi, kui järjendis on elemente.
Muutuja el
kaudu ei saa muuta järjendi elementide väärtusi. Kui püüda teha ülaltoodud teisele while-tsüklile analoogi, siis nii jääb a
muutmata:
a = [12, 23, 34, 45, 56] for el in a: if el > 30: el = 0 print(a)
Joonis 2. For-tsükkel, mis ei muuda järjendit
Mitmetes programmeerimiskeeltes on for-tsükkel teistsugune ja Pythoni for-tsüklile sarnast nimetatakse hoopis for-each-tsükliks.
Muidugi saab erinevates kohtades kasutada muutujaid. Olgu meil ülesandeks teha programm, mis küsib kasutajalt kaks täisarvu. Seejärel kirjutab ekraanile alates esimesest arvust üle ühe kõik täisarvud kuni teise arvuni (seda mitte kaasates). Lisaks arvutatakse kõigi väljastatud arvude korrutis.
Näiteks kui sisestatakse 4 ja 12, siis ekraanile väljastatakse:
>>> 4 6 8 10 Korrutis on 1920
Üks võimalik lahendus on selline. Korrutise puhul ei sobi algväärtuseks 0, sest korrutamine seda ei muudaks.
Näiteprogramm. Arvude väljastamine ja korrutamine
algus = int(input("Sisestage esimene arv ")) lõpp = int(input("Sisestage teine arv ")) korrutis = 1 for i in range(algus, lõpp, 2): print(i) korrutis *= i print("Korrutis on " + str(korrutis))
Failist järjendisse lugemine
Readline
ja readlines
Eelmises peatükis õppisime, kuidas for-tsükliga faili lugeda. Veel kaks funktsiooni on readline
ja readlines
. readline
loeb failist ühe rea. See võib kasulik olla, kui teame, mis failis on, et sealt ainult rida lugeda. Veel on käsk readlines
, mis loeb kõik failis olevad read ja salvestab nad järjendina.
Kasutame teksitifaili andmed.txt.
Taavi Mia Karl Sirli 314
fail = open("andmed.txt") andmed = fail.readlines() print(andmed) fail.close()
Ekraanile väljastatakse: ['Taavi\n', 'Mia\n', 'Karl\n', 'Sirli\n', '314']
Nagu näeme, siis järjendis on elemendid sõne kujul, kus viimane element on \n
, mis tähistab realõppu. Tuleb meeles hoida, et elemente töödeldes realõpumärk eemaldada.
Tsükliga failist järjendisse lugemine
Üks kasulik oskus on failist rida haaval järjendisse lugemine. Oletame, et meil on fail andmed.txt nädala temperatuuridega, kus on igal real vastava päeva keskmine temperatuur (ujukoma arv):
10.5 11.2 12.3 9.5 7.8 10.6 10.7
Kui meil on soov need temperatuurid järjendisse temperatuurid
lugeda, siis saame selleks kasutada konstruktsiooni for rida in fail
. Seejuures peame arvestama, et kuna failist lugedes on tegemist sõnedega, siis tuleb meil enne järjendisse lisamist käsuga append
need read teisendada ujukoma (float) tüüpi.
temperatuurid = [] fail = open("andmed.txt") for rida in fail: temperatuurid.append(float(rida)) fail.close() print(temperatuurid)
Eelnev programm väljastab ekraanile:
[10.5, 11.2, 12.3, 9.5, 7.8, 10.6, 10.7]
Tsükliga failist rea järjendisse lugemine
Kui meil on ühel real mitu elementi, mida tahaks järjendisse lugeda, siis saame rea tükkideks lõikamiseks kasutada funktsiooni split
.
Näiteks, kui meil on failis arvud.txt ühel real päeva miinimum- ja maksimumtemperatuurid:
5.0 15.2 6.2 12.4 7.2 12.3 5.1 10.5 4.8 9.5 4.5 10.8 6.2 12.5
Siis saame lugeda andmed failist programmi sarnaselt eelmisele näitele, aga ühe rea saame tükkideks lüüa ja järjendisse panna käsklusega split()
. Kui meil oleks elementide vahel näiteks semikoolon, siis saaksime kasutada käsklust split(";")
, aga vaikimis tükeldab see funktsioon sõne tühikute kohalt.
fail = open("arvud.txt") for rida in fail: osad = rida.split() print(round(float(osad[1]) - float(osad[0]),1)) fail.close()
Katseta! Püüa aru saada, mis selle programmiga ekraanile väljastatakse?
Järjendi ja funktsiooni video
Enesekontroll