Učíme sa Python – časť 3. (logické operátory)

0

Logické operátory

V tejto časti sa pozrieme na logické operátory. Pozrime sa najprv na nejaký kód:

def jeDelitelneDvomiAleboTromi(cislo):
    if cislo % 2 == 0:
        return True    
    elif cislo % 3 == 0:
        return True
    else:
        return False

V kóde máme funkciu, ktorá ako vstup (parameter) berie jedno číslo. Už podľa názvu vieme povedať, čo táto funkcia asi robí. Zistí, či je číslo deliteľné dvomi alebo tromi. Ak je číslo deliteľné dvomi alebo tromi, tak funkcia vráti True, v opačnom prípade vráti False.

Pozn. to, či je číslo deliteľné, vieme overiť pomocou operátora ‚%‘ tzv. modulo, alebo zvyšok po delení. Operátor je popísaný na konci 1. časti.

Funkcia sa najprv pozrie, či je číslo deliteľné dvomi. Ak áno, tak vráti True a funkcia končí. Ak nie, tak funkcia pokračuje výrazom elif a kontroluje, či je číslo deliteľné tromi. Ak áno, tak vráti True a funkcia končí. Ak nie, tak funkcia pokračuje na výraz else a tam jednoducho vráti False.

Môžeme si však všimnúť, že v našom kóde sa nachádza tzv. duplikácia. Niečo sa nám tam opakuje a to konkrétne return True. Duplikácia pri programovaní väčšinou nie je žiadaná a tak sa poďme pozrieť, ako ju môžeme v tomto prípade odstrániť.

or

Ak prídeme pri programovaní do bodu, že chceme aby sa niečo vykonalo, ak platí jedna podmienka, ALEBO ak platí druhá podmienka, tak nemusíme vytvárať duplikáciu, ako tomu bolo vyššie. Stačí využiť OR operátor. V pythone je pre tento operátor vyhradené kľúčové slovo or (musí byť písané malými písmenami).

Pozn. väčšina jazykov používa ako OR operátor dve „pipy“ ||

def jeDelitelneDvomiAleboTromi(cislo): 
    if cislo % 2 == 0 or cislo % 3 == 0: 
        return True 

    return False

Výstup tejto funkcie je rovnaký ako výstup z funkcie vyššie. Super je, že sme všetko napísali pekne do jedného riadku a return True sme nemuseli písať dva krát.  Najprv si funkcia skontroluje, či je číslo deliteľné dvojkou. Ak je deliteľné dvojkou, tak rovno ide na return True. Ak však dvojkou deliteľné nie je, tak sa vyhodnocuje deliteľnosť trojkou. Stačí aby jeden z týchto výrokov platil a funkcia nám vráti True. To je podstata operátora or – Stačí aby jeden výrok platil.

AND

AND je druhý logický operátor dostupný pre programátorov. AND využívame vtedy, ak chceme, aby sa niečo stalo ak platia dve (alebo aj viac) podmienky naraz. Vytvorme si novú funkciu, ktorá bude zistovať, či je číslo deliteľne dvojkou A trojkou (pozor na to, medzi A a ALEBO je veľký rozdiel).

def jeDelitelneDvomiATromi(cislo): 
    if cislo % 2 == 0 and cislo % 3 == 0: 
        return True 

    return False

Táto funkcia vráti True iba v prípade, že číslo je deliteľné dvojkou A trojkou. Pre číslo 3 vráti False, pre číslo 4 vráti tiež False, ale pre číslo 6 vráti True, pretože je to deliteľné dvojkou A trojkou. Pre and operátor platí, že musia platiť všetky výroky.

Skúsme si spraviť  tzv. pravdivostnú tabuľku pre tieto výroky:

Pravdivostná tabuľka

Ľavá tabuľka je pre operáciu OR (jeDelitelneDvomiAleboTromi) a pravá pre operáciu AND (jeDelitelneDvomiATromi). Prvý stĺpec sú čísla, ktoré vstupujú do funkcie. Druhý stĺpec je výsledok deliteľnosti dvojkou, tretí stĺpec je výsledok deliteľnosti trojkou a posledný stĺpec je výsledok po aplikovaní operácie OR resp. AND. Tu je podľa mňa pekne vidieť rozdiel medzi týmito dvomi operáciami.

Pozn. existuje ešte jeden logický operátor, ktorý si však predstavíme v ďalšej časti a to je operátor NOT – negácia.

Na precvičenie

Skúsme vytvoriť funkciu, ktorá zistí, či číslo, ktoré do nej posielam, je medzi čísalmi 5 a 9. Tu si je potrebné uvedomiť, čo to vlastne znamená, že číslo je medzi dvomi číslami. Znamená to, že číslo musí byť väčšie ako spodná hranica rozsahu A zároveň menšie ako horná hranica rozsahu. V kóde by to vyzeralo nejako takto:

def jeMedzi5a9(cislo): 
    if cislo > 5 and cislo < 9: 
        return True 

    return False

Tu už mi to nedá nespomenút ešte jeden zkrášlovák. Do if výrazu sa vkladajú podmienky, ktoré sa na pozadí vyhodnotia ako True alebo False. Keď počítač príde na výraz cislo > 5, tak za cislo si dosadí hodnotu parametra cislo a vyhodnotí operátor >. Vyhodnotí znamená, že ho v podstate nahradí za True alebo False. Ak do funkcie pošleme číslo 6, tak počítač výraz prečíta ako True and True. Týmto všetkým sa snažím dostať k tomu, že funkciu vieme napísať aj nasledovným spôsobom:

def jeMedzi5a9(cislo): 
    return cislo > 5 and cislo < 9: 

Celý if môžeme z funkcie vyhodiť a vrátiť rovno výsledok logického výroku cislo > 5 and cislo < 9. V programovaní sa toto často využíva, avšak niekedy to vie byť aj mätúce.

Na precvičenie 2

Aby sme si zopakovali, čo sú parametre funkcie a ako fungujú, vyskúšajme predošlú funkciu prepísať tak, aby vedela zistiť, či číslo je medzi dvomi číslami, ktoré funkcii pošleme ako parametre. To znamená, či je číslo v rozsahu od – do. Keď si uvedomíme, že v predošlej funkcii, bolo naše minimum číslo 5 a maximum číslo 10, tak by táto funkcia nemala byť žiadny problém.

def jeVRozsahu(cislo, minimum, maximum): 
    return cislo > minimum and cislo < maximum

Aby som demonštroval, ako fungujú parametre funkcie, tak k tejto funkcii napíšem aj program:

def jeVRozsahu(cislo, minimum, maximum): 
    return cislo > minimum and cislo < maximum
mojeCislo = 100
mojeMinimum = 5
mojeMaximum = 5000

print(jeVRozsahu(mojeCislo, mojeMinimum, mojeMaximum))

Všimol som si, že začínajúci programátori majú problém s tým, že parametre funkcie sú dostupné iba vnútri tej funkcie. V tomto programe máme 3 premenné, ktoré sú dostupné pre celý program: mojeCislo, mojeMinimum, mojeMaximum. Zároveň však máme tri parametre funkcie, ktoré sú dostupné iba v rámci našej funkcie a to: cislo, minimum, maximum. Ak by som sa vo funkcii pokúšal použiť premennú mojeCislo, tak je vsetko v poriadku (nie je to best practice, ale program bude fungovať). Ak by som ale mimo funkcie (napr. na riadku 9) chcel použiť premennú cislo, tak mi python vynadá, že takú premennú nepozná.


Pridaj komentár

Vaša e-mailová adresa nebude zverejnená.