Sisend ja väljund

From Wikiversity

< 2. nädala teemad

Sisend- ja väljundlaused on ettenähtud (nagu nimigi ütleb) algandmete edastamiseks programmi käsutusse ja tulemuste väljatrükkimiseks. Selleks, et programm oleks interaktiivne, et kasutaja saaks arvutiga programmi abil suhelda. Lisaks sellele on programmidel teinekord vaja suhelda ka failidega – andmeid lugeda või kirjutada. Sisendi ja väljundi jaoks on tavaliselt programmeerimiskeeltes olemas spetsiaalsed laused ja nagu juba eespool mainitud, kustutakse neid sisendlauseteks ja väljundlauseteks.

Piirdume esialgu sisendiga klaviatuurilt ja väljundiga ekraanile, mida tavatsetakse kutsuda standardsisendiks (standard input, stdin) ja standardväljundiks (standard output, stdout). Nii sisend kui väljund toimub Python-programmis sisefunktsioonide (built-in function) abil. Mõlemal puhul on toimunud muutused võrreldes 2.x versiooniga, mille kohta võib lähemat infot lugeda Pythoni veebist.

Funktsioon print() andmete väljastuseks[edit]

Väljundi trükkimiseks ekraanile kasutatakse sisefunktsiooni print(). Väljatrükitav informatsioon tuleb paigutada print järel sulgudesse. Väljastada saab tekste (stringe), arve ja muutujate väärtuseid. Lisada saab ka reavahetusi ja täiendavat vormindust - näiteks määrata komakohtade arvu. Väljastatav tekst pannakse kas jutumärkide või ülakomade vahele (sel teel tekib stringkonstant ja ta on eristatav muutuja nimest). Järgnevate näidete toimimist tasub ise järgi proovida: kopeeri tekst Pythoni töökeskkonda, salvesta ja käivita (F5).

Näide 1

# väljastatakse tekst Tere talv! jutumärkideta
print("Tere talv!")

Välja trükitakse:

Tere talv!

Näide 2

# sõnad Tere ja talv! On eraldi ridadel (vahele on väljastatud reavahetus)
print("Tere\ntalv!")

Välja trükitakse:

Tere
talv!

Sümbol \n tähendab reavahetust (ka mitmes teises keeles, nt C-s). Ükskõik kuhu väljatrükilauses see lisatakse, on tulemuseks reavahetus ekraanile jõudvas tekstis. Sellest jätame meelde, et reavahetus on samamoodi trükitav märk, nagu suvaline täht või number. Ilma seda eraldi märkimata lisatakse Pythonis reavahetus print()-funktsiooniga väljastatava info lõppu.

