Tingimuslause
Peaaegu kõikides mittetriviaalsetes programmides tuleb mingil hetkel teha valik, kas jätkata üht- või teistmoodi. Python võimaldab programmeerijal taolised dilemmad panna kirja tingimuslause ehk valikulause ehk if-lause abil.
Tingimuslaused tagastavad meile alati ainult jah või ei, ehk programmi enda jaoks saab ta vaste True või False.
vanus = 25 if vanus >= 18: # See lause kontrollib, kas inimene on 18 või vanem print("Oled piisavalt vana, et autoga sõita!") else: #See viiakse ellu kui if-lause tingimus ei vastanud tõele print("Pead veel ootama!")
Antud näites on mõlemas tingimuslause harus vaid üks käsk, aga neid võib seal olla ka rohkem.
Tingimuslause komponendid on päis ehk tingimus, mis käib if-lause juurde, jah-haru, mis viiakse täide kui päis vastab tõele (paremale nihutatud) ning else-haru, mis viiakse ellu kui päis tagastab False (jällegi paremale nihutatud).
Tingimusi saab (muuhulgas) moodustada järgmiste operaatoritega:
- <, >, <=, >= sobivad arvude võrdlemiseks;
- topeltvõrdusmärk (==) tähistab võrdsust nii arvude kui ka sõnede puhul;
- != tähistab mittevõrdsust nii arvude kui ka sõnede puhul.
Märkus! Ära unusta, et üksikut võrdusmärki (=) kasutatakse Pythonis muutujale väärtuse omistamiseks, seetõttu on võrdsuse kontrollimiseks ette nähtud topeltvõrdusmärk (==).
Treppimine
if-lause kasutamisel tuleb arvesse võtta Pyhoni süntaksit, ehk rõhku tuleb panna tühikutega joondamisele ehk treppimisele, sest vastasel juhul loeb arvuti koodi valesti või ei suuda seda üldse lugeda. Nii saab ära määrata, mis käsud kuuluvad tingimuslausete juurde.
arv = int(input("Mis on su lemmiknumber?")) if arv % 2 == 0: # Kontrollib, kas arvutustehe on korrektne print("Sinu lemmiknumber jagub 2-ga!") print("Tegu on paarisarvuga!") else: print("Sinu lemmiknumber ei jagu 2-ga!") print("Tegu on paaritu arvuga!") print("Head aega!")
Näites kuuluvad tingimuslause jah-harusse laused print("Sinu lemmiknumber jagub 2-ga!") ja print("Tegu on paarisarvuga!") ning else-harusse laused print("Sinu lemmiknumber ei jagu 2-ga!") ja print("Tegu on paaritu arvuga!").
Mis väljastatakse sisendi 14 korral?
Programmi viimane rida ei ole trepitud ja selle pärast ei kuulu ta tingimuslause juurde, vaid kutsutakse välja igal juhul. Mis juhtuks kui viimase rea ette panna 4 tühikut?
Hiljem tuleb välja, et treppimise oskust on vaja ka paljudes muudes Pythoni konstruktsioonides. Põhimõte on, et sama kaugele joondatud read moodustava mingi ploki ehk terviku. Plokke võib tekkida palju erinevaid.
NB! Trepitud plokile eelnev rida lõpeb alati kooloniga (see on Pythonile lisakinnituseks, et programmeerija soovib järgmisel real alustada trepitud plokki). Katsetus Proovi järele, kuidas Python käitub, kui unustad kasutada koolonit või jätad ära mõne taandrea. Sellega saad end taoliseks situatsiooniks juba ette valmistada. Märkus Kuigi Python on treppimise osas võrdlemisi paindlik, tuleks segaduste vältimiseks alati kasutada joondamiseks 4 tühikut. Thonnys kirjutades võib treppimiseks vajutada ka TAB klahvi – keskkond genereerib sellepeale TAB sümboli asemel 4 tühikut. Tegelikult pole enamasti vaja isegi TAB klahvi kasutada – kui vajutada kooloniga lõppeval real uue rea saamiseks ENTER-it, taipab redaktor ise, et järgmine rida tuleb treppida ja lisab uue rea algusesse vajaliku arvu tühikuid. Ka järgmistele ridadele pannakse usinalt tühikud ette. Andmaks märku, et uus rida enam tingimuse alla ei kuulu, tuleb need tühikud ära kustutada ja alustada käsu kirjutamist jälle ekraani vasakust servast.
Mitmeharuline tingimuslause
Vahepeal võib programmeerides ette tulla olukordi, kus meil on vaja kontrollida mitmeid erinevaid tingimusi. Selle jaoks ei ole enam mõttekas kirjutada mitut erinevat if-lauset, sest see võtaks rohkem aega ja muudaks koodi segasemaks.
Oletame, et kuulus korvpallur tahab ära anda enda pusa, mille suurus on M. Ta tahab kindel olla, et loosis saaksid osaleda ainult inimesed, kellele see pusa paras on. Ta loob kiiresti sellise programmi
minu_Suurus = input("Mis suuruses pusasid sa kannad(L,M,S)? ") if minu_Suurus == "L": print("Pusa on sulle liiga väike!") else: if minu_Suurus =="M": print("Pusa on sulle paras!") else: if minu_Suurus =="S": print("Pusa on sulle liiga suur!")
Selline kirjapilt võib aga minna trepina liiga paremale, kui tekib vajadus palju asju kontrollida. Selle jaoks on loodud Pythonisse elif, mis on olemuse poolest kombinatsioon else-st ja if-ist. Sellise koodi saaks kirjutada hoopis kergemalt.
minu_Suurus = input("Mis suuruses pusasid sa kannad(L,M,S)? ") if minu_Suurus == "L": print("Pusa on sulle liiga väike!") elif minu_Suurus =="M": print("Pusa on sulle paras!") elif minu_Suurus =="S": print("Pusa on sulle liiga suur!")
Mitmeosaline tingimus
Mõnikord on meil koodis vaja kontrollida mitut erinevat tingimust. Selliseid tingimusi saab kergelt esitada loogiliste tehete abil. Programmeerimise olulisemad loogilised tehted on and, or ning not, mis võivad tuttavad olla juba matemaatilisest maailmapildist. Neid tehteid kasutades moodustub if-lause päisesse loogiline avaldis, millel on kindel tõeväärus True või False.
Nüüd tuleb näide, kuidas seda Pythonis küsida.
vanus = 32 load = False if vanus >= 18 and load == True: print("Luba sõita!") else: print("Lõpp!")
Mis tulemus väljastatakse ekraanile?
Tegelikult kui if-lausega kontrollitakse boolean-tüüpi argumenti, siis ei ole vaja kirjutada võrdusmärke, sest tal endal on juba tõeväärtus. Ehk antud näite saaks kirjutada ka selliselt:
vanus = 32 load = False if vanus >= 18 and load: print("Luba sõita!") else: print("Lõpp!")
Failist lugemine reakaupa
Nüüd õpime ära ühe viisi tekstifailidest sisendi lugemiseks. Alustuseks koosta ja salvesta tekstifail nimega andmed.txt, mille esimesel real on inimese nimi, teisel real vanus (täisarvuna) ning kolmandal real e-maili aadress (lihtsuse mõttes ära praegu täpitähti kasuta). NB! See peab olema plain-text kujul, st Wordi fail ei sobi, faili võib luua Thonnys. Seejärel salvesta loodud failiga samasse kausta järgnev Pythoni programm ning käivita see.
f = open('andmed.txt') nimi = f.readline() vanus = f.readline() aadress = f.readline() print("Nimi:", nimi) print("Vanus:", vanus, "aastat") print("Aadress:", aadress) f.close()
Selgituseks
- Käsk open otsib failisüsteemist üles soovitud faili ja tagastab viite sellele (antud näites salvestasime selle viite muutujasse f, mis on levinud nimi failide tähistamiseks). NB! Kui on antud ainult failinimi ilma teeta, siis otsitakse seda ainult sellest kaustast, kus asub skript.
- Avaldis f.readline() loeb failist ühe rea ning annab selle sõnena. See käsk liigutab edasi ka failist lugemise järjehoidjat, st järgmisel korral sama käsku kasutades loetakse järgmine rida. See käsk on kaunis sarnane input käsuga, kuna kummalgi juhul ei tea me programmi kirjutades, millise konkreetse väärtuse me tulemuseks saame.
- f.close() ütleb failisüsteemile, et me oleme selle faili kasutamise lõpetanud.
Kui seda programmi katsetad, siis märkad, et väljundis tekib iga sisestatud andmejupi järele üks üleliigne tühi rida. Põhjus on just selles, et failist lugedes jäetakse iga rea lõppu alles ka reavahetuse sümbol (faili viimase rea puhul võib see puududa vastavalt sellele, kas failis on viimase rea lõpus reavahetus või mitte). Käsk print lisab omaltpoolt veel ühe reavahetuse.
Märkus
Kui Python ütleb sulle (Windowsi arvutis), et ta ei leia faili, aga sa oled veendunud, et fail on õiges kaustas olemas, siis tuleks kontrollida, ega failinimele pole saanud eksikombel kaks faililaiendit. Segadust võib tekitada asjaolu, et Windows Explorer varjab vaikimisi teatud faililaiendid.
Kõige kindlam on muuta Windowsi seadeid nii, et alati näidataks kõiki faililaiendeid. Selleks tuleks Windows Exploreris valida menüüribalt Tools -> Folder options… (kui menüüriba pole näha, siis vajutada korraks klahvi Alt). Avanenud dialoogis vali lehekülg View ning eemalda linnuke valiku Hide extensions for known file types eest.
Märkus
Kui proovid lugeda sisse täpitähtedega teksti, siis võib juhtuda, et saad veateate UnicodeDecodeError. Sel juhul tuleks open käsu rakendamisel öelda, millises kodeeringus on sinu tekst, nt open('andmed.txt', encoding='UTF-8'). 'UTF-8' asemel võid proovida ka 'cp1257'.
NB! Üleliigse reavahetuse saab ära võtta kasutades funktsiooni strip() näiteks selliselt: nimi = f.readline().strip(). Arvude puhul piisab arvuks teisendamisest näiteks täisarvu puhul selliselt vanus = int(f.readline()).