Tingimuslause

Tingimus- ehk valikulaused võimaldavad etteantud tingimuse alusel programmikoodi üht või mitu rida (koodi plokki) valikuliselt täita. Tingimuslause sisu/loogikat aitab tajuda järgmine reaaleluline lausend: kui vihma sajab, siis võta vihmavari kaasa. Programmeerimises on tingimuseks loogikaavaldis. Lihtsaimad loogikaavaldised on tõeväärtused (True või False) ja (kahe operandiga) võrdlused (nt a > b või c == d) Tingimuslausete esitamisel kasutatakse kindlat tekstilist struktuuri ehk süntaksit, mis algab tüüpiliselt võtmesõnaga if.

Siin on katsetamiseks soovitav kasutada interaktiivset interpretaatorit (IDLE) - loe pydocist kasutamise kohta.

Tõeväärtused

Tõeväärtused ehk bool tüüpi andmed saavad omadada ainult väärtusi True või False. Kui ei kirjuta tõeväärtust korrektselt suure algustähega, siis antakse veateade.

>>> a = True
>>> a
True
>>> b = true
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'true' is not defined
>>> False
False

Võrdluse operaatorid

Võrdluse operaatorid võrdlevad kahte väärtust ja annavad tulemuseks True või False.

>>> 15 == 15
True
>>> 2 == 3
False
>>> 5 != 7
True
>>> 5 != 5
False
>>> 3 < 5
True
>>> 4 >= 4
True

== ja != operaatorid toimivad tegelikult kõikide andmetüüpide puhul.

>>> 'hello' == 'hello'
True
>>> 'abc' == 'Abc'
False
>>> 'xy' != 'yx'
True
>>> 123 != '123'
True
>>> 52 == 52.0
True
>>> True != False
True
>>> 1.1 == 1.0
False
>>> 1.0 == 1.000
True

Võrdlusi tuleks läbiviia vaid sama tüüpi väärtustega. Näiteks 123 == '123' annab tulemuseks False, sest võrreldakse omavahel võrreldakse arvu ja sõnet. Samuti tuleb arvestada, et sõnede 'abc' == 'Abc' võrdlus on tõstutundlik.

Operaatorid >, <, >= ja <= toimivad ainult täisarvude ja ujukomaarvudega. Kui teha võrdlus 'a' < 'b'  # -> True, siis tegelikult toimub taustal võrdlus unicode väärtuste vahel ehk ord('a') < ord('b'). ord() kohta saab lugeda siit.

>>> age = 20
>>> age >= 18
True
>>> age < 20
False
>>> age == 20
True

Segamini ei tohi ajada kahte sarnast operaatorit == ja =.

  • == võrdleb kahte väärtust ja tagastab tulemuseks True või False.
  • = omistab paremal oleva väärtuse vasakul olevale muutujale.

Loogikatehted

Pythonis kasutatakse kolme võtmesõna and, or ja not tõeväärtustel opereerimiseks. Sarnaselt võrdlusega on operatsioonide tulemuseks üksainus tõeväärtus. Süvitsi saab nendega tutvuda diskreetses matemaatikas.

Binaarsed loogikatehted and ja or

Operaatorid and ja or vajavad alati kahte kahte tõeväärtust, seega loetakse neid binaarseteks. and on sisendite loogiline korrutamine ehk konjunktsioon ja or on sisendite loogiline liitmine ehk disjunktsioon. and puhul peavad kõik väärtused olema True ja or puhul peab vähemalt üks sisenditest olema True, et tulemus oleks True. Täpsemalt näeb allolevast tabelist.

Tõeväärtustabel:

Sisendid Väljund
A B A or B A and B
False False False False
True False True False
False True True False
True True True True

Unaarne loogikatehe not ehk inversioon

Inversioon on ainuke loogikatehe, mis on ühe sisendiga ehk opereerib vaid ühel tõeväärtusel. Pythonis kasutatakse selleks võtmesõna not. Inversioon teostab inversioonitehte ehk tulemuseks on esialgse eitus.

>>> not True
False
>>> not False
True
>>> not not True
True
>>> not not not not not not False
False

Võimalusel tasuks loogikatehteid alati teisendada lihtsamale kujule.

Loogikatehete ja võrdlustehete kombineerimine

Võrdlustehete tulemuseks on tõeväärtused. Seega annab võrdlustehteid kombineerida loogikatehetega. Meenutuseks: loogikatehted toimivad tõeväärtustel True ja False kasutades võtmesõnu and, or ja not. 2 < 3 on aga võrdlustehe, sest 2 ja 3 pole tõeväärtused.

