Skip to content

Latest commit

 

History

History
293 lines (197 loc) · 15.2 KB

File metadata and controls

293 lines (197 loc) · 15.2 KB

Урок 2. Булева алгебра. Конструкції, що керують потоком.

Булеві змінні

Змінна типу 'bool' може містити тільки два значення: True або False, при чому це не рядки, не числа, а саме поняття істинності та хибності.

Назва "Булеві величини" походять від винахідника математичної логіки ("Буллевої алгебри") - британського математика ХІХ століття - Джорджа Булля.

Булева алгебра (логічні оператори)

Існують наступні логічні оператори:

  • and - та (кон’юнкція)
  • or - або (диз’юнкція)
  • xor - або, що виключається (підключається окремо)
  • not - заперечення. НЕ not означає НЕ, і, якщо поставлене перед типом bool, змінює його значення на зворотне, тобто 'not True' стає 'False', 'not False' стає 'True' Далі приведена таблиця, що демонструє роботу операторів :
Оператори 0 to 0 0 to 1 1 to 0 1 to 1
and 0 0 0 1
or 0 1 1 1
xor 0 1 1 0

Умовний оператор if (оператор розгалудження)

В python до версії 3.10 існував тільки один умовний операторʼ if -> elif -> else. Починаючи з версії мови 3.10 був доданий порівняння шаблонів match/case, який також можн використовувати на схожий манер, але він не є предметом розгляду даного уроку. Якщо вам цікаво, як це працює, в кінці уроку є посилання на відповідну статтю.

Приклад оператору розгалудження if:

print ("Give it to me!")
number = int(input())

if (number >= 100):
    print ("Thanks, man!")
elif ((number > 10) and (number < 100)):
    print ("OK :(")
else:
    print ("WHAAAAT????")

if (number > 1000):
    print ("!!!!WOOOOWWWW!!!")

Операторний блок

Зверніть увагу, ми вперше стикаємося з блоком операторів. Так само працюють і цикли, і функції, і класи зі своїми методами.

Блок операторів починається зі свого оператора (наприклад, зараз це блок оператора if), після оператора йде двокрапка, потім усі дії, які програміст хоче виконати в рамках цього блоку.

Всі дії потрібно писати з додатковим відступом у чотири пробіли (так, саме чотири пробіли, а не одну табуляцію - це важливо). Якщо відступа не буде, python буде сприймати це як код поза блоком.

Варіанти if-ів

Є можливість використовувати оператор if в декількох варіантах. Нижче наведено список усіх варіантів:

  • if (умова) дія
  • if (умова) (блок дій у кілька рядків)
  • if (умова) (блок дій у декілька рядків) else дія
  • if (умова) (блок дій у кілька рядків) else (блок дій у кілька рядків)
  • if (умова) (блок дій у кілька рядків) elif (умова) (блок дій у декілька рядків) else дію
  • if (умова) (блок дій у кілька рядків) elif (умова) (блок дій у декілька рядків) else (блок дій у декілька рядків)

Між if та else може бути скільки завгодно elif.

Оператори порівняння та пріоритети операцій

Оператори Опис
() дужки
** зведення в степінь
+x, -x, ~x унарні плюс, мінус й бітове заперечення
*, /, //, % множення, поділ, цілочисельний поділ, залишок від поділу
+, - додавання та віднімання
<<, >> бітові зрушення
& бітове та
^ бітове виключаюче або (XOR)
| бітове або
==, !=, >, >=, <, <=, is, is not, in, not in всі порівняння
not логічне не
and логічне та
or логічне або

До операторів порівняння відносяться наступні:

Оператори порівняння Опис
"<" менше
">" більше
"==" дорівнює
">=" більше або дорівнює
"<=" менше або дорівнює
"!=" не дорівнює
"not" не є чимось
"is" є тим самим
"is not" не є тим самим
"in" є частиною чогось
"not in" не є частиною чогось

Останні чотири оператори потребують додаткового пояснення.

Оператор is перевіряє, чи є обидва операнди одним і тим самим об'єктом у пам'яті, тоді як просте порівняння на рівність == перевіряє тільки на відповідність вмісту двох операндів, але не перевіряє, чи є вони тим самим об'єктом.

>>> l1 = [1, 2, 3]
>>> l2 = [1, 2, 3]
>>> l1 == l2
True
>>> l1 is l2
False
>>> l1 is not l2
True

Оператор in перевіряє, чи операнд зліва є частиною операнду справа:

>>> l1 = [1, 2, 3]
>>> 3 in l1
True
>>> 4 in l1
False
>>> 5 not in l1
True

На відміну від мови С, в Python оператори порівняння мають однаковий пріоритет. Результатом порівняння є відповідь типу bool - True або False. Python пропонує використовувати ланцюги операторів порівняння, тобто класичне для програмування подвійне порівняння може бути замінено ланцюгом:

>>> x = 5
>>> y = 10
>>> z = 15

>>> (x < y) and (y <= z)
True

>>> x < y <= z
True

Допоміжні функції all, any

Функція all() повертає True, якщо істинні всі перелічені в списку умови.

data = [True, True, True, True]
result = all(data)
print(result)  # Output: True

Функція any() повертає True, якщо хоча б один елемент списку дорівнює True.

data = [False, False, True, False]
result = any(data)
print(result)  # Output: True

Альтернативний синтаксис if, заміна тернарному оператору

У багатьох мовах програмування (С++, Java, PHP...) існує тернарний оператор, тобто спеціальний оператор умов, який повертає один із двох результатів, залежно від того, виконується його умова чи ні. Виглядає він так:

print ($input == 1) ? "One!" : "Not One!";

Тернарні оператори часто застосовуються, коли варіантів дій всього два і кожен вимагає виконання лише однієї команди, бо такий запис коротше аналогічного з if. Однак, на жаль, можна зустріти зв'язок if-ів й тернарних операторів, який є важким для розуміння. Інакше кажучи, надмірне застосування цієї конструкції може стати причиною погіршення розуміння коду.

У python немає окремого тернарного оператора, але, починаючи з версії мови 3.6 є можливість його імітувати за допомогою if:

test = True
result = 'Test is True' if test else 'Test is False'
# result = 'Test is True'

Це можна використовувати з будь-якими функціями. Як-от із друком:

test = True
print ('ttt' if test else 'fff') # виведе ttt

Слід зазначити, що подібна синтаксична конструкція зазвичай використовується лише при повному розгалудженні і блок команд після else є обов'язковим. Тому, у випадку застосування подібного оператора для неповного розгалудження, у одній з гілок варто використовувати команду-заглушку pass.

test = True
result = 'Test is True' if test else pass
# result = 'Test is True'

Особливості порівняння об'єктів

У мові Python все є об'єктом. Коли ми говоримо про число, рядки, функції, класи, список і т.д. - ми говоримо про об'єкти. Python вважає, що якщо об'єкт не пустий, він True, а не False. False - це власне сам False, 0 і пустий рядок. Таким чином, якщо нам необхідно порівняти рядок з пустим рядком, або число з нулем, а також дізнатися, чи є пустим той, чи інший об’єкт, замість того, щоб написати умови в стилі старих мов:

if s !='':
    pass

if bool('value'):
    pass
    
if 8 % 2 != 0:
    pass

Часто, використання надмірної кількості таких порівнянь призводить до уповільнення виконання вашого коду. Але у таких випадках ми очікуємо лише один результат - 'True' або 'False'. Тому нема жодного сенсу робити повне порівняння, якщо ми можемо передати змінну напряму і умовний оператор сам визначить значення змінної:

if s:
    pass
    
if 8 % 2:
    pass

Це значно скорочує і спрощує код.

Ще одна альтернатива тернарному оператору

Застосування and до кількох виразів не просто повертає True або False. Воно повертає перший False вираз, або останній з виразів, якщо всі вони True.

Аналогічно, операція or повертає перше істинне значення, або останнє, якщо жодне з них не True.

Використовуючи цю особливість python, тернарний оператор можна реалізувати ще більш оригінальним способом:

test = True
result = test and 'Test is True' or 'Test is False'

В нашому випадку test = True, and його пропускає і повертає нам останнє істинне значення, з яким працював, тобто вираз «Test is True' or 'Test is False». Or повертає перший зустрічний True вираз, йому більше нічого не цікаво. Якщо замінити рядки наближеним змістом і використати псевдокод, отримаємо:

result = true1 and true2 or true3
result = true2 or true3
result = true2

Практика

  1. Перевірити, чи є введене число парним.
  2. Перевірити, чи є число не парним, ділиться чи на три і на п'ять одночасно, але так, щоб не ділитися на 10.
  3. Ввести число, вивести усі його дільники.
  4. Ввести число, вивести його розряди та їх множники.

Корисні посилання

Пріоритети операцій в Python

Match/case на Хабрі

Чейнінг операторів порівнянь

Домашнє завдання №2

Перший рівень ("if"): Набрати всі приклади посимвольно і змусити їх працювати, розібратися у роботі.

Другий рівень ("if-elif-else"): Придумати власні приклади на альтернативні варіанти if і активне використання булевої алгебри.

Третій рівень ("Містер Буль. Джордж Буль!"):

Розвʼязати задачу:

Задача fizz-buzz:

Ви маєте три числа, вони вводяться з консолі. Перше число називається fizz, друге називається buzz. До третього необхідно дорахувати від одиниці. Дивлячись на поточне число, якщо воно кратне fizz – треба виводити F замість числа. Якщо число кратне buzz – треба виводити B замість числа. Якщо число кратне і fizz, і buzz, треба виводити FB. Якщо воно не кратне нічому, виводимо число. І так - поки не буде досягнуто третього введеного числа.

Приклад умови та результату: Введено числа 2, 5, 18 Висновок має бути таким:

1 F 3 F B F 7 F 9 FB 11 F 13 F B F 17 F