Väljundlausega kaasnevat automaatset reavahetust saab vältida end-parameetri lisamisega. Järgnevas näites lisatakse väljundi viimaseks sümboliks reavahetuse asemel tühik. Sel viisil jääb väljundpunkt ekraanil viimati trükitud rea lõppu (näiteks selleks, et järgmise print()-käsuga samalt realt edasi trükkida.

print("Tere talv!", end=" ")

Väljundisse tühja rea saamiseks sobib kirjutada ka lihtsalt:

print()

Mitme väärtuse väljastamiseks ühe print()-lausega saab kõik väljundi osad eraldada üksteisest komadega. Sellisel viisil tekib loetelu (nagu eesti keeleski). Iga koma tekitab väljundisse täiendava tühiku. Soovides tühikut vältida (või panna selle asemel mõni teine sümbol), võib lisada print()-funktsiooni sep-parameetri. Järgnevas näites antakse sep-parameetrile väärtuseks tühi string (so tekst, milles pole ühtegi sümbolit). Seetõttu lisatakse ka sõnade Tere ja talv! vahele tühi string ehk sisuliselt mitte nidagi.

Näide 3

# Väljastatavas tekstis on kaks osa, nende vahele ei trükita tühikut
print("Tere","talv!", sep="")

Välja trükitakse:

Teretalv!

Lisaks tekstidele tuleb tavaliselt väljastada vastuseid või teisi programmi töö tulemusi, mis reeglina paiknevad muutuja(te)s. Muutuja väärtuse väljastamiseks kirjutatakse sulgudesse muutuja nimi.

Näide 4

#Järgnev programm väljastab muutuja arv väärtuse
arv = 12         # See on omistuslause, mille abil muutuja arv saab väärtuseks 12
print("Leitud vastus on",arv,".")

Välja trükitakse:

Leitud vastus on 12 .

Täiendavalt saab print()-funktsioonis kasutada vormindusümboleid ja märki %. Sellisel viisil saab kõige täpsemalt juhtida väljundi kuju. Järgnevas näites moodustatakse kogu väljund ühe stringi abil ning kohad muutujate väärtuste trükkimiseks näidatakse ette vormindussümboleid (antud näites %d) kasutades.

Näide 5

# tekstis asendatakse vormindussümbolid (%d ja %s) lause lõppu lisatud muutujate väärtustega
# järgnevad kaks rida on omistuslaused, kus tekitatakse muutujad arv ja sona
arv = 13
sona = "kuraditosin"
print ("Arvu %d nimetatakse ka %s." % (arv, sona))

Välja trükitakse:

Arvu 13 nimetatakse ka kuraditosin.

Vormindussümbolite tähendused on järgmised:

%s
asendatakse teksti ehk stringiga. Stringi vormindamine väljundis peaks järgnevates Pythoni versioonides kaduma ja asemele tulevad stringi kui klassi vormindusvõimalused. Vähemalt nii väidab teooria.
%d
asendatakse täisarvuga (decimal)
%f
asendatakse ujukomaarvuga (float)

Sarnaselt viimasele näitele saab välja trükkida ka mitut programmi poolt leitud väärtust. Et tulemused on tavaliselt muutujates, siis kombineeritakse väljundlauses teksti vastuse arusaadavaks sõnastamiseks ning muutujate väärtuseid, mis tegelikku vastust sisaldavad.

Näide 6

# muutujale antakse väärtus, seejärel trükitakse see välja ujukomaarvuna ning tema ruut täisarvuna
arv = 12     # Omistuslause, mille läbi muutuja arv saab väärtuseks 12
print("Arvu %10.2f ruut on %10d." % (arv, arv**2))

Välja trükitakse:

>>> 
Arvu      12.00 ruut on        144.

Eelpool toodud vormidussümbolid lubavad väljundit ka täiendavat vormindada. Esimese võimalusena võiks kasutada ujukomaarvude ümardamist sobiva arvu komakohtadeni. Üldiselt on mõistlik arvutada alati nii täpsete arvudega, kui seda kasutatav andmetüüp lubab (st mitte hakata vahepeal midagi ümardama - milleks on olemas round()-funktsioon - loe lähemalt Pythoni veebist). Ja väljundlaused annavad tihti lisavõimaluse nt sobiva arvu väljastatavate komakohtade määramiseks.

Näide 7

# muutujale antakse mitme komakohaga väärtus, seejärel trükitakse see välja kogu hiilguses 
# ja edasi täpsusega kolm kohta peale koma
arv = 13.45685343634636
print ("Kolme kohani ümardatult näeb arv %f selline %0.3f" % (arv,arv))

Välja trükitakse:

Kolme kohani ümardatult näeb arv 13.45685343634636 selline 13.457

Väljundvormingu määramiseks saab kasutada % ja f vahel kahte arvu: enne punkti (.) olev arv näitab väljundvälja laiust. Kui väljund on pikem kui väli, ei jää siiski midagi trükkimata (eelnevas näites on välja laiuseks 0). Pikema välja puhul jäetakse ette täiendavad tühikud. Järgnevas näites on neid 5 - üks tänu sellele, et see on väljundstringi kirjutatud ning ülejäänud 4 määratud väljalaiuse tõttu (6 positsiooni arvu jaoks ja ülejäänud 4 tühikutena)

Näide 8

# muutujale antakse mitme komakohaga väärtus, seejärel trükitakse see välja
# täpsusega kolm kohta peale koma
arv = 13.45685343634636
print ("Kolme kohani ümardatult näeb arv %f selline %10.3f" % (arv,arv))

Välja trükitakse:

Kolme kohani ümardatult näeb arv 13.45685343634636 selline     13.457
                                                          ^^^^^^^^^^

Komakohti ei saa määrata stringidele ja täisarvudele. Samas näitaks vorminduskäsk: %0.2d seda, et täisarvu kuvatakse alati kahekohalisena – nt 02. Kasutatav võiks olla selline võimalus näiteks kellaaegade väljatrükkimisel.

Funktsioon input() andmete sisestuseks[edit]

Andmete sisseküsimiseks saab kasutada funktsiooni input(). Funktsiooniga saab väljastada ekraanile küsimuse (ik prompt, ek viip), mis peaks loogiliselt sisendile eelnema (nt "Sisesta kolmnurga kõrgus"). Viip (küsimus) kirjutatakse input() järel sulgudesse stringina ja lastakse sisestada küsitud väärtus. Väärtuse saab endale muutuja ja see on alati stringi tüüpi. Järgnevalt on teisendusfunktsioone kasutades võimalik sisendi tüüpi muuta (teha ta nt tekstist arvuks). Näiteks selleks, et rehkendada saaks.

Järgnevas näites küsitakse kasutajalt tema nime ja seejärel trükitakse see ekraanile. Vahepeal on nimi muutujas minu_nimi.

Näide 1

# Nime küsimine ja väljatrükk
minu_nimi = input("Mis su nimi on? ")
print ("Tere",minu_nimi,". Lahe nimi sul. Sinuga oli tore tutvuda!")

Dialoog ekraanil

>>> 
Mis su nimi on? Maali
Tere Maali . Lahe nimi sul. Sinuga oli tore tutvuda!
>>> 

Järmine näide kasutab tervituse väljatrükkimiseks vormindussümbolitega varianti.

Näide 2

# Nime küsimine ja väljatrükk koos vormindusega
minu_nimi = input("Mis su nimi on? ")
print ("Tere %s. Lahe nimi sul. Sinuga oli tore tutvuda!" % (minu_nimi))

Väljatrükk

Mis su nimi on? Maali
Tere Maali. Lahe nimi sul. Sinuga oli tore tutvuda!

Millist erinevust märkad 1. ja 2. näite väljundis? Kuidas saada lahti ühest trükitehniliselt vales kohas paiknevast tühikust esimese näite juures? Viimasele küsimusele vastuse leidmiseks loe print()-funktsiooni peatükist infot sep-parameetri kohta.

Kui sisestatud väärtusega on vaja pärast rehkendada, tuleb string teisendada arvuks. Selleks sobivad funktsioonid int() ja float(). Esimene nendest teeb stringi täisarvuks, teine komakohaga arvuks. Funktsioon eval() vaatab aga ise, kas tegemist on komakohaga arvuga või täisarvuga ning käitub teisendades vastavalt. See tundub olevat mugav, kuid funktsiooni halvaks küljeks on see, et ta püüab talle parameetritena etteantud infot täita - näiteks lause summa = eval("3+5") tulemusena on muutujas summa väärtus 8. Seega võib osutuda funktsiooni eval() kasutamine ebaturvaliseks.

Järgnevas veidi pikemas näites sisestatakse 2 arvu ja väljastatakse nende summa. Kopeeri kood Pythoni töökeskkonda, salvesta ja käivita. Milline on vastus? Kas see tõesti on õige??

Näide 3

# Küsitakse 2 arvu, liidetakse ja väljastatakse summa
# arv1, arv2 - liidetavad arvud
# summa - arvude summa
arv1 = input("Sisesta 1. arv ")
arv2 = input("Sisesta 2. arv ")
summa = arv1 + arv2
print ("Arvude summa on %s." % summa)

Väljund tuleb selline ... ausõna

>>> 
Sisesta 1. arv 12
Sisesta 2. arv 34
Arvude summa on 1234.

Kas tõesti arvuti ei oska arvutada? Oskab küll, kuid antud näites on unustatud sisendist tulnud tekti teisendada ja seepärast liidetakse kaks stringi. Stringide liitmine tähendab nende kokkuühendamist ("või" + "lill" tulemuseks on "võilill"). Et arvuti õigesti liitma panna, tuleb sisendit teisendada. Võib teisendada otse enne liitmist: summa = int(arv1) + int(arv2)

Kuna stringmuutujatega arv1 ja arv2 ei ole suure tõenäosusega rohkem midagi teha, võib teisendada ka kohe sisestamise käigus: arv1 = int(input("Sisesta 1. arv "))

Näide 4

# Programm liidab peale täisarvuks teisendamist arvud kokku ja väljatab vatuse.
arv1 = int(input("Sisesta 1. arv "))
arv2 = int(input("Sisesta 2. arv "))
summa = arv1 + arv2
print ("Arvude summa on",summa)

Seda varianti soovitakski kasutama hakata. Eelnevalt tuleb selgeks mõelda, kas sisend on pigem ujukomaarv või täisarv. Ning sellele vastavalt ka teisendada.

Eelmisest näitest on näha ka olukord, kus kaks funktsiooni on nö üksteise sisse paigutatud. Sisestamisfunktsioonist input() saadud väärtus suunatakse otse teisendusfunktsiooni int().

Funktsiooni input() saab kasutada ka selleks, et programmi täitmist peatada kuni vajutatakse Enter-klahvi. Näiteks võimaldab see pikema väljundi korral seda osadena väljastada ja lugeda. Kui programmi käsurealt käivitada, sulgub töötava programmi aken peale töö lõppu. input() lisamine programmi lõppu peatab programmi täitmise, Enter lõpetab programmi töö ja aken sulgub.

< 2. nädala teemad