>>> (2 < 3) and (3 == 3)
True
>>> (2 != 2) or  (1 >= 1)
True
>>> (1 > 2) and (1 < 2)
False

Tehteid teostatakse vasakult paremale. Võib mõelda, et arvuti teostab neid nii:

  • (1 < 3) and (3 == 3)
  • (True) and (3 == 3)
  • (True) and (True)
  • True

Oluline on arvestada tehete järjekorda. Loogikatehetel on järjekord - not -> and -> or. Tehete järjekorra muutmiseks või rõhutamiseks võib alati lisada sulge.

>>> 3 > 5 or not 7 != 7 or 1 + 2 == 4
True
>>> 3 != 2 and not 2 >= 2 and 5 + 1 == 6
False
>>> (not 2 + 4 < 6 or False) and False
False
>>> not 2 + 4 < 6 or False and False
True

== None vs is None

== kontrollib võrdsust kasutades __eq__() meetodit. is kontrollib objektide enda võrdsust (viitavad samale objektile).

Näide:

>>> 1 == True
True
>>> 1 is True
False

Reeglina võib kasutada is None võrdluses ja igal pool mujal ==.

Tingimused

Kõik eelnev on puudutanud tingimusi. Loogikaavaldis on tingimuslause tingimus ehk condition. True ja False abil saab juhtida tingimuslauseid.

Koodiplokk

Tingimuslauses kasutatakse koolonit ja kogu sisu peale tingimust on eristatud taandega. PyCharm ja teised IDE-d lisavad taanded automaatselt, kuid käsitsi saab taanet lisada Tab abil ja seda eemaldada Shift+Tab, kui kursor on rea alguses. Taane on osa Pythoni süntaksist ja seda ei tohi ära jätta. Kogu koodist ei pea siin aru saama, kuid eesmärk on jälgida taanet. Võtmesõnu if-elif-else tutvustatakse allpool.

number = 4
if number < 10:
    print("The number is too small, it should be increased.")
    if number < 5:
        number += 2  # number = number + 2
        print("The number was increased by two.")
    else:
        number += 1
        print("The number was increased by one".format(number))
else:
    print("The number is big enough.")
print("The number is {} now.".format(number))

Võtmesõna if

Kõige lihtsam tingimuslause on moodustatud if tingimusest. Koodiplokk käivitub siis, kui if tingimuses on tõeväärtus True. Kui tõeväärtuseks tuleb False, siis jääb koodiplokk vahele.

name = "Alice"
if name == "Alice":
    print("Hi", name)

if voodiagrammina:

_images/if_flowchart.png

Võtmesõna else

Võtmesõna else on valikuline tingimus, mis lisatakse if järele ja sellele järgnev plokk käivitatakse vaid siis, kui if ja kõik järgnevad (kui on) elif tingimuslausete tõeväärtused on False.

name = "Tim"
if name == "Tim":
    print("Hello", name)
else:
    print("Hello, Stranger")
age = 62
if age < 20:
    print("You are too young.")
elif 20 <= age <= 60:
    print("You may proceed.")
else:
    print("You are too old.")

Võtmesõna elif

Kui soovitakse, et üks mitmest tingimustest käivituks, siis on selleks sobiv kasutatada võtmesõna elif. See on lühike vorm koodist else: if. Kui if ei käivitu, siis kontrollitakse järgmist elif tingimust ja nii kui üks neist on True. Käivituda saab ainult üks plokk.

number = 4
if number > 3:
    print("The number is larger than 3")
elif number <= 3:
    print("The number is smaller or equal to 3")

Kui üks tingimustest on True, siis edasi ei vaadata.

number = 4
if number > 3:
    print("The number is larger than 3")
elif number <= 3:
    print("The number is smaller or equal to 3")
elif number == 4:
    print("The number is 4")
elif number >= 0:
    print("The number is positive")

# out:
# The number is larger than 3

Võrdluseks: kasutades ainult if tingimusi:

number = 4
if number > 3:
    print("The number is larger than 3")
if number <= 3:
    print("The number is smaller or equal to 3")
if number == 4:
    print("The number is 4")
if number >= 0:
    print("The number is positive")

# out:
# The number is larger than 3
# The number is 4
# The number is positive

if-elif-else

Võtmesõna pass on vajalik, kui süntaks nõuab käsku, kuid sisu on tühi.

condition_0, condition_1, condition_2 = False, False, False

if condition_0:
    pass
    # executed if condition_0 is True
elif condition_1:
    pass
    # executed if condition_0 is False and condition_1 is True
elif condition_2:
    pass
    # executed if condition_0 is False and condition_1 is False and condition_2 is True
else:
    pass
    # executed if all previous statements are False

Näited

Tingimuslausetega koodijupp, mis prindib konsooli infot sisestatud numbri kohta.

number = float(input("Enter a number: "))

if number >= 0:
    if number == 0:
        print("The number is zero.")
    else:
        print("The number is positive.")
else:
    print("The number is negative.")

Tingimuslausetega funktsioon, mis esitab kuu sõnena.

def month(n):
    """
    Returns the n-th month of the year as a string
    :param n: month number
    :return: month as string
    """
    if n == 1:
        return "January"
    elif n == 2:
        return "February"
    elif n == 3:
        return "March"
    elif n == 4:
        return "April"
    elif n == 5:
        return "May"
    elif n == 6:
        return "June"
    elif n == 7:
        return "July"
    elif n == 8:
        return "August"
    elif n == 9:
        return "September"
    elif n == 10:
        return "October"
    elif n == 11:
        return "November"
    elif n == 12:
        return "December"
    else:
        return "Incorrect month number."

Stiil

Tihti annab tingimuslauseid lihtustada. Parandame ühe lihtsa funktsiooni stiili.

def is_even(n):
    even = n % 2 == 0
    if even == True:
        return True
    else:
        return False

Kõigepealt võib lihtsutada avaldist even == True. Piisab kui kirjutada lihtsalt even, sest muidu me kontrollime True == True või False == True ehk tulemus sõltubki even tõeväärtusest.

def is_even(n):
    even = n % 2 == 0
    if even:
        return True
    else:
        return False

Kui natuke mõelda, siis saab alljärgnevat tingimust funktsioonides tagastamisel lihtsustada.

if (condition):
    return True
else:
    return False

# return value correlates with condition value, so we can simplify:
return condition

Meie näite puhul siis:

def is_even(n):
    even = n % 2 == 0
    return even

Lisame ka korraliku Docstringi ja muutuja even ei anna meile hetkel palju juurde, seega võib selle eemaldada.

def is_even(n):
    """
    Checks if the number is even.
    :param n: number to check
    :return: True if even, else False
    """
    return n % 2 == 0

Saime esialgsega võrreldes palju puhtama ja loetavama koodi.

Pythonis on kõik “tühi” tõeväärtusega False ja “mittetühi” True. if ehk bool kontekstis on Pythonis False väärtusega:

  • False
  • None
  • tühjad sõned - '' and ""
  • tühjad konteinerid - tühi list, tühi dict, tühi tuple, jne
  • numbrilised väärtused, mis on võrdsed nulliga - 0, 0.0, -0.0
  • pythoni objektid, mis implementeerivad __bool__ tagastama False või 0
  • pythoni objektid, mis ei implementeeri __bool__, kuid __len__ tagastab 0

Kõike muud peetakse pythonis if juures True-ks.

if not []:  # [] -> False
    print("List is empty.")

if [1, 2, 3]:  # [1, 2, 3] -> True
    print("List has elements.")
>>> bool({})
False
>>> bool({"a": 2})
True
>>> bool(1,)
True
>>> bool(())
False
>>> bool('')
False

Alljärgnevat on hea teada, kuid sellise koodi kirjutamine võib vähendada koodi loetavust.

# python

if 100:
    print("True")

if not 0:
    print("True")
>>> bool(0)
False
>>> bool(0.0)
False
>>> bool(-0.0)
False
>>> bool(1)
True
>>> bool(555)
True

Pythonis on olemas ternary operator ehk tingimuslauseid on võimalik kirjutada ühele reale.

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
# <value_when_true> if <condition> else <value_when_false>

fruit = 'Melon'
is_melon = True if fruit == 'Melon' else False

vs

fruit = 'Melon'
is_melon = False
if fruit == 'Melon':
    is_melon = True

Lisalugemist:

https://docs.python.org/3/tutorial/controlflow.html#if-statements

https://docs.python.org/3/reference/compound_stmts.html#if

https://docs.python.org/3/reference/expressions.html

https://www.tutorialspoint.com/python/python_if_else.htm

https://google.github.io/styleguide/pyguide.html