9: Loginiai veiksmai

Šioje pamokoje išmoksime sudėtingų sąlygų tikrinimą aprašyti kuo trumpiau/patogiau, tam Python'e naudojama:

  • else reiškia „kitu atveju“ ir nurodo, ką daryti, jei „if“ esanti sąlyga netenkinama.
  • loginiai jungtukai „ir“ (test1 and test2) bei „arba“ (test1 or test2) leidžia sujungti dvi (ar kelias) sąlygas.
  • neigimas -- not test1 -- irgi praverčia :)

else

Programuojant dažnai pasitaiko užduotys, kuriose reikia skirtingai elgtis, priklausomai nuo to ar sąlyga tenkinama (True), ar ne (False). 6 temos užduotis prašė atspausdinti vienokį tekstą, jei amžius (age) yra mažesnis už 0, ir kitokį - jeigu amžius yra ne mažesnis už 0; maždaug taip:

if age >= 0:  
  print('Tu jau esi gimęs!')
if age < 0:
  print('Dar negimei, arba tu - keliautojas laiku!')
Tą galima užrašyti truputį patogiau/trumpiau, naudojant  else.

Pavyzdys
Žemiau galima įvesti duomenis programai (angl. "input")

Apibendrintas else naudojimo atvejis:

if «sąlyga»:
   «veiksmai, kai True»        # atitrauktas blokas
else:
   «veiksmai, kai False»       # kitas atitrauktas blokas

else filosofija

else  leidžia mums  lengviau užrašyti bei perskaityti programą. Palyginkime:

A variantas
if age < 18:
   print('Dar negali laikyti teisių')
else:
   print('Eime pavairuoti!')
B variantas
if age < 18:
   print('Dar negali laikyti teisių')
if age >= 18:
  print('Eime pavairuoti!')

Abu daro tą patį, tačiau dauguma programuotojų sutaria, kad A variantas yra geresnis. Jame lengviau keisti kintamąjį (nes jis naudojamas tik vienoje sąlygoje), o užrašymą galima greičiau perskaityti.

Programavimo pratimas: Skaičiaus modulis
Skaičiaus modulis yra jo reikšmė be ženklo. Jei x teigiamas (arba 0), jo modulis yra x. Kai x neigiamas, jo modulis yra -x (nes papildomas minusas panaikina turimą minusą). Pvz., 5 modulis yra 5, o -10 modulis yra 10.
Naudodami  if ir else, parašykite programą, kuri nuskaito įvestą sveiką skaičių ir atspausdina jo modulį.
Žemiau galima įvesti duomenis programai (angl. "input")

Python turi standartinę funkciją  abs(x)  (reiškia „absoliuti reikšmė“ - be ženklo), kuri apskaičiuoja skaičiaus modulį. Dabar vertinimo sistema neleis naudoti šios funkcijos, tačiau drąsiai naudokite ją vėliau.

elif

Python turi dar vieną if „draugą“ - elif. Jis leidžia tikrinti kelias sąlygas iš eilės, kol ras (prieis) tenkinamą sąlygą. Paprastas pvz.:

if «test1»:
   «actions1»        # vykdys, jei test1 bus True
elif «test2»:
   «actions2»        # vykdys, jei test1 bus False, o test2 - True
Turbūt atspėjote, jog elif yra "else if" trumpinys. Jį naudot patogiau negu "else if" kombinaciją, nes reikia mažiau rašymo ir atitraukimų. Dar šauniau yra tai, kad galime naudoti bet kokį skaičių elif sąlygų iš eilės, ir net pridėti else atvejį gale. Pvz.:

if «test1»:
   «actions1»      # vykdys, kai test1 yra True
elif «test2»:
   «actions2»      # vykdys, kai test1 yra False, o test2 - True
elif «test3»:
   «actions3»      # vykdys, kai test1 ir test2 yra False, o test3 - True
else:           
   «actions4»     # vykdys kitais atvejais (kai visi testai buvo False)
 

Štai pavyzdys, kaip ciklo viduje atrodo elif sąlyga. Ar galite atspėti, ką atspausdins?

Programavimo pratimas: First, Second, Third
Anglų kalboje kelintiniai skaitvardžiai trumpinami taip: 1st, 2nd, 3rd, 4th, 5th, 6th, 7th, 8th, 9th. Parašykite programą, kuri nuskaito sveiką skaičių x (tarp 1 ir 9) ir parašo atitinkamą anglišką skaitvardžio trumpinį - prideda galūnę.
PS: nereikia aprašyti 9 skirtingų atvejų -- užtenka 4 (su 3 sąlygom ir „else“) .
Žemiau galima įvesti duomenis programai (angl. "input")

Loginiai veiksmai: and, or, not

Veiksmai "and", "or" bei "not" reiškia tą patį, kaip ir anglų kalboje:

  • A and B  bus teisinga jei abi sąlygos -- A ir B -- yra teisingos. O klaidingas - jei bent viena iš sąlygų yra False.
    Pvz.: Jei  "yra vasara" ir "aš esu pajūry",  tai "pasimaudysiu jūroj" (reikia abiejų sąlygų).
  • A or B bus teisinga jei bent viena sąlyga -- A arba B -- yra teisinga.  O klaidingas - jei abi sąlygos yra False.
    Pvz.: Jei "dega lempa" arba "dabar diena", tai "yra šviesu" (užtenka  bent vienos sąlygos).
  • not A yra teisinga (True), kai  A -- False (ir atvirkščiai).
    Pvz.: Jei ne "šiandien", tai "rytoj" :)

Štai programa, kurioje pademonstruoti visi galimi reikšmių atvejai - ją įvykdę, pamatysite taip vadinamą teisingumo lentelę:

Pavyzdys
Truth tables

Štai pavyzdys, kuriame naudojant and, yra patikrinama, ar skaičius gali būti raidės numeris abėcėlėje ir jis paverčiamas atitinkama raide (pagal 7a pamoką - ord(..) grąžina raidės numerį kodų lentelėje, o chr(..) - raidę pagal jos kodą).

Pavyzdys
Patekimo į intervalą patikrinimas ir skaičiaus pavertimas raide:  1->A, 2->B, t.t.
Žemiau galima įvesti duomenis programai (angl. "input")

Programavimo pratimas: 26 raidės
Parašykite programą, kuri elgiasi atvirkčiai negu pavyzdyje: paima raidę ir grąžina jos numerį anglų kalbos abėcėlėje tarp 1 ir 26. Programa turi priimti tik didžiasias raides. Jei paduodama raidė nera didžioji, atspausdinkite invalid. Užuomina raidėms lyginti bei jos alternatyva.
Žemiau galima įvesti duomenis programai (angl. "input")

Pasirinkimo užduotis: De Morgano dėsnis
Kuri išraiška atitinka A or B? Kaip ir aritmetikoje, taip ir logikoje -- skirtingos išraiškos gali reikšti tą patį -- turėti tą pačią reikšmių lentelę.
Correct! Here is one way to arrive at this answer. First, not (A or B) is only true when both A and B are false. Also, note that (not A) and (not B) is only true if both not A and not B are true, i.e. if both A and B are false. So we have the following equality:
(not A) and (not B) = not (A or B)
Put a not around both sides, so we deduce
not ((not A) and (not B)) = not (not (A or B))
and observe that not(not X)) always equals X, so
not ((not A) and (not B)) = not (not (A or B)) = A or B
This way of rewriting a boolean expression is one of De Morgan's laws.

Operacijų tvarka

Loginiai veiksmai turi tą pačia operacijų tvarką kaip ir matematikoje. Tvarka yra    NAO: 1) not , 2) and, 3) or
Tai atitinka aritmetinius veiksmus ir jų eiliškumą: 1) neigimas (minusas), 2) daugyba, 3) sudėtis

Pavyzdžiui,
not x or y and z reiškia (not x) or (y and z)

analogiškai matematikoje
- x + y * z reiškia (-x) + (y*z)

Pamoką užbaigsime trumpu klausimu.

Pasirinkimo užduotis: Veiksmų seka
Kokia yra

A or not B and C
reikšmė?
kai (A, B, C) = (False, True, True)? Hint
Correct! The order of operations makes this equivalent to
A or ((not B) and C)
substituting the values, we have
False or ((not True) and True)
and now simplifying one step at a time gives
False or ((not True) and True)
= False or (False and True)
= False or False
= False